邮件(带附件,模拟文件上传,跨服务器)发送核心代码
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<FileEntity> 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端口  Couldn't connect to host, port: smtp.163.com, 25; timeout -1;
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<FileEntity> 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));
//}

       InternetAddress[] address = new InternetAddress[toEmial.length];
for (int i = 0; i < toEmial.length; i++) {
String sendTo = toEmial[i];
InternetAddress addr = new InternetAddress(sendTo);
address[i] = addr;
}
            message.setRecipients(Message.RecipientType.TO, address);

// 设置抄送:抄送地址必须满足标准email地址格式,否则报错
//可选
if(toCcEmial != null && toCcEmial.length > 0) {
//for (String copy : toCcEmial) {
// message.setRecipients(Message.RecipientType.CC, InternetAddress.parse(copy));
//}
          InternetAddress[] addressCC = new InternetAddress[toCcEmial.length];
for (int i = 0; i < toCcEmial.length; i++) {
String sendTo = toCcEmial[i];
InternetAddress addr = new InternetAddress(sendTo);
addressCC[i] = addr;
}

            message.setRecipients(Message.RecipientType.CC, addressCC);

            }

            // 邮件主题
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<File> 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("发送邮件异常:", e);
}
return null;
}

email邮件(带附件,模拟文件上传,跨服务器)发送核心代码 Couldn't connect to host, port: smtp.163.com, 25; timeout -1;的更多相关文章

  1. Fiddler2 模拟文件上传

    最近遇到一个需求,需要上传音频文件, 服务端使用webService 通过spring3 进行文件上传.代码完成后使用 html 通过post 方式请求接口成功了,但不知道如何使用Fiddler2工具 ...

  2. Silverlight 2中实现文件上传和电子邮件发送

    Silverlight 2中实现文件上传和电子邮件发送 [收藏此页] [打印]   作者:IT168 TerryLee  2008-05-30 内容导航: 使用Web Service上传文件   [I ...

  3. Linux 文件上传Linux服务器

    进入命令行 在图形化桌面出现之前,与Unix系统进行交互的唯一方式就是借助由shell所提供的文本命令行界面(command line interface,CLI).CLI只能接受文本输入,也只能显示 ...

  4. Java实现文件上传到服务器(FTP方式)

    Java实现文件上传到服务器(FTP方式) 1,jar包:commons-net-3.3.jar 2,实现代码: //FTP传输到数据库服务器 private boolean uploadServer ...

  5. 基于paramiko将文件上传到服务器上

    通过安装使用paramiko模块,将本地文件上传到服务器上 import paramiko import datetime import os hostname = '服务器ip' username ...

  6. ubuntu中将本地文件上传到服务器

    (1)在本地的终端下,而不是在服务器上.在本地的终端上才能将本地的文件拷入服务器. (2) scp -r localfile.txt username@192.168.0.1:/home/userna ...

  7. 一、手把手教你docker搭建fastDFS文件上传下载服务器

    在搭建fastDFS文件上传下载服务器之前,你需要准备的有一个可连接的linux服务器,并且该linux服务器上已经安装了docker,若还有没安装docker的,先百度自行安装docker. 1.执 ...

  8. Vditor文件上传跨域

    Vditor文件上传跨域 官网是发了一次请求,而我这里发了两次请求. 有一个option请求,形成了跨域. 虽然我在后端配置了允许跨域,但事实上,我用JWT的拦截器把文件上传的接口给拦截了. 且走的是 ...

  9. Jmeter之模拟文件上传、下载接口操作

    上周群里有位同学,问我用jmeter怎么上传文件?因好久没用jmeter了,顺便自己也复习下,现整理出来和大家分享 一.准备工作: 上传接口一个(自行开发解决了) 下载接口 ps:没有困难创造困难也要 ...

  10. 一篇文章,学会jmeter模拟文件上传、下载操作

    最近很多同学都在问jmeter上传,下载文件的脚本怎么做? 正巧这阵子忙完有时间,就来“折腾”一番,哈哈 现整理出来和大家分享 到底该怎么做? 一.准备工作: 上传接口一个(自行开发解决了) 下载接口 ...

随机推荐

  1. Higress 基于自定义插件访问 Redis

    简介 基于 wasm 机制,Higress 提供了优秀的可扩展性,用户可以基于 Go/C++/Rust 编写 wasm 插件,自定义请求处理逻辑,满足用户的个性化需求,目前插件已经支持 redis 调 ...

  2. Linux 备忘

    ls 通配符 匹配 ? 一个字符 * >=0个任意字符 [ai] a 或者 i [a-i] a/b/c/d...i [!a] 除了a cat cat -n test #加上行号 cat -b t ...

  3. gorm 如何对字段进行comment注释?

    type User struct { Model Name string `gorm:"type:char(30);comment:'姓名'"` }

  4. web3.js:使用eth包

    原文在这里 简介 web3-eth包提供了一套强大的功能,可以与以太坊区块链和智能合约进行交互.在本教程中,我们将指导您如何使用web3.js版本4的web3-eth包的基础知识.我们将在整个示例中使 ...

  5. C语言:贮油点建设问题(详解题目意思)

    !!!!先看解析,后面附有代码!!!!!!! ,希望大家不懂的能认真看看,这些都是我在写的过程中不能理解,遇到的困难,然后弄懂之后总结出来给大家的,想学的一定要认真看完. 规律是: 贮油点之间相差50 ...

  6. Pageoffice6 实现后台生成单个PDF文档

    在实际项目中经常遇到这样的场景,客户希望后台动态生成PDF文档,目前网上有一些针对此需求的方案,如果您想要了解这些方案的对比,请查看后台生成单个Word文档中的"方案对比". Pa ...

  7. Kubernetes 数据存储:从理论到实践的全面指南

    本文深入解析 Kubernetes (K8S) 数据存储机制,探讨其架构.管理策略及最佳实践.文章详细介绍了 K8S 数据存储的基础.架构组成.存储卷管理技巧,并通过具体案例阐述如何高效.安全地管理数 ...

  8. Pandas学习之路【1】

    安装pandas: pip install pandas pandas读取数据: 数据类型 读取方式 csv, tsv, txt pd.read_csv Excel pd.read_excel mys ...

  9. Android 13 - Media框架(27)- ACodec(五)

    关注公众号免费阅读全文,进入音视频开发技术分享群! 前面几节我们了解了OMXNodeInstance是如何处理setPortMode.allocateBuffer.useBuffer的,这一节我们再回 ...

  10. C# wpf 实现Converter定义与使用

    1.  本身的值0, 如何转换为"男" 或"女"呢,可以定义sexConverter继承自IValueConverter即可,代码如下: [ValueConve ...