SpringBoot发送邮件

young 593 2021-10-19

依赖

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

springboot配置:

spring:
  mail:
    host: smtp.exmail.qq.com
    username: xxxxxx@xxxxxx.com
    password: xxxxxxx
    protocol: smtp

发送邮件

获取MimeMessage

 MimeMessage mimeMessage = javaMailSender.createMimeMessage();
 MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);

设置发件人

发件人地址与配置文件中的username一致

messageHelper.setFrom(xxxxxx@xxxxxx.com);

设置发件人昵称

messageHelper.setFrom(new InternetAddress(xxxxxx@xxxxxx.com, nickName));

设置收件人

单个收件人

messageHelper.setTo(xxxx@xxx.com);

多个收件人

messageHelper.setTo(new String[]{xxxx@xxx.com,xxxx@xxx.com});

设置抄送人

messageHelper.setCc(xxxx@cccc.com);

多个抄送人,参数与收件人一致

设置私密抄送人

messageHelper.setBcc(xxxx@cccc.com);

多个私密抄送人,参数与收件人一致

设置邮件主题

messageHelper.setSubject(subject);

设置邮件内容

// isHtmlText邮件内容是否为html格式,支持仅部分内容为html格式
messageHelper.setText(contentText, ishtmlText);

添加附件

public void addAttachment(String attachmentFilename, DataSource dataSource) throws MessagingException;

public void addAttachment(String attachmentFilename, File file) throws MessagingException ;

public void addAttachment(String attachmentFilename, InputStreamSource inputStreamSource) throws MessagingException;

public void addAttachment(String attachmentFilename, InputStreamSource inputStreamSource, String contentType) throws MessagingException;

例:

messageHelper.addAttachment(附件名称, new ByteArrayResource(文件字节数组));

添加内嵌

如一张图片,展示在邮件正文中,而非在附件中

public void addInline(String contentId, DataSource dataSource) throws MessagingException;
public void addInline(String contentId, File file) throws MessagingException;
public void addInline(String contentId, Resource resource) throws MessagingException;
public void addInline(String contentId, InputStreamSource inputStreamSource, String contentType)

例:

messageHelper.addInline("p02",new FileSystemResource(new File("/Users/gamedev/Desktop/瑞文.jpg")));

发送邮件

javaMailSender.send(mimeMessage);

不使用AutoConfiguration配置JavaMailSender

邮件配置位于数据库,启动时加载到缓存中

@Component
public class JavaMailConfig {
   private static final String MAIL_HOST = "MAIL_HOST";
   private static final String MAIL_PORT = "MAIL_PORT";
   public static final String MAIL_USERNAME = "MAIL_USERNAME";
   private static final String MAIL_PASSWORD = "MAIL_PASSWORD";
   private static final String MAIL_PROTOCOL = "MAIL_PROTOCOL";
   private static final String MAIL_ENCODING = "MAIL_ENCODING";
   private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
   @Autowired
   private CacheService cacheService;

   @Bean
   @ConditionalOnMissingBean
   public JavaMailSenderImpl mailSender() {
      JavaMailSenderImpl sender = new JavaMailSenderImpl();
      applyProperties(sender);
      return sender;
   }

   public void refreshJavaMailConfig() {
      JavaMailSenderImpl javaMailSender = BeanFactory.getBean(JavaMailSenderImpl.class);
      if (javaMailSender == null) {
         javaMailSender = new JavaMailSenderImpl();
      }
      applyProperties(javaMailSender);
   }

   private void applyProperties(JavaMailSenderImpl sender) {
      sender.setHost(cacheService.getParamValueCache(MAIL_HOST));
      String mailPort = cacheService.getParamValueCache(MAIL_PORT);
      if (StringUtils.isNotBlank(mailPort)) {
         sender.setPort(Integer.parseInt(mailPort));
      }
      sender.setUsername(cacheService.getParamValueCache(MAIL_USERNAME));
      sender.setPassword(cacheService.getParamValueCache(MAIL_PASSWORD));
      sender.setProtocol(cacheService.getParamValueCache(MAIL_PROTOCOL));
      String mailEncoding = cacheService.getParamValueCache(MAIL_ENCODING);
      if (StringUtils.isNotBlank(mailEncoding)) {
         sender.setDefaultEncoding(mailEncoding);
      } else {
         sender.setDefaultEncoding(DEFAULT_CHARSET.name());
      }
   }
}