package com.base.framework.utils.email;
import com.base.framework.utils.spring.SpringBeanFactory;
import com.base.framework.utils.string.StringUtils;
import com.base.framework.utils.sysconf.SysConfigHelper;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import javax.mail.*;
import javax.mail.internet.*;
import java.io.File;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;
import java.util.Properties;
@Slf4j
public class SendEmailUtil {
/**
* 平台的邮箱
*/
private static String from = "xxxxxxx@163.com";
/**
* 秘钥
*/
private static String secret = "";
static {
//这里是将从数据库拿我们的邮件和密钥配置,我用分号隔开的
SysConfigHelper sysConfigHelper = SpringBeanFactory.getBean(SysConfigHelper.class);
String aliyunAccessKeySecret = sysConfigHelper.getStringValue("email_account_secret");
if (StringUtils.isNotBlank(aliyunAccessKeySecret)){
String[] split = aliyunAccessKeySecret.split(";");
from = split[0];
secret= split[1];
}
}
/**
* 主办
*
*/
private static final String host = "smtp.163.com";
/**
* 发送带有附件电子邮件
*
* @param to 到
* @param fileUrls 文件地址 网络地址
* @param subject 邮件主题
*/
public static boolean sendEmailWithAttachments(String to,String subject,String content, List<String> fileUrls) {
Properties properties = initProperties();
// 获取默认session对象
Session session = getSession(properties);
//临时文件
List<File> tempFiles = new ArrayList<>();
try{
// 创建默认的 MimeMessage 对象
MimeMessage message = new MimeMessage(session);
// Set From,设置发件人
InternetAddress fromMail = new InternetAddress(from);
//设置发件人名称,TODO 换成自己的发件箱
fromMail.setPersonal(MimeUtility.encodeText(from));
message.setFrom(fromMail);
//发一个邮箱
InternetAddress toMail = new InternetAddress(to);
message.setRecipient(Message.RecipientType.TO, toMail);
//发多个邮箱
//InternetAddress toMail = new InternetAddress(to);
TODO 换成自己的收件箱
//InternetAddress toMail2 = new InternetAddress(to);
//Address[] allRecipients = {toMail, toMail2};
//message.setRecipients(Message.RecipientType.TO, allRecipients);
// Set Subject: 邮件主体
message.setSubject(subject);
// 设置发送日期
message.setSentDate(new Date());
// 指定为混合关系
MimeMultipart msgMultipart = new MimeMultipart("mixed");
message.setContent(msgMultipart);
// 邮件信息组装
//组装的顺序非常重要,一定要先组装文本域,再组装文件
MimeBodyPart htmlPart = new MimeBodyPart();
// 组装文本内容
htmlPart.setContent(content, "text/html;charset=UTF-8");
msgMultipart.addBodyPart(htmlPart);
//组装附件 附件是url,需要将url的文件下载下来然后才能发送附件 这里应该在使用完后将临时文件删除
for (String fileUrl : fileUrls) {
//防止url中的中文文件名报错需要进行encode
// 对文件名进行编码
String fileName = fileUrl.substring(fileUrl.lastIndexOf("/") + 1);
String encodedFileName = URLEncoder.encode(fileName, "UTF-8");
String urlPath = fileUrl.substring(0, fileUrl.lastIndexOf("/") + 1) + encodedFileName;
//下载文件
URL fileURL1 = new URL(urlPath);
File tempFile1 = File.createTempFile("tempfile1", fileUrl.substring(fileUrl.lastIndexOf("."),fileUrl.length()));
tempFile1.deleteOnExit();
FileUtils.copyURLToFile(fileURL1, tempFile1);
MimeBodyPart attachmentPart1 = new MimeBodyPart();
attachmentPart1.attachFile(tempFile1);
//附件区别内嵌内容的一个特点是有文件名,为防止中文乱码要编码
attachmentPart1.setFileName(MimeUtility.encodeText(fileUrl.substring(fileUrl.lastIndexOf("/")+1,fileUrl.length())));
msgMultipart.addBodyPart(attachmentPart1);
}
message.saveChanges();
//发送
//Transport.send(message, message.getAllRecipients());
Transport.send(message);
log.info("邮件发送成功");
return true;
}catch (Exception e){
e.printStackTrace();
log.info("邮件发送失败");
return false;
}finally {
//删除临时文件
for (File tempFile : tempFiles) {
try {
Files.deleteIfExists(tempFile.toPath());
} catch (IOException e) {
log.error("删除临时文件失败", e);
}
}
}
}
private static Session getSession(Properties properties) {
return Session.getDefaultInstance(properties,new Authenticator(){
@Override
public PasswordAuthentication getPasswordAuthentication()
{
//发件人邮件用户名、授权码,换成自己的发件箱及授权码
return new PasswordAuthentication(from, secret);
}
});
}
private static Properties initProperties() {
// 获取系统属性
Properties properties = new Properties();
// 设置邮件服务器
properties.setProperty("mail.smtp.host", host);
// 邮件发送协议
properties.setProperty("mail.transport.protocol", "smtp");
//是否启用调试模式(启用调试模式可打印客户端与服务器交互过程时一问一答的响应消息)
properties.setProperty("mail.debug","true");
properties.setProperty("mail.smtp.auth", "true");
return properties;
}
}
使用Java的库发送邮件,需要自行申请密钥,并且保护好密钥,每个邮件商每日发送邮件有限制,一般免费版的限制会多一些,付费版的限制会少一些,需要你们根据自己的需求选择性付费,或者自己搭建一个邮件发送服务,这样就不用付费了