springboot+JAVA MAIL 简单实现邮件发送功能

springboot+JAVA MAIL 简单实现邮件发送功能

采用springboot+JAVA MAIL是利用现有的邮件账户发送邮件的工具。

一、添加pomjar包

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <!--使用 Thymeleaf 制作邮件模板 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

二、增加配置

这里提供两种配置。(使用前,请先开通第三方邮件客户端的专用密码)

spring:
  application:
    name: mail-service #服务应用名称
  #  mail:
  #    # QQ 邮箱 https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28
  #    host: smtp.qq.com
  #    # 邮箱账号
  #    username:xxx@qq.com
  #    # 邮箱授权码(不是密码)
  #    password: password
  #    default-encoding: UTF-8
  #    properties:
  #      mail:
  #        smtp:
  #          auth: true
  #          starttls:
  #            enable: true
  #            required: true
  thymeleaf:
    cache: false
    prefix: classpath:/templates/
    suffix: .html
    encoding: UTF-8
    content-type: text/html
    mode: HTML5
  mail:
    # 163 邮箱 http://help.mail.163.com/faqDetail.do?code=d7a5dc8471cd0c0e8b4b8f4f8e49998b374173cfe9171305fa1ce630d7f67ac2cda80145a1742516
    host: smtp.163.com
    # 邮箱账号
    username: xxx@163.com
    # 邮箱授权码(不是密码)
    password: xxxxxx
    default-encoding: UTF-8
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true

三、邮件发送工具类

@Data
public class MailDomain {
    /**
     * 邮件id
     */
    private String id;
    /**
     * 邮件发送人
     */
    private String sender;
    /**
     * 邮件接收人 (多个邮箱则用逗号","隔开)
     */
    private String receiver;
    /**
     * 邮件主题
     */
    private String subject;
    /**
     * 邮件内容
     */
    private String text;

    /**
     * 抄送(多个邮箱则用逗号","隔开)
     */
    private String cc;
    /**
     * 密送(多个邮箱则用逗号","隔开)
     */
    private String bcc;
    /**
     * 附件/文件地址
     */
    private String filePath;
    /**
     * 附件/文件名称
     */
    private String fileName;
    /**
     * 是否有附件(默认没有)
     */
    private Boolean isTemplate = false;
    /**
     * 模版名称
     */
    private String emailTemplateName;
    /**
     * 模版内容
     */
    private Context emailTemplateContext;
    /**
     * 发送时间(可指定未来发送时间)
     */
    private Date sentDate;
}
@Component
public class EmailUtil {

    @Resource
    private JavaMailSender mailSender;

    @Resource
    TemplateEngine templateEngine;

    @Value("${spring.mail.username}")
    private String sender;

    /**
     * 构建复杂邮件信息类
     * @param mail
     * @throws MessagingException
     */
    public void sendMail(MailDomain mail) throws MessagingException {

        //true表示支持复杂类型
        MimeMessageHelper messageHelper = new MimeMessageHelper(mailSender.createMimeMessage(), true);
        //邮件发信人从配置项读取
        mail.setSender(sender);
        //邮件发信人
        messageHelper.setFrom(mail.getSender());
        //邮件收信人
        messageHelper.setTo(mail.getReceiver().split(","));
        //邮件主题
        messageHelper.setSubject(mail.getSubject());
        //邮件内容
        if (mail.getIsTemplate()) {
            // templateEngine 替换掉动态参数,生产出最后的html
            String emailContent = templateEngine.process(mail.getEmailTemplateName(), mail.getEmailTemplateContext());
            messageHelper.setText(emailContent, true);
        }else {
            messageHelper.setText(mail.getText());
        }
        //抄送
        if (!StringUtils.isEmpty(mail.getCc())) {
            messageHelper.setCc(mail.getCc().split(","));
        }
        //密送
        if (!StringUtils.isEmpty(mail.getBcc())) {
            messageHelper.setCc(mail.getBcc().split(","));
        }
        //添加邮件附件
        if (mail.getFilePath() != null) {
            File file = new File(mail.getFilePath());
            messageHelper.addAttachment(file.getName(), file);
        }
        //发送时间
        if (StringUtils.isEmpty(mail.getSentDate())) {
            messageHelper.setSentDate(mail.getSentDate());
        }
        //正式发送邮件
        mailSender.send(messageHelper.getMimeMessage());
    }

    /**
     * 检测邮件信息类
     * @param mail
     */
    private void checkMail(MailDomain mail) {
        if (StringUtils.isEmpty(mail.getReceiver())) {
            throw new RuntimeException("邮件收信人不能为空");
        }
        if (StringUtils.isEmpty(mail.getSubject())) {
            throw new RuntimeException("邮件主题不能为空");
        }
        if (StringUtils.isEmpty(mail.getText()) && null == mail.getEmailTemplateContext()) {
            throw new RuntimeException("邮件内容不能为空");
        }
    }

    /**
     * 将邮件保存到数据库
     * @param mail
     * @return
     */
    private MailDomain saveMail(MailDomain mail) {
        // todo 发送成功/失败将邮件信息同步到数据库
        return mail;
    }
}

四、邮箱需获取相应的权限说明

1、QQ邮箱需获取相应的权限说明

QQ邮箱–>邮箱设置–>账户–>POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 开启POP3/SMTP服务,然后获取16位授权码(注意不要将授权码泄露,一个账户可以拥有多个授权码)
image.png

2、163邮箱需获取相应的权限说明

image.png

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.fengpt.cn/archives/springbootjavamail简单实现邮件发送功能