001package run.iget.framework.mail.service.impl; 002 003import java.io.File; 004import java.util.Map; 005 006import javax.annotation.Resource; 007import javax.mail.MessagingException; 008import javax.mail.internet.MimeMessage; 009 010import org.springframework.beans.factory.annotation.Value; 011import org.springframework.mail.SimpleMailMessage; 012import org.springframework.mail.javamail.JavaMailSender; 013import org.springframework.mail.javamail.MimeMessageHelper; 014import org.springframework.stereotype.Service; 015 016import cn.hutool.core.collection.CollectionUtil; 017import cn.hutool.core.util.StrUtil; 018import lombok.extern.slf4j.Slf4j; 019import run.iget.framework.common.util.ThreadTaskUtils; 020import run.iget.framework.mail.service.MailService; 021 022/** 023 * 代码千万行,注释第一行;注释不规范,迭代两行泪 024 * ---------------------------------------- 025 * 邮件发送实现类 026 * ---------------------------------------- 027 * author: 大周 028 * date: 2022/2/8 13:03 029 **/ 030@Slf4j 031@Service 032public class MailServiceImpl implements MailService { 033 034 @Value("${spring.mail.username}") 035 private String from; 036 @Value("${spring.mail.nickname:''}") 037 private String nickname; 038 039 @Resource 040 private JavaMailSender mailSender; 041 042 /** 043 * 对发件人进行编码,支持中文的别名 044 * 045 * @return urf-8后的发件人 046 */ 047 private String encodedFrom() { 048 if (StrUtil.isBlank(nickname)) { 049 return from; 050 } 051 return StrUtil.utf8Str(StrUtil.format("{}<{}>", nickname, from)); 052 } 053 054 @Override 055 public void sendSimpleMail(String to, String subject, String content) { 056 ThreadTaskUtils.submitTask(() -> { 057 SimpleMailMessage message = new SimpleMailMessage(); 058 //收信人 059 message.setTo(to); 060 //主题 061 message.setSubject(subject); 062 //内容 063 message.setText(content); 064 //发信人 065 message.setFrom(encodedFrom()); 066 mailSender.send(message); 067 log.info("发送SimpleMailMessage邮件成功"); 068 }); 069 } 070 071 @Override 072 public void sendHtmlMail(String to, String subject, String content) { 073 this.sendHtmlMail(to, subject, content, null, null); 074 } 075 076 @Override 077 public void sendHtmlMailOfAttachments(String to, String subject, String content, 078 Map<String, File> attachmentFiles) { 079 this.sendHtmlMail(to, subject, content, null, attachmentFiles); 080 } 081 082 @Override 083 public void sendHtmlMailOfImages(String to, String subject, String content, Map<String, File> imageFiles) { 084 this.sendHtmlMail(to, subject, content, imageFiles, null); 085 } 086 087 @Override 088 public void sendHtmlMail(String to, String subject, String content, Map<String, File> imageFiles, 089 Map<String, File> attachmentFiles) { 090 MimeMessage message = mailSender.createMimeMessage(); 091 MimeMessageHelper helper = null; 092 try { 093 helper = new MimeMessageHelper(message, true); 094 helper.setFrom(encodedFrom()); 095 helper.setTo(to); 096 helper.setSubject(subject); 097 // true代表支持html 098 helper.setText(content, true); 099 // 添加图片 100 if (CollectionUtil.isNotEmpty(imageFiles)) { 101 for (Map.Entry<String, File> imageEntry : imageFiles.entrySet()) { 102 // 重复使用添加多个图片 103 helper.addInline(imageEntry.getKey(), imageEntry.getValue()); 104 } 105 } 106 // 添加附件 107 if (CollectionUtil.isNotEmpty(attachmentFiles)) { 108 for (Map.Entry<String, File> attachmentEntry : attachmentFiles.entrySet()) { 109 // 添加附件,可多次调用该方法添加多个附件 110 helper.addAttachment(attachmentEntry.getKey(), attachmentEntry.getValue()); 111 } 112 } 113 // 发送邮件 114 ThreadTaskUtils.submitTask(() -> mailSender.send(message)); 115 log.info("发送HTML邮件成功"); 116 } catch (MessagingException e) { 117 log.error("发送HTML邮件失败:", e); 118 } 119 } 120 121 @Override 122 public void sendInitPasswordEmail(String to, String url) { 123 // Context context = new Context(); 124 // context.setVariable("url", url); 125 // String emailContent = templateEngine.process("mail/InitPasswordMail.html", context); 126 // this.sendHtmlMail(to, "重置密码", emailContent); 127 } 128}