目录

Spring Mail

Java Mail

Java EE,Java平台企业版(Java Platform Enterprise Edition),之前称为Java 2 Platform, Enterprise Edition (J2EE),2018年3月更名为Jakarta EE。是Sun公司为企业级应用推出的标准平台。Java平台共分为三个主要版本Java EE、Java SE和Java ME。

Java 8 及以前使用 javax.mail, Java 9 及以后使用 jakarta.mail。Java Servlet API 也有这样的变化。

JavaMail API

1
2
// https://mvnrepository.com/artifact/javax.mail/javax.mail-api
implementation 'javax.mail:javax.mail-api:1.6.2'

Jakarta Mail API 2.1 Specification API

1
2
// https://mvnrepository.com/artifact/jakarta.mail/jakarta.mail-api
implementation 'jakarta.mail:jakarta.mail-api:2.1.0'

spring-boot-starter-mail

JavaMailSender

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
plugins {
  id "org.springframework.boot.starter"
}

description = "Starter for using Java Mail and Spring Framework's email sending support"

dependencies {
  api(project(":spring-boot-project:spring-boot-starters:spring-boot-starter"))
  api("org.springframework:spring-context-support")
  api("com.sun.mail:jakarta.mail")
}

阿里云邮件推送 SDK 方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<!-- 阿里云产品核心库 -->
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>darabonba-java-core</artifactId>
  <version>0.1.5-beta</version>
</dependency><!-- 阿里邮件推送 SDK -->
<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>alibabacloud-dm20151123</artifactId>
  <version>1.0.5</version>
</dependency>

阿里云邮件开启 SMTP 发信功能

您需要先开启 SMTP 发信功能才能通过 SMTP 接口发送邮件。

  • 登录 邮件推送控制台。
  • 单击左侧导航栏中 发信地址,进入发信地址页面。
  • 在发信地址列表中,找到您要开启 SMTP 发信功能的发信地址,在对应的操作栏中单击 设置 SMTP 密码。
  • 在弹出对话框中填写 SMTP 密码,然后单击 确定。
1
2
3
4
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-mail</artifactId>
</dependency>
1
2
3
4
5
6
spring:
  mail:
    host: smtpdm.aliyun.com
    port: 80
    username: noreply@ynthm.com
    password: xxxxxxxx
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
@Slf4j
@Component
public class JavaMailUtil {

  private final MailProperties mailProperties;

  private final JavaMailSender mailSender;

  public JavaMailUtil(MailProperties mailProperties, JavaMailSender mailSender) {
    this.mailProperties = mailProperties;
    this.mailSender = mailSender;
  }

  /**
   * 发送纯文本形式的 email
   *
   * @param simpleMailMessage 简单邮件消息
   */
  public void sendTextMail(SimpleMailMessage simpleMailMessage) {
    simpleMailMessage.setFrom(mailProperties.getUsername());
    simpleMailMessage.setSentDate(new Date());
    mailSender.send(simpleMailMessage);
  }

  /**
   * 发送带有html的内容
   *
   * @param req 邮件消息
   */
  public void sendHtmlMail(SendAttachedMailReq req) {
    MimeMessage msg = mailSender.createMimeMessage();
    MimeMessageHelper helper;
    try {
      helper = new MimeMessageHelper(msg, req.isMultipart(), StandardCharsets.UTF_8.name());
      // 邮件发件人
      helper.setFrom(mailProperties.getUsername());
      helper.setTo(req.getTo().toArray(new String[req.getTo().size()]));
      helper.setSubject(req.getSubject());
      helper.setText(req.getContent(), req.isHtml());
      if (req.isMultipart()) {
        List<MultipartFile> attachmentFileList = req.getAttachmentFileList();
        if (Objects.nonNull(attachmentFileList)) {
          for (MultipartFile multipartFile : attachmentFileList) {
            String originalFilename = multipartFile.getOriginalFilename();
            if (Objects.nonNull(originalFilename)) {
              helper.addAttachment(originalFilename, multipartFile);
            }
          }
        }
      }

      mailSender.send(msg);
    } catch (MessagingException e) {
      throw new BaseException(InfraResultCode.S_INFRA_ERROR);
    }
  }
}

@Data
public class SendAttachedMailReq {

  /** 收件人地址 */
  @NotEmpty private List<@Email String> to;

  /** 抄送地址 */
  private List<@Email String> cc;

  /** 暗送地址 */
  private List<@Email String> bcc;

  /** 回复地址 */
  @Email private String replyTo;

  /** 主题 标题 */
  @NotBlank private String subject;

  @NotNull private boolean html = true;

  /** 类容 */
  @NotBlank private String content;

  @NotNull private boolean multipart = false;

  /** 附件列表 */
  private List<MultipartFile> attachmentFileList;
}

附录