Java SpringBoot实现邮件发送

依赖

<!-- Spring Boot 邮件依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<!--freemarker制作Html邮件模板依赖包-->
<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf</artifactId>
</dependency>

邮件模板

<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>邮件</title>
    <style>
        table {
            border: 3px solid black;
            border-spacing: 0;
            border-collapse: collapse;
        }

        td {
            border: 3px solid black;
            padding: 10px;
            text-align: center;
        }
    </style>
</head>
<body>
<div style="font-size: 24px">
    <div style="border-bottom: 3px solid #eee; margin-bottom: 15px">[[${email.date}]] 农安试验场原始数据上传情况</div>

    <table>
        <tr style="font-weight: bold">
            <td>TEVG System</td>
            <td>空间总数据量 Summe:[[${email.amount}]]</td>
            <td colspan="3">[[${email.date}]]</td>
        </tr>
        <tr style="font-weight: bold">
            <td>VDS Nr.</td>
            <td>日期Date-时间Time</td>
            <td>文件夹大小 Size/M</td>
            <td>迁移状态 Upload Status</td>
        </tr>
        <tr th:each="data:${email.list}">
            <td><a th:href="${data.codeUrl}">[[${data.code}]]</a></td>
            <td><a th:href="${data.dateUrl}">[[${data.date}]]</a></td>
            <td>[[${data.folderSize}]]</td>
            <td>[[${data.migrations}]]</td>
        </tr>

    </table>
</div>
</body>
</html>

邮件接口

public interface SmtpMailService {
    /**
     * 发送文本邮件
     *
     * @param to      收件人地址
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param cc      抄送地址
     */
    void sendSimpleMail(List<String> to, String subject, String content, List<String> cc);

    /**
     * 发送HTML邮件
     *
     * @param to      收件人地址
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param cc      抄送地址
     * @throws MessagingException 邮件发送异常
     */
    void sendHtmlMail(List<String> to, String subject, String content, List<String> cc);

    /**
     * 发送带附件的邮件
     *
     * @param to       收件人地址
     * @param subject  邮件主题
     * @param content  邮件内容
     * @param filePath 附件地址
     * @param cc       抄送地址
     * @throws MessagingException 邮件发送异常
     */
    void sendAttachmentsMail(List<String> to, String subject, String content, List<String> filePath, List<String> cc);

    /**
     * 发送正文中有静态资源的邮件
     *
     * @param to      收件人地址
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param rscPath 静态资源地址
     * @param rscId   静态资源id
     * @param cc      抄送地址
     * @throws MessagingException 邮件发送异常
     */
    void sendResourceMail(List<String> to, String subject, String content, String rscPath, String rscId, List<String> cc);

邮件接口实现

@Service
public class SmtpMailServiceImpl implements SmtpMailService {

    @Autowired
    private IVwEmailServerService vwEmailServerService;

    private String from;

    /**
     * 发送文本邮件
     *
     * @param to      收件人地址
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param cc      抄送地址
     */
    @Override
    public void sendSimpleMail(List<String> to, String subject, String content, List<String> cc) {
        JavaMailSenderImpl jms = getMailSender();
        MimeMessage mimeMessage = jms.createMimeMessage();
        MimeMessageHelper helper;

        try {
            helper = new MimeMessageHelper(mimeMessage, true);
            for (String addressee : to) {
                helper.setFrom(from);
                helper.setTo(addressee);
                helper.setSubject(subject);
                helper.setText(content);
                if (!cc.isEmpty()) {
                    helper.setCc(cc.toString());
                }
                jms.send(mimeMessage);
            }
        } catch (MessagingException e) {
            System.out.println(e);
        }


    }

    /**
     * 发送HTML邮件
     *
     * @param to      收件人地址
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param cc      抄送地址
     */
    @Override
    public void sendHtmlMail(List<String> to, String subject, String content, List<String> cc) {
        JavaMailSenderImpl jms = getMailSender();
        MimeMessage mimeMessage = jms.createMimeMessage();
        MimeMessageHelper helper;

        try {
            helper = new MimeMessageHelper(mimeMessage, true);
            for (String addressee : to) {
                helper.setFrom(from);
                helper.setTo(addressee);
                helper.setSubject(subject);
                helper.setText(content, true);
                if (!cc.isEmpty()) {
                    String[] sup = cc.toArray(new String[cc.size()]);
                    helper.setCc(sup);
                }
                jms.send(mimeMessage);
            }
        } catch (MessagingException e) {
            System.out.println(e);
        }


    }

    /**
     * 发送带附件的邮件
     *
     * @param to       收件人地址
     * @param subject  邮件主题
     * @param content  邮件内容
     * @param filePath 附件地址
     * @param cc       抄送地址
     */
    @Override
    public void sendAttachmentsMail(List<String> to, String subject, String content, List<String> filePath, List<String> cc) {
        JavaMailSenderImpl jms = getMailSender();
        MimeMessage mimeMessage = jms.createMimeMessage();
        MimeMessageHelper helper;

        try {
            helper = new MimeMessageHelper(mimeMessage, true);
            for (String address : to) {
                helper.setFrom(from);
                helper.setTo(address);
                helper.setSubject(subject);
                helper.setText(content, true);
                if (!cc.isEmpty()) {
                    helper.setCc(cc.toString());
                }
                for (String attachment : filePath) {
                    FileSystemResource file = new FileSystemResource(new File(attachment));
                    String fileName = attachment.substring(filePath.lastIndexOf(File.separator));
                    helper.addAttachment(fileName, file);
                }

                jms.send(mimeMessage);
            }
        } catch (MessagingException e) {
            System.out.println(e);
        }


    }

    /**
     * 发送正文中有静态资源的邮件
     *
     * @param to      收件人地址
     * @param subject 邮件主题
     * @param content 邮件内容
     * @param rscPath 静态资源地址
     * @param rscId   静态资源id
     * @param cc      抄送地址
     */
    @Override
    public void sendResourceMail(List<String> to, String subject, String content, String rscPath, String rscId, List<String> cc) {
        JavaMailSenderImpl jms = getMailSender();
        MimeMessage mimeMessage = jms.createMimeMessage();
        MimeMessageHelper helper;
        try {
            helper = new MimeMessageHelper(mimeMessage, true);
            for (String address : to) {

                helper.setFrom(from);
                helper.setTo(address);
                helper.setSubject(subject);
                helper.setText(content, true);
                if (!cc.isEmpty()) {
                    helper.setCc(cc.toString());
                }
                FileSystemResource res = new FileSystemResource(new File(rscPath));
                helper.addInline(rscId, res);

                jms.send(mimeMessage);
            }
        } catch (MessagingException e) {
            System.out.println(e);
        }


    }

    public JavaMailSenderImpl getMailSender() {
        List<VwEmailServer> list = vwEmailServerService.selectVwEmailServerList(new VwEmailServer());
        VwEmailServer emailServer = list.get(0);

        JavaMailSenderImpl jms = new JavaMailSenderImpl();
        //邮件服务器主机
        jms.setHost(emailServer.getHost());
        //邮件服务器端口
        jms.setPort(emailServer.getPort());
        //邮箱账号
        jms.setUsername(emailServer.getUsername());
        //邮箱密码
        jms.setPassword(emailServer.getPassword());
        //邮件协议 这里用的 smtp
        jms.setProtocol(emailServer.getProtocol());
        //编码
        jms.setDefaultEncoding(emailServer.getEncoding());
        Properties p = new Properties();
        p.setProperty("mail.smtp.auth", "true");
        p.setProperty("mail.smtp.starttls.enable", "true");
        p.setProperty("mail.smtp.starttls.required", "true");
        p.setProperty("mail.smtp.ssl.enable", "false");
        //这里填发送邮箱对应的SMTP地址 ,忽略证书,信任域名
        p.setProperty("mail.smtp.ssl.trust", emailServer.getHost());
        p.setProperty("mail.display.sendmail", "邮件发送");
        jms.setJavaMailProperties(p);

        from = emailServer.getUsername();

        return jms;
    }

}

邮件发送

public class SendEmail {

    @Autowired
    private TemplateEngine templateEngine;

    @Autowired
    private IVwEmailService vwEmailService;

    @Autowired
    private ISysFileInfoService sysFileInfoService;

    @Autowired
    private SmtpMailService smtpMailService;

    /**
     * 发送文本邮件
     * 含抄送人
     *
     * @param subject 邮件主题
     * @param content 邮件内容
     * @throws Exception 邮件发送异常
     */
    public void sendTextEmailByCC(String subject, String content) throws Exception {
        //收件人
        List<String> to = vwEmailService.selectEmailByReceivingType(ReceivingType.RECIPIENT.getCode());

        //抄送人
        List<String> cc = vwEmailService.selectEmailByReceivingType(ReceivingType.CC_TO.getCode());

        smtpMailService.sendSimpleMail(to, subject, content, cc);

    }

    /**
     * 发送HTML模板邮件
     * 含抄送人
     *
     * @throws Exception 邮件发送异常
     */
    public void sendHtmlEmailByCC() throws Exception {
        //收件人
        List<String> to = vwEmailService.selectEmailByReceivingType(ReceivingType.RECIPIENT.getCode());

        //抄送人
        List<String> cc = vwEmailService.selectEmailByReceivingType(ReceivingType.CC_TO.getCode());

        //获取邮件vo
        FromEmailVo vo = getfromEmailVo();
        // 通过 Context 构造模版中变量需要的值
        Context context = new Context();
        context.setVariable("email", vo);
        //模版进行渲染
        String emailTemplate = emailTemplate(context);

        smtpMailService.sendHtmlMail(to, DateUtils.datePath() + " 农安试验场原始数据上传情况", emailTemplate, cc);

    }

    /**
     * 发送附件邮件
     * 含抄送人
     *
     * @param subject    邮件主题
     * @param content    邮件内容
     * @param attachment 附件
     * @throws Exception 邮件发送异常
     */
    public void sendAttachmentByCC(String subject, String content, List<String> attachment) throws Exception {
        //收件人
        List<String> to = vwEmailService.selectEmailByReceivingType(ReceivingType.RECIPIENT.getCode());

        //抄送人
        List<String> cc = vwEmailService.selectEmailByReceivingType(ReceivingType.CC_TO.getCode());

        smtpMailService.sendAttachmentsMail(to, subject, content, attachment, cc);
    }

    /**
     * 获取封装的邮件vo
     *
     * @return
     */
    public FromEmailVo getfromEmailVo() throws Exception {
        String uploadPath = RuoYiConfig.getUploadPath();
        List<SysFileInfo> sysFileInfos = sysFileInfoService.selectFileName();
        List<EmailDataVo> gpsList = new ArrayList<>();
        Long amount = 0L;
        for (SysFileInfo fi : sysFileInfos) {
            File file = new File(uploadPath + File.separator + fi.getExperimentName() + File.separator + "log" + File.separator + fi.getFileTime());
            //判断当天是否上传过数据
            if (file.exists() && file.isDirectory()) {
                //获取文件夹大小
                long totalSizeOfFilesInDir = getTotalSizeOfFilesInDir(file);
                Double fileSizeMb = YmlUtil.getFileSizeMb(totalSizeOfFilesInDir);
                amount += totalSizeOfFilesInDir;

                EmailDataVo vo = new EmailDataVo();
                vo.setCode(fi.getExperimentName());
                vo.setCodeUrl(fi.getExperimentName() + "/" + "log");
                vo.setGpsUrl(fi.getExperimentName() + "/" + "log" + "/" + fi.getFileTime());
                vo.setDate(fi.getFileTime());
                vo.setFolderSize(fileSizeMb);
                gpsList.add(vo);
            }
        }

        FromEmailVo vo = new FromEmailVo();
        //字节转换
        String fileSize = YmlUtil.getFileSizeString(amount);
        vo.setAmount(fileSize);
        vo.setDate(DateUtils.datePath());

        List<EmailDataVo> list = new ArrayList<>();

        for (EmailDataVo gp : gpsList) {
            EmailDataVo ed = new EmailDataVo();
            ed.setCode(gp.getCode());
            //外部链接
            ed.setCodeUrl("https://www.baidu.com");
            ed.setDate(gp.getDate());
            //外部链接
            ed.setDateUrl("https://www.baidu.com");
            ed.setTrace(gp.getTrace());
            ed.setFolderSize(gp.getFolderSize());
            ed.setMigrations("迁移完成 Upload Finished");
            list.add(ed);
        }

        vo.setList(list);

        return vo;
    }

    /**
     * 返回文件或文件夹大小
     *
     * @param file
     * @return
     */
    private long getTotalSizeOfFilesInDir(File file) {
        if (file.isFile()) {
            return file.length();
        }
        final File[] children = file.listFiles();
        long total = 0;
        if (children != null) {
            for (final File child : children) {
                total += getTotalSizeOfFilesInDir(child);
            }

        }
        return total;
    }

    /**
     * html模板转字符串
     *
     * @param context
     * @return
     */
    public String emailTemplate(Context context) {
        // 使用TemplateEngine 对模版进行渲染(Thymeleaf 模版默认位置是 resources/templates)
        String template = "template/email-template.html";
        return templateEngine.process(template, context);
    }

}

结果

猜你喜欢

转载自blog.csdn.net/weixin_50272584/article/details/130621421