简介
在日常的开发中,在 Java 项目中调用邮件服务,进行邮件的发送的场景是比较常见的,本篇将介绍 Java 中邮件的相关使用
发送邮件配置类
发送邮件,肯定是需要相关的邮件服务配置,我们将其进行一个封装
@Data
@Builder
public class EmailConfig {
private String host;
private String port;
private String user;
private String password;
}
复制代码
如上所示,常用的配置是主机路径、端口、用户名和密码,这些东西基本上在项目中是一个通用的配置,自行获取
邮件发送服务
下面是目前常用的一个通用封装,感觉应该是能覆盖目前大部分的使用场景
import com.sun.mail.util.MailSSLSocketFactory;
import lombok.SneakyThrows;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import java.util.Properties;
public class EmailService {
private final EmailConfig config;
private final Session session;
@SneakyThrows
public EmailWarnService(final EmailWarnConfig emailSendConfig) {
config = emailSendConfig;
Properties props = new Properties();
//设置邮件地址
props.setProperty("mail.transport.protocol", "smtp");
props.put("mail.smtp.host", config.getHost());
//开启认证
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", config.getPort());
//使用SSL,企业邮箱必需!
//开启安全协议
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);
//获取Session对象
session = Session.getDefaultInstance(props, new Authenticator() {
//此访求返回用户和密码的对象
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//邮箱账号,密码
return new PasswordAuthentication(config.getUser(),
config.getPassword());
}
});
}
/**
* 发送邮件
* @param receiveAddress 收件人地址,多个地址之间用英文逗号分隔
* @param title 邮件标题
* @param message 邮件正文内容
* @param attachments 邮件附件列表 key 是附件名称 value是附件内容
*/
@SneakyThrows
public void sendsMessage(String receiveAddress, String title, String message, Map<String, String> attachments) {
try {
// 根据session创建一个邮件消息
Message mailMessage = new MimeMessage(session);
// 创建邮件发送者地址
Address from = new InternetAddress(config.getUser());
// 设置邮件消息的发送者
mailMessage.setFrom(from);
String[] recipientList = receiveAddress.split(",");
InternetAddress[] recipientAddress = new InternetAddress[recipientList.length];
int counter = 0;
for (String recipient : recipientList) {
recipientAddress[counter] = new InternetAddress(recipient.trim());
counter++;
}
mailMessage.setRecipients(Message.RecipientType.TO, recipientAddress);
// 设置邮件消息的主题
mailMessage.setSubject(title);
// 设置邮件消息发送的时间
mailMessage.setSentDate(Calendar.getInstance().getTime());
// MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象
Multipart multiPart = new MimeMultipart();
// 创建一个包含HTML内容的MimeBodyPart
BodyPart bodyPart = new MimeBodyPart();
// 设置html邮件消息内容
bodyPart.setContent(message, "text/html; charset=utf-8");
multiPart.addBodyPart(bodyPart);
//添加附件
for (String fileName: attachments.keySet()) {
byte[] bytes = attachments.get(fileName).getBytes(StandardCharsets.UTF_8);
ByteArrayDataSource barrds = new ByteArrayDataSource(bytes, "application/octet-stream");
bodyPart = new MimeBodyPart();
//得到附件本身并放入BodyPart
bodyPart.setDataHandler(new DataHandler(barrds));
//得到文件名并编码(防止中文文件名乱码)同样放入BodyPart
bodyPart.setFileName(MimeUtility.encodeText(fileName));
multiPart.addBodyPart(bodyPart);
}
// 设置邮件消息的主要内容
mailMessage.setContent(multiPart);
// 发送邮件
Transport.send(mailMessage);
} catch (Exception e) {
e.printStackTrace();
}
}
}
复制代码
如上所示,在构造函数中进行了连接相关的初始化,后面基本上是复用这个 session,目前使用下来基本正常
下面的发送函数是一个通用的,可以发送给多个邮箱和附件
附件可能需要比较少,但有的话,还是挺关键的,这里使用一个 map 结构,key 是文件名,value 是附件内容,使其能进行多个附件的发送
在使用过程中需要注意大小,避免一些数据量比较大的操作
邮件发送的使用
目前使用下来的最佳实践还是将邮件模板保存到数据库中,使用时进行加载,然后替换其中的占位符之类的比较方便
如下,我们定义了一个邮件模板:
【xxx邮件】xxxx <br><br>时间:%s <br><br> %s。(具体查看附件)
复制代码
其中我们将时间和正文内容设置为占位符,后面我使用的使用,对应的进行填充即可
参考链接
评论