邮件(带附件,模拟文件上传,跨服务器)发送核心代码
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. LlamaIndex 是什么

    LlamaIndex 是一个基于 LLM(大语言模型)的应用程序数据框架,适用于受益于上下文增强的场景. 这类 LLM 系统被称为 RAG(检索增强生成)系统. LlamaIndex 提供了必要的抽象 ...

  2. [Mobi] Android Studio arm 模拟器

    从右下角 Configure 打开 AVD Manager. 点击 "Create New Device" 来创建新设备  选择TV   接着Next,然后用 Other Imag ...

  3. UOS 开启 VisualStudio 远程调试 .NET 应用之旅

    本文记录的是在 Windows 系统里面,使用 VisualStudio 2022 远程调试运行在 UOS 里面 dotnet 应用的配置方法 本文写于 2024.03.19 如果你阅读本文的时间距离 ...

  4. Solution Set - 数学相关

    CF645F Link&Submission. 利用 \(\sum\limits_{d|n}\varphi(\frac{n}{d})=n\),只要对每个数 \(x\),求出 \(cnt_x\) ...

  5. ansible(18)--ansible的selinux模块

    1. selinux模块 功能:管理远端主机的 SELINUX 防火墙: 主要参数如下: 参数 说明 state Selinux模式:enforcing.permissive.disabled pol ...

  6. Django国际化与本地化指南

    title: Django国际化与本地化指南 date: 2024/5/12 16:51:04 updated: 2024/5/12 16:51:04 categories: 后端开发 tags: D ...

  7. 80x86汇编—寻址方式

    文章目录 术语解释 8086寻址方式 直数寻址 寄存器间接寻址 寄存器相对寻址 基址变址寻址 比例变址寻址方式 基址比例变址寻址方式 术语解释 EA:有效地址,通过段地址:偏移地址组合得到的Effec ...

  8. .NET8 Identity Register

    分享给需要帮助的人:记一次 IdentityAPI 中注册的源码解读:设置用户账户为未验证状态,以及除此之外更安全的做法: 延迟用户创建.包含了对优缺点的说明,以及适用场景. 在ASP.NET 8 I ...

  9. 面试题--mysql的数据库优化

    mysql的数据库优化 当有人问你如何对数据库进行优化时,很多人第一反应想到的就是 SQL 优化,如何创建索引,如何改写 SQL,他们把数据库优化与 SQL 优化划上了等号. 当然这不能算是完全错误的 ...

  10. FMEA学习之PFMEA

    一.基础介绍 FMEA 是 Faliure Mode Effect Analysis 简称,翻译过来叫做失效模式分析,按我的理解,用白话说出来就是:对导致不符合生产质量不符合客户要求的问题会产生多么严 ...