最近玩了一个邮件发送的一个功能,原来一直想玩,一直没有机会,这次玩了一下,遇到了不少坑,接下来说说遇到的坑吧
1、我是部署在阿里云服务器上面的,阿里云把邮件发送的默认端口25封了,需要改成SSL加密端口
2、发送HTML邮件的情况,需要避免使用浮动,定位的方式进行页面布局,不要使用CSS外联及JS,建议多次进行兼容性调试,因为邮件发送HTML会过滤部分属性,导致HTML内容排版错误
3、另外关于第二个问题,我看了一下钉邮的发送是好的,查看了发送的源码发现可能可以用编码格式解决排版问题
4、另外部署后发现,发送邮件贼慢,虽然可能没几个人用,但以防出现问题,加个@Async异步处理一下
下面俩张图是我发送的源码与钉邮的源码,发现钉邮把默认的quoted-printable编码格式转换成了base64编码格式,并把text/html改成了text/plain,这个问题没有解决,如有大佬看到,望告知,感谢
下面代码发送的HTML的 纯本文的更简单点
pom文件添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;
/**
* @Description 发送HTML邮件
* @Author Zhong Yanghao
* @Date 2020/06/01 10:53:45
* @Param to 邮件接收方
* @param subject 邮件主题
* @param text 邮件内容
* @Return void
*/
@Async
public void sendTextMail(String to, String subject, String text) throws Exception {
// 配置发送邮件的环境属性
final Properties props = new Properties();
// 表示SMTP发送邮件,需要进行身份验证
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.host", host);
// 如果使用ssl,则去掉使用25端口的配置,进行如下配置,
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.port", "465");
// 发件人的账号,填写控制台配置的发信地址,比如xxx@xxx.com
props.put("mail.user", username);
// 访问SMTP服务时需要提供的密码(在控制台选择发信地址进行设置)
props.put("mail.password", password);
// 构建授权信息,用于进行SMTP进行身份验证
Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 用户名、密码
String userName = props.getProperty("mail.user");
String password = props.getProperty("mail.password");
return new PasswordAuthentication(userName, password);
}
};
// 使用环境属性和授权信息,创建邮件会话
Session mailSession = Session.getInstance(props, authenticator);
// 创建邮件消息
MimeMessage message = new MimeMessage(mailSession){};
try {
// 设置发件人邮件地址和名称。填写控制台配置的发信地址,比如xxx@xxx.com。和上面的mail.user保持一致。名称用户可以自定义填写。
InternetAddress from = new InternetAddress(props.getProperty("mail.user"), "LDSJ");
message.setFrom(from);
// 设置收件人邮件地址,比如yyy@yyy.com
InternetAddress toAddress = new InternetAddress(to);
message.setRecipient(MimeMessage.RecipientType.TO, toAddress);
// 设置邮件标题
message.setSubject(subject);
// 设置邮件的内容体
message.setContent(text, "text/html;charset=UTF-8");
// 发送邮件
Transport.send(message);
logger.info(new StringBuilder().append("发送至").append(to).append("成功!").toString());
}
catch (MessagingException e) {
logger.error("邮件发送失败" + e.getMessage());
throw new Exception("邮件发送失败!");
}
}