写点什么

Java 邮件发送

作者:
  • 2022 年 4 月 29 日
  • 本文字数:2728 字

    阅读完需:约 9 分钟

简介

在日常的开发中,在 Java 项目中调用邮件服务,进行邮件的发送的场景是比较常见的,本篇将介绍 Java 中邮件的相关使用

发送邮件配置类

发送邮件,肯定是需要相关的邮件服务配置,我们将其进行一个封装


@Data@Builderpublic 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。(具体查看附件)
复制代码


其中我们将时间和正文内容设置为占位符,后面我使用的使用,对应的进行填充即可

参考链接

发布于: 刚刚阅读数: 4
用户头像

关注

还未添加个人签名 2018.09.09 加入

代码是门手艺活,也是门艺术活

评论

发布
暂无评论
Java 邮件发送_Java_萧_InfoQ写作社区