zoukankan      html  css  js  c++  java
  • springboot2 整合发送邮件的功能

    1,你需要申请一个邮箱

    1,申请一个 163 的邮箱并登入,这个很简单

    2,如下图进入设置

    3,确定下图中的选项为开启状态,切记,开启功能的时候,系统会给你分配一个授权码,只会显示一次,一定要记录下来

    2,SpringBoot 框架整合

    1,pom.xml

    <!-- FreeMarker 模板引擎,用于生成邮件内容 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-freemarker</artifactId>
    </dependency>
    <!-- 邮件发送的依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
    

    2,application.yml

    spring:
      freemarker:
        enabled: true
        cache: true
        content-type: text/html
        charset: UTF-8
        check-template-location: true
        template-loader-path: classpath:templates
        # prefix:
        suffix: .ftl
        prefer-file-system-access: true
        allow-request-override: false
        allow-session-override: false
        expose-request-attributes: false
        expose-session-attributes: false
        expose-spring-macro-helpers: false
      mail:
        host: smtp.163.com
        username: 你的邮箱账号
        password: 授权码(注意,不是邮箱的密码)
    

    3,封装一个文件类,在发送附件和静态资源的时候使用

    package com.hwq.common.vo;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import java.io.File;
    
    @Getter
    @Setter
    public class MailFileVo {
    
        /**
         * 1,当作为静态资源时,代表资源的唯一标识,可以插入到 html 内容中,如 img 标签的 src 属性
         * 2,当作为附件时,作为附件的名称
         */
        private String name;
    
        /**
         * 文件对象,可以是附件也可以是静态资源
         */
        private File file;
    
    }
    

    4,封装一个发送邮件的类,

    package com.hwq.web.server.service;
    
    import com.hwq.common.vo.MailFileVo;
    import org.apache.commons.collections4.CollectionUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.stereotype.Service;
    
    import javax.mail.Address;
    import javax.mail.Message;
    import javax.mail.MessagingException;
    import javax.mail.internet.InternetAddress;
    import javax.mail.internet.MimeMessage;
    import java.util.List;
    
    @Service
    public class MailService {
    
        @Autowired
        private JavaMailSender mailSender;
    
        @Value("${spring.mail.username}")
        private String fromMail;
    
        /**
         * 发送邮件的方法
         *
         * 三种收件人模式的解释
         * 1,Message.RecipientType.TO  直接接收人
         * 2,Message.RecipientType.CC  明抄送收件人
         * 3,Message.RecipientType.BCc 暗抄送收件人(不会 被直接收件人 和 明抄送收件人 看见的收件人)
         *
         * @param toAddr  收件人的 邮件地址
         * @param ccAddr  抄送人的 邮件地址
         * @param subject 邮件标题
         * @param html    邮件内容
         * @param srcVos  静态资源类
         * @param athVos  附件资源类
         */
        public void sendMail(String[] toAddr, String[] ccAddr, String subject, String html, List<MailFileVo> srcVos, List<MailFileVo> athVos) {
            try {
                MimeMessage message = mailSender.createMimeMessage();
                MimeMessageHelper helper = new MimeMessageHelper(message, true);
                helper.setFrom(fromMail);
                helper.setSubject(subject); 
                helper.setText(html, true); 
                if (toAddr != null && toAddr.length > 0) {
                    Address[] addresses = new Address[toAddr.length];
                    for (int i = 0; i < toAddr.length; i ++) {
                        addresses[i] = new InternetAddress(toAddr[i]);
                    }
                    message.setRecipients(Message.RecipientType.TO, addresses);
                }
                if (ccAddr != null && ccAddr.length > 0) {
                    Address[] addresses = new Address[ccAddr.length];
                    for (int i = 0; i < ccAddr.length; i ++) {
                        addresses[i] = new InternetAddress(ccAddr[i]);
                    }
                    message.setRecipients(Message.RecipientType.CC, addresses);
                }
                if (CollectionUtils.isNotEmpty(srcVos)) {
                    for (MailFileVo srcVo : srcVos) {
                        helper.addInline(srcVo.getName(), srcVo.getFile());
                    }
                }
                if (CollectionUtils.isNotEmpty(athVos)) {
                    for (MailFileVo athVo : athVos) {
                        helper.addAttachment(athVo.getName(), athVo.getFile());
                    }
                }
                mailSender.send(message);
            } catch (MessagingException ex) {
                ex.printStackTrace();
                throw new RuntimeException(ex.getMessage());
            }
        }
    
    }
    

    5,准备一个邮件模板,mail.ftl

    <style type="text/css">
        .mail-table {
             100%;
            border-top: 1px solid #333;
            border-left: 1px solid #333;
            border-collapse: collapse;
            border-spacing: 0;
        }
        .mail-table tr {
    
        }
        .mail-table th {
            background: rgb(255, 204, 204);
            height: 40px;
            border-bottom: 1px solid #333;
            border-right: 1px solid #333;
        }
        .mail-table td {
            height: 36px;
            text-indent: 14px;
            border-bottom: 1px solid #333;
            border-right: 1px solid #333;
        }
    </style>
    
    <h3>${title}</h3>
    <table class="mail-table">
        <tr>
            <th>序号</th>
            <th>账号</th>
            <th>昵称</th>
        </tr>
        <#list users as user>
        <tr>
            <td>${user_index + 1}</td>
            <td>${user.account}</td>
            <td>${user.nickname}</td>
        </tr>
        </#list>
    </table>
    <!-- 图片地址固定为 cid:封装的 MailFileVo 的 name 属性 -->
    <img src="cid:battle-field" />
    

    6,测试,写一个控制器发送邮件

    package com.hwq.web.server.controller;
    
    import com.hwq.common.data.entity.User;
    import com.hwq.common.util.HttpUtil;
    import com.hwq.common.vo.MailFileVo;
    import com.hwq.web.server.service.MailService;
    import freemarker.template.Configuration;
    import freemarker.template.Template;
    import freemarker.template.TemplateException;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.http.ResponseEntity;
    import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @RequestMapping("mail")
    @RestController
    public class MailController {
    
        @Autowired
        private MailService mailService;
        @Autowired
        private Configuration configuration;
    
        @Value("${file.save.location}")
        private String rootPath; // 这是你静态资源存放的根路径,从配置文件读取
    
        @RequestMapping("/send")
        public ResponseEntity<Object> sendSimpleMail() throws IOException, TemplateException {
            Template template = configuration.getTemplate("mail.ftl");
            Map<String, Object> model = new HashMap<>();
            List<User> users = new ArrayList<>();
            for (int i = 0; i < 10; i ++) {
                User user = new User();
                user.setAccount("102020200" + i);
                user.setNickname("张三李四" + i);
    
                users.add(user);
            }
            model.put("title", "测试的邮件");
            model.put("users", users);
            String[] toAddr = new String[] {"huangweiqiang@ysstech.com"};
            String[] ccAddr = new String[] {"524086452@qq.com"};
            String subject = "测试邮件,别当真";
            String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
    
    
            List<MailFileVo> srcVos = new ArrayList<>();
            MailFileVo mailFileSrc = new MailFileVo();
            mailFileSrc.setName("battle-field");
            mailFileSrc.setFile(new File(rootPath + "/static/battle-field.jpg"));
            srcVos.add(mailFileSrc);
    
            List<MailFileVo> athVos = new ArrayList<>();
            MailFileVo mailFileAth = new MailFileVo();
            mailFileAth.setName("你的附件.txt");
            mailFileAth.setFile(new File(rootPath + "/static/fu-jian.txt"));
            athVos.add(mailFileAth);
    
            // return HttpUtil.r200(html);
    
            mailService.sendMail(toAddr, ccAddr, subject, html, srcVos, athVos);
            return HttpUtil.r200("发送成功");
        }
    }
    

    3,浏览器访问 http:ip:port/mail/port

  • 相关阅读:
    (深入理解计算机系统)内存对齐
    (深入理解计算机系统)AT&T汇编指令
    (深入理解计算机系统)编译,链接和装载
    (C)struct结构体指针
    (linux)BSP板级支持包开发理解
    TortoiseSVN使用笔记
    (linux)idr(integer ID management)机制
    (linux)struct inode 和 struct file
    cygwin使用笔记
    Zookeeper学习总结
  • 原文地址:https://www.cnblogs.com/lovling/p/12761001.html
Copyright © 2011-2022 走看看