热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

邮件(带附件,模拟文件上传,跨服务器)发送核心代码

邮件(带附件,模拟文件上传,跨服务器)发送核心代码1.测试邮件发送附件接口***测试邮件发送附件*@parammultipartFile*@return*@RequestMappi

邮件(带附件,模拟文件上传,跨服务器)发送核心代码
1.测试邮件发送附件接口

/**
* 测试邮件发送附件
*
@param multipartFile
*
@return
*/
@RequestMapping(
"/upload")
public String uploadFile(@RequestParam("uploadFile") MultipartFile multipartFile){
try {
//邮件发送
File file = MultipartFileToFile(multipartFile);
//调用邮件统一接口 发送邮件
//方案1:将file转base64来传输,同时记录文件名称
/**
* FileEntity fe = new FileEntity();
*fe.setFileName(file.getName());
*fe.setFileBase64String(FileUtil.fileToBase64(file));
*
*/
//方案2: 将文件上传到临时存放点,比如:阿里云的OSS服务器,直接通过接口来传输file对象不可以跨服务器,在本机服务器是可以的。

//@Async邮件发送采用异步的方式来发送
//将邮件的内容等json串做md5,可以作为唯一key,避免重复邮件的重复发送
//数据先落库,等异步处理之后,更新唯一key的成功或失败的状态
//邮件公用接口,记录发送的来源方,项目名称,业务线记录等。

return "邮件发送成功";
}
catch (Exception e) {
e.printStackTrace();
return "邮件发送失败";
}
}

2.文件工具类

/**
*MultipartFile 转file工具类
*
*/
public static File MultipartFileToFile(MultipartFile multipartFile) {
File file
= null;
//判断是否为null
if (multipartFile.equals("") || multipartFile.getSize() <= 0) {
return file;
}
//MultipartFile转换为File
InputStream ins = null;
OutputStream os
= null;
try {
ins
= multipartFile.getInputStream();
file
= new File(multipartFile.getOriginalFilename());
os
= new FileOutputStream(file);
int bytesRead = 0;
byte[] buffer = new byte[8192];
while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
os.write(buffer,
0, bytesRead);
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if(os != null){
try {
os.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
if(ins != null){
try {
ins.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
import java.io.*;
import java.util.Base64;
/**
* 文件工具类
*/
public class FileUtil {
/**
* 将文件转base64字符串
*
@param path
*
@return
*/
public static String fileToBase64(String path) {
String base64
= null;
InputStream in
= null;
try {
File file
= new File(path);
in
= new FileInputStream(file);
byte[] bytes=new byte[(int)file.length()];
in.read(bytes);
base64
= Base64.getEncoder().encodeToString(bytes);
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (in != null) {
try {
in.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
return base64;
}
/**
* 将文件转base64字符串
*
@param file
*
@return
*/
public static String fileToBase64(File file) {
if(file == null){
return null;
}
String base64
= null;
InputStream in
= null;
try {
// File file = new File(path);
in = new FileInputStream(file);
byte[] bytes=new byte[(int)file.length()];
in.read(bytes);
base64
= Base64.getEncoder().encodeToString(bytes);
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (in != null) {
try {
in.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
return base64;
}
/**
* BASE64解码成File文件
*
@param destPath
*
@param base64
*
@param fileName
*/
public static File base64ToFile(String destPath,String base64, String fileName) {
File file
= null;
//创建文件目录
String filePath=destPath;
File dir
=new File(filePath);
if (!dir.exists() && !dir.isDirectory()) {
dir.mkdirs();
}
BufferedOutputStream bos
= null;
java.io.FileOutputStream fos
= null;
try {
byte[] bytes = Base64.getDecoder().decode(base64);
file
=new File(filePath+"/"+fileName);
fos
= new java.io.FileOutputStream(file);
bos
= new BufferedOutputStream(fos);
bos.write(bytes);
}
catch (Exception e) {
e.printStackTrace();
}
finally {
if (bos != null) {
try {
bos.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
return file;
}
}

3.实体类

//FileEntity对象
public class FileEntity {
private String fileBase64String;
private String fileName;
public String getFileBase64String() {
return fileBase64String;
}
public void setFileBase64String(String fileBase64String) {
this.fileBase64String = fileBase64String;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
}

4.邮件发送service类

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
//邮件发送带附件的工具类
@Service
public class EmailMultiService {
private static Logger logger = LoggerFactory.getLogger(EmailMultiService.class);
public static MailAuthenticator authenticator;
private MimeMessage message;
private Session session;
private Transport transport;
private Properties properties = new Properties();
//apollo配置
@Value("${apollo.server.host}")
private String mailHost = null;
@Value(
"${apollo.from.addr}")
private String sender_username = null;
@Value(
"${apollo.email.password}")
private String sender_password = null;
/**
* 构造方法
*/
public EmailMultiService() {
super();
}
/**
* 主方法
*/
public String sendEmail(String[] receivers,String[] receiversCC,String title, String content,List fileList,String md5) {
try {
// 初始化smtp发送邮件所需参数
initSmtpParams();
// 发送邮件
doSendHtmlEmail(receivers, receiversCC, title, content, fileList,md5);
}
catch (Exception e) {
logger.error(
"sendEmail multi异常:",e);
return "";
}
return "success";
}
/**
* 初始化smtp发送邮件所需参数
*/
private boolean initSmtpParams() {
properties.put(
"mail.smtp.host", mailHost);// mail.envisioncitrix.com
properties.put("mail.smtp.auth", "true");
properties.put(
"mail.transport.protocol", "smtp");
//端口 重要,默认是25端口
properties.put("mail.smtp.port", "465");
properties.put(
"mail.smtp.starttls.enable", "true");
properties.put(
"mail.smtp.ssl.checkserveridentity", "false");
properties.put(
"mail.smtp.ssl.trust", mailHost);
//重要
properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
authenticator
= new MailAuthenticator(sender_username, sender_password);
session
= Session.getInstance(properties, authenticator);
session.setDebug(
false);// 开启后有调试信息
message = new MimeMessage(session);
return true;
}
/**
* 发送邮件
*/
private boolean doSendHtmlEmail(String[] toEmial,String[] toCcEmial,String title, String htmlContent, List fileList,String md5) {
try {
// 发件人
InternetAddress from = new InternetAddress(sender_username);
message.setFrom(from);
// 收件人(多个) 数组方式
for (String sendTo : toEmial) {
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(sendTo));
}
// 设置抄送:抄送地址必须满足标准email地址格式,否则报错
//可选
if(toCcEmial != null && toCcEmial.length > 0) {
for (String copy : toCcEmial) {
message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(copy));
}
}
// 邮件主题
message.setSubject(title);
// 添加邮件的各个部分内容,包括文本内容和附件
Multipart multipart = new MimeMultipart();
// 添加邮件正文
BodyPart cOntentPart= new MimeBodyPart();
contentPart.setContent(htmlContent,
"text/html;charset=UTF-8");
multipart.addBodyPart(contentPart);
// 遍历添加附件
if (fileList != null && fileList.size() > 0) {
//转换文件操作
List files = new ArrayList<>();
//按上传日期来上传目录 文件路径
Long today = Long.parseLong(DateFormatUtils.format(new Date(), "yyyyMMdd").trim());
String destPath
= "/usr/local/email/"+ String.valueOf(today) +"/" + md5 + "/";
for (FileEntity fileEntity : fileList) {
File f
= FileUtil.base64ToFile(destPath,fileEntity.getFileBase64String(),fileEntity.getFileName());
files.add(f);
}
//封装成附件的方式
for (File file : files) {
if(file != null) {
BodyPart attachmentBodyPart
= new MimeBodyPart();
DataSource source
= new FileDataSource(file);
attachmentBodyPart.setDataHandler(
new DataHandler(source));
attachmentBodyPart.setFileName(file.getName());
multipart.addBodyPart(attachmentBodyPart);
}
}
}
// 将多媒体对象放到message中
message.setContent(multipart);
// 保存邮件
message.saveChanges();
// SMTP验证,就是你用来发邮件的邮箱用户名密码
transport = session.getTransport("smtp");
transport.connect(mailHost, sender_username, sender_password);
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
logger.info(title
+ " Email send success!");
}
catch (Exception e) {
logger.error(
"发送附件邮件异常:",e);
}
finally {
if (transport != null) {
try {
transport.close();
}
catch (MessagingException e) {
logger.error(
"finally发送附件邮件异常:",e);
}
}
}
return true;
}
}
//普通邮件发送,不带附件的方式
public String sendEmail(String[] toEmial, String[] toCcEmial, String subject, String content) {
try {
HtmlEmail simpleEmail
= new HtmlEmail();
simpleEmail.setHostName(mailHost);
simpleEmail.setAuthentication(sender_username, sender_password);
simpleEmail.setFrom(sender_username, sender_username);
simpleEmail.addTo(toEmial);
if (toCcEmial != null) {
simpleEmail.addCc(toCcEmial);
}
simpleEmail.setSubject(subject);
simpleEmail.setMsg(content);
//add
simpleEmail.setSSLOnConnect(true);
simpleEmail.setCharset(StandardCharsets.UTF_8.name());
return simpleEmail.send();
}
catch (Exception e) {
logger.error(
"发送邮件02异常:", e);
}
return null;
}

 



推荐阅读
  • 如何配置Unturned服务器及其消息设置
    本文详细介绍了Unturned服务器的配置方法和消息设置技巧,帮助用户了解并优化服务器管理。同时,提供了关于云服务资源操作记录、远程登录设置以及文件传输的相关补充信息。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 本文介绍了如何使用PHP代码实现微信平台的媒体素材上传功能,详细解释了API接口的使用方法和注意事项,确保文件路径正确以避免常见的错误。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • PostgreSQL 10 离线安装指南
    本文详细介绍了如何在无法联网的服务器上进行 PostgreSQL 10 的离线安装,并涵盖了从下载安装包到配置远程访问的完整步骤。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 网络攻防实战:从HTTP到HTTPS的演变
    本文通过一系列日记记录了从发现漏洞到逐步加强安全措施的过程,探讨了如何应对网络攻击并最终实现全面的安全防护。 ... [详细]
  • 解读MySQL查询执行计划的详细指南
    本文旨在帮助开发者和数据库管理员深入了解如何解读MySQL查询执行计划。通过详细的解析,您将掌握优化查询性能的关键技巧,了解各种访问类型和额外信息的含义。 ... [详细]
  • 本文详细分析了Hive在启动过程中遇到的权限拒绝错误,并提供了多种解决方案,包括调整文件权限、用户组设置以及环境变量配置等。 ... [详细]
  • 在现代网络环境中,两台计算机之间的文件传输需求日益增长。传统的FTP和SSH方式虽然有效,但其配置复杂、步骤繁琐,难以满足快速且安全的传输需求。本文将介绍一种基于Go语言开发的新一代文件传输工具——Croc,它不仅简化了操作流程,还提供了强大的加密和跨平台支持。 ... [详细]
  • 本文介绍如何使用PyCharm专业版通过SFTP上传项目文件至云服务器。首先,确保你使用的是PyCharm专业版,因为社区版不支持此功能。接下来,我们将在云服务器上创建一个专门的目录用于存放项目文件,并详细介绍每一步配置过程。 ... [详细]
  • 在Python开发过程中,随着项目数量的增加,不同项目依赖于不同版本的库,容易引发依赖冲突。为了避免这些问题,并保持开发环境的整洁,可以使用Virtualenv和Virtualenvwrapper来创建和管理多个隔离的Python虚拟环境。 ... [详细]
  • 创建项目:Visual Studio Online 入门指南
    本文介绍如何使用微软的 Visual Studio Online(VSO)创建和管理开发项目。作为一款基于云计算的开发平台,VSO 提供了丰富的工具和服务,简化了项目的配置和部署流程。 ... [详细]
author-avatar
平头
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有