自学内容网 自学内容网

SpringBoot整合邮件发送

利用JavaMail完成发送激活邮件的功能。当前案例是以腾讯qq邮箱服务器为演示案例:

开启邮件服务授权

qq邮箱服务器官方会回送一个授权码在网页,类似下图的效果:

邮件发送流程

因为springboot提供了java操作邮件发送的启动器,所以在springboot 项目中完成邮件发送的功能,还是很简单、方便的。大致流程如下所示:

pom.xml 引入邮件发送启动器

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

通过JavaMail的API完成邮件发送功能的代码封装,此处直接提供的工具类

  • 抽取接口
public interface MailService {
    void sendSimpleMail(String to, String subject, String content);
    void sendHtmlMail(String to, String subject, String content);
    void sendAttachmentsMail(String to, String subject,String content, String filePath);
    void sendInlineResourceMail(
            String to, String subject,
            String content, String rscPath, String rscId);
}
  • 实现类
@Slf4j
@Component
@Data
@ConfigurationProperties(prefix = "spring.mail")
public class MailUtil implements MailService{
    @Autowired
    private JavaMailSender mailSender; //springboot提供的邮件发送的api
    private String from;//获取发件人的邮箱地址

    @Override
    public void sendSimpleMail(String to, String subject, String content) {
        log.info("from===="+from);
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from); //发件人
        message.setTo(to); //收件人
        message.setSubject(subject); //邮件主题
        message.setText(content); //邮件内容,只能纯文本
        try {
            mailSender.send(message);
            log.info("简单邮件已经发送。");
        } catch (Exception e) {
            e.printStackTrace();
            log.error("发送简单邮件时发生生异常!", e);
        }
    }
    @Override
    public void sendHtmlMail(String to, String subject, String content) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            // true 表示需要创建一一个 multipart message
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true); //邮件内容包含html
            mailSender.send(message);
            log.info("html邮件发送成功");
        } catch (Exception e) {
            log.error("发送html邮件时发生生异常!", e);
        }
    }
    @Override
    public void sendAttachmentsMail (
            String to, String subject,
            String content, String filePath) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            FileSystemResource file = new FileSystemResource(new File(filePath));
            String fileName = file.getFilename();
            helper.addAttachment(fileName, file); //设置附件

            // helper.addAttachment("test"+fileName, file);
            mailSender.send(message);
            log.info("带附件的邮件已经发送。");
        } catch (Exception e) {
            log.error("发送带附件的邮件时发生生异常!", e);
        }
    }
    @Override
    public void sendInlineResourceMail(
            String to, String subject,
            String content, String rscPath, String rscId) {
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(to);
            helper.setSubject(subject);
            helper.setText(content, true);
            FileSystemResource res = new FileSystemResource(new File(rscPath));
            helper.addInline(rscId, res); //内嵌静态资源
            mailSender.send(message);
            log.info("嵌入静态资源的邮件已经发送。");
        } catch (Exception e) {
            log.error("发送嵌入静态资源的邮件时发生异常!", e);
        }
    }
}
  • from,即为邮件发送者,一般设置在配置文件中
  • to,邮件接收者,此参数可以为数组,同时发送多人
  • subject,邮件主题
  • content,邮件的主体
  • 邮件发送者 from 一般采用固定的形式写到配置文件中。

application.yaml中配置邮件服务器信息

spring:        
    mail:
        protocol: smtp
        host: smtp.qq.com #邮箱服务器主机,可以配置不用的邮件服务商  126  163  qq
        username: xxxxxxxxxx@qq.com #  开通邮件授权功能的邮箱用户名
        password: xxxxxxxx #授权码
        port: 25 # 端口
        from: xxxxxxx@qq.com #实际发送邮件的邮箱地址发件人
        default-encoding: utf-8  #编码格式,设置邮件正文的编码格式,因为邮件可以发送富文本[即html代码,需要浏览器解析,解析使用什么编码通过该属性指定]
        properties: # 设置超时时间
            mail:
                smtp:
                    connectiontimeout: 5000
                    timeout: 3000
                    writetimeout: 5000
                    ssl: # 配置SSL 加密
                        # 本地测试
                        enable: false
                        required: false
                # 开启debug模式,这样邮件发送过程的日志会在控制台打印出来,方便排查
                debug: true

扩展:其他邮箱服务器的配置方式:

在 application.properties 中添加邮箱配置,不同的邮箱参数稍有不同,下面面列举几个常用邮箱配置。

163 邮箱配置

spring.mail.host=smtp.163.com   // 邮箱服务器器地址
spring.mail.username=xxx@163.com // 用用户名
spring.mail.password=xxx        // 密码
spring.mail.default-encoding=UTF-8

// 超时时间,可选
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000

126 邮箱配置

spring.mail.host=smtp.126.com 
spring.mail.username=xxx@126.com
spring.mail.password=xxx
spring.mail.default-encoding=UTF-8

QQ 邮箱配置如下:

spring.mail.host=smtp.qq.com
spring.mail.username=xxx@qq.com
spring.mail.password=xxx
spring.mail.default-encoding=UTF-8

测试时需要将 spring.mail.username 和 spring.mail.password 改成自自己邮箱对应的登录名和密码,这里的密码不是邮箱的登录密码,是开启 POP3 之后设置的客户端授权密码。

测试工具类方法:

在日常使用的过程中,我们通常在邮件中加入图片或者附件来丰富邮件的内容。

发送 HTML 格式邮件

邮件发送支持以 HTML 语法去构建自定义的邮件格式,Spring Boot 支持使用用 HTML 发送邮件。

我们在 MailService 中添加支持 HTML 邮件发送的方法:

public void sendHtmlMail(String to, String subject, String content) {
    MimeMessage message = mailSender.createMimeMessage();
    try {
        // true 表示需要创建一一个 multipart message
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);
        mailSender.send(message);
        logger.info("html邮件发送成功");
    } catch (MessagingException e) {
        logger.error("发送html邮件时发生生异常!", e);
    }
}

富文本邮件抄送使用:helper.addCc(cc) 来实现。

和文本邮件发送代码对比,富文本邮件发送使用 MimeMessageHelper 类,该类支持发送复杂邮件模板,支持文本、附件、HTML、图片等。

在测试类中构建 HTML 内容,测试发送:

@Test
public void testHtmlMail() throws Exception {
    String content = 
    "<html>\n" + 
        "<body>\n" + 
            "<h3>hello world ! 这是一一封html邮件!</h3>\n" +
        "</body>\n" +
    "</html>";

    mailService.sendHtmlMail("xxxx@xxx.com","这是一封HTML邮件", content);
}

代码中拼接出的 HTML 的 String 字符串交给 MimeMessageHelper 来处理理,最后由邮件客户端负责渲染显示内容。

发送带附件的邮件

在 MailService 添加 sendAttachmentsMail 方法,发送带附件的邮件主要是使用 FileSystemResource 对文件进行封装,再添加到 MimeMessageHelper 中。

public void sendAttachmentsMail (
        String to, String subject, 
        String content, String filePath) {
    MimeMessage message = mailSender.createMimeMessage();
    try {
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);
        FileSystemResource file = new FileSystemResource(new File(filePath));
        String fileName = file.getFilename();
        helper.addAttachment(fileName, file);

        // helper.addAttachment("test"+fileName, file);
        mailSender.send(message);
        logger.info("带附件的邮件已经发送。");
    } catch (MessagingException e) {
        logger.error("发送带附件的邮件时发生生异常!", e);
    }
}

添加多个附件可以使用多条 helper.addAttachment(fileName, file) 。

在测试类中添加测试方法:

@Test
public void sendAttachmentsMail() {
    String filePath = "e:\\temp\\fastdfs-client-java-5.0.0.jar";
    mailService.sendAttachmentsMail("xxx@xx.com", "主题:带附件的邮件", "有附件,请查收!", filePath);
}

附件可以是图片、压缩包、Word 等任何文件,但是邮件厂商一般都会对附件大小有限制,太大的附件建议使用网盘上传后,在邮件中给出链接。

发送带静态资源的邮件

邮件中的静态资源一般指图片,在 MailService 中添加 sendInlineResourceMail 方法:

public void sendInlineResourceMail(
        String to, String subject, 
        String content, String rscPath, String rscId) {
    MimeMessage message = mailSender.createMimeMessage();
    try {
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        helper.setFrom(from);
        helper.setTo(to);
        helper.setSubject(subject);
        helper.setText(content, true);
        FileSystemResource res = new FileSystemResource(new File(rscPath));
        helper.addInline(rscId, res);
        mailSender.send(message);
        logger.info("嵌入静态资源的邮件已经发送。");
    } catch (MessagingException e) {
        logger.error("发送嵌入静态资源的邮件时发生异常!", e);
    }
}

在测试类中添加测试方法:

@Test
public void sendInlineResourceMail() {
    String rscId = "neo006";
    String content = "<html><body>这是有图片的邮件:<img src='cid:" + rscId + "' ></body></html>";
    String imgPath = "e:\\temp\\weixin.jpg";
    mailService.sendInlineResourceMail("xxxx@xxxx.com", "主题:这是有图片的邮件", content, imgPath, rscId);
}

添加多个图片可以使用多条 img src=‘cid:“+ rscId +”’ > 和 helper.addInline(rscId, res) 来实现。


原文地址:https://blog.csdn.net/zhuge_long/article/details/140491550

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!