最近工作中,使用到了发送邮件的功能,邮件内容嵌套了图片,并且要携带附件。在此记录一下,希望可以帮助大家。
前提:开通邮件的POP3/SMTP/IMAP功能。
1. 引入发送邮件的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
2. 添加邮件属性配置
spring:
mail:
host: smtp.163.com
username: 你的邮箱账号
password: 你的邮箱密码或者口令之类的认证信息
port: 465
properties:
mail:
debug: true # 在控制台打印邮件的发送过程
smtp:
ssl:
enable: true # 启用ssl
3. 编写发送邮件的服务
接口:
public interface MailService {
/**
* 发送纯文本内容的邮件
* @param dto
* @return 是否发送成功
*/
boolean sendSimpleEmail(MailDTO dto);
/**
* 发送使用freemarker模板制作的邮件
* @param dto
* @return 是否发送成功
*/
boolean sendTemplateEmail(MailDTO dto);
}
实现类:
@Service
public class MailServiceImpl implements MailService {
@Value("${spring.mail.username}")
private String from;
@Autowired
private JavaMailSender javaMailSender;
@Autowired
private FreeMarkerConfigurer configurer;
@Override
public boolean sendSimpleEmail(MailDTO dto) {
boolean success;
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(dto.getTo());
message.setSubject(dto.getSubject());
message.setText(dto.getText());
try {
javaMailSender.send(message);
success = true;
System.out.println("给 "+ Arrays.toString(dto.getTo()) +" 发送邮件成功");
} catch (MailException e) {
System.err.println("给 "+ Arrays.toString(dto.getTo()) +" 发送邮件失败");
success = false;
}
return success;
}
@Override
public boolean sendTemplateEmail(MailDTO dto) {
boolean success;
try {
MimeMessage msg = javaMailSender.createMimeMessage();//创建模拟的消息
MimeMessageHelper helper = new MimeMessageHelper(msg, true);//创建模拟的消息工具
helper.setFrom(from);//发件人
helper.setTo(dto.getTo());
helper.setSubject(dto.getSubject());//发送主题
Template template = configurer.getConfiguration().getTemplate(dto.getTemplatePath());
StringWriter writer = new StringWriter();
template.process(dto.getTemplateParams(), writer);
//内容是否设置成html,true代表是
helper.setText(writer.toString(), true);
// 判断邮件内容是否嵌套了图片
if (!CollectionUtils.isEmpty(dto.getPicMap())){
for (Map.Entry<String, String> entry : dto.getPicMap().entrySet()) {
helper.addInline(entry.getKey(),new FileSystemResource(new File(entry.getValue())));
}
}
// 判断是否存在附件
if (!CollectionUtils.isEmpty(dto.getAttachmentMap())){
for (Map.Entry<String, String> entry : dto.getAttachmentMap().entrySet()) {
helper.addAttachment(entry.getKey(),new File(entry.getValue()));
}
}
javaMailSender.send(msg);
success = true;
System.out.println("给 "+ Arrays.toString(dto.getTo()) +" 发送邮件成功");
} catch (Exception e) {
System.err.println("给 "+ Arrays.toString(dto.getTo()) +" 发送邮件失败");
success = false;
}
return success;
}
}
发送图片主要是使用了MimeMessageHelper#addInline
// 判断邮件内容是否嵌套了图片
if (!CollectionUtils.isEmpty(dto.getPicMap())){
for (Map.Entry<String, String> entry : dto.getPicMap().entrySet()) {
// <img src="cid:pic0"/> key与cid后面的值对应,value为图片路径
helper.addInline(entry.getKey(),new FileSystemResource(new File(entry.getValue())));
}
}
发送附件则是使用了MimeMessageHelper#addAttachment
// 判断是否存在附件
if (!CollectionUtils.isEmpty(dto.getAttachmentMap())){
for (Map.Entry<String, String> entry : dto.getAttachmentMap().entrySet()) {
// key是文件名,value是文件路径
helper.addAttachment(entry.getKey(),new File(entry.getValue()));
}
}
测试结果