SpringBoot发送邮件

young 752 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());
}
}
}