springboot发送邮件的一些坑与代码示例

最近玩了一个邮件发送的一个功能,原来一直想玩,一直没有机会,这次玩了一下,遇到了不少坑,接下来说说遇到的坑吧

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");
    // 发件人的账号,填写控制台配置的发信地址,比如[email protected]
    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 {
        // 设置发件人邮件地址和名称。填写控制台配置的发信地址,比如[email protected]。和上面的mail.user保持一致。名称用户可以自定义填写。
        InternetAddress from = new InternetAddress(props.getProperty("mail.user"), "LDSJ");
        message.setFrom(from);
        // 设置收件人邮件地址,比如[email protected]
        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("邮件发送失败!");
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章