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}