Skip to content

Latest commit

 

History

History
246 lines (245 loc) · 12.1 KB

SpringBoot整合Mail发送邮件.md

File metadata and controls

246 lines (245 loc) · 12.1 KB
1.相关名词解释:
    POP3: Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人
        计算机连接到Internet的邮件服务器和下载电子邮件的电子协议;它是因特网
        电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地
        主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器
        则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的;
    SMTP: 全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议;它是一组
        用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式;SMTP
        协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个
        目的地;SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器;
        简单地说就是,要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器;
    IMAP: 全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3
        类似邮件访问标准协议之一;不同的是,开启了IMAP后,您在电子邮件客户端收取
        的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:
        删除邮件,标记已读等,服务器上的邮件也会做相应的动作;所以无论从浏览器
        登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的;
    IMAP和POP3有什么区别:
        POP3协议允许电子邮件客户端下载服务器上的邮件,但在客户端的操作(如移动
            邮件、标记已读等),不会反馈到服务器上;
        IMAP提供webmail与电子邮件客户端之间的双向通信,客户端的操作都会反馈到
            服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作;
        IMAP为用户带来更为便捷和可靠的体验;POP3更易丢失邮件或多次下载相同的邮件;
    免费邮箱客户端授权码:
        邮箱客户端授权码是为了避免您的邮箱密码被盗后,盗号者通过客户端登录邮箱
            而独特设计的安防功能;
        可以针对邮箱客户端设置唯一随机授权码,使用此授权码代替邮箱密码登录邮箱;
2.引入mail依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
3.在application.yml中添加邮件相关的配置: 
    [1]QQ邮箱配置: application-qq.yml(已测试成功)
        spring:
            mail:
                host: smtp.qq.com           #发送邮件服务器
                username: xxxxxx@qq.com     #QQ邮箱
                #授权码参考:https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28
                password: xxxxxx            #客户端授权码
                protocol: smtp              #发送邮件协议
                default-encoding: utf-8     #编码格式
                properties:
                    mail:
                        smtp:
                            auth: true        #开启认证
                            port: 465         #端口号465(开启SSL时)或587(不开启SSL时)
                            ssl:
                                enable: true  #开启SSL(使用587端口时无法连接QQ邮件服务器)
                        starttls:
                            enable: true      #需要TLS认证 保证发送邮件安全验证
                            required: true
    [2]网易系(126/163/yeah)邮箱配置: application-126/163/yeah.yml(已测试成功)
        spring:
            mail:
                host: smtp.163.com            #发送邮件服务器(smtp.126/163/yeah.com)
                username: xxx@163.com         #126/163/yeah邮箱(xx@126/163/yeah.com)
                #授权码参考:http://help.mail.163.com/faq.do?m=list&categoryID=197
                password: xxxxxxxx              #客户端授权码
                protocol: smtp
                default-encoding: utf-8         #编码格式
                properties:
                    mail:
                        smtp:
                            auth: true           #开启认证
                            port: 994            #465或者994
                            starttls:
                                enable: true     #需要TLS认证 保证发送邮件安全验证
                                required: true
                            ssl:
                                enable: true    #开启SSL
    [3]在application.yml中通过spring.profiles.active属性来选择使用哪套配置:
        spring:
            profiles:
                active: qq
4.发送简单的邮件:
    [1]编写Controller:
        @RestController
        @RequestMapping("/email")
        public class EmailController {
            @Autowired
            private JavaMailSender javaMailSender;
            @Value("${spring.mail.username}")
            private String from;
            @RequestMapping("sendSimpleEmail")
            public String sendSimpleEmail(){
                try {
                    SimpleMailMessage message = new SimpleMailMessage();
                    message.setFrom(from);
                    message.setTo("xxxxxx@163.com");                    // 接收地址
                    message.setSubject("一封简单的邮件");               // 标题
                    message.setText("使用Spring Boot发送简单邮件。");   // 内容
                    javaMailSender.send(message);
                    return "发送成功!";
                }catch (Exception e){
                    e.printStackTrace();
                    return e.getMessage();
                }
            }
        }
    [2]访问测试: http://localhost:8080/email/sendSimpleEmail
5.发送HTML格式的邮件:
    [1]编写Controller:
        @RestController
        @RequestMapping("/email")
        public class EmailController {
            @Autowired
            private JavaMailSender javaMailSender;
            @Value("${spring.mail.username}")
            private String from;
            @RequestMapping("sendHtmlEmail")
            public String sendHtmlEmail(){
                MimeMessage message = null;
                try {
                    message = javaMailSender.createMimeMessage();
                    MimeMessageHelper helper = new MimeMessageHelper(message,true);
                    helper.setFrom(from);
                    helper.setTo("xxxxxx@163.com");
                    helper.setSubject("一封HTML格式的邮件");
                    // 带HTML格式的内容
                    StringBuffer buffer = new StringBuffer("<p style='color:#42b983'>使用Spring Boot发送HTML格式邮件。</p>");
                    helper.setText(buffer.toString(),true);
                    javaMailSender.send(message);
                    return "发送成功!";
                }catch (Exception e){
                    e.printStackTrace();
                    return e.getMessage();
                }
            }
        }
    [2]访问测试: http://localhost:8080/email/sendHtmlEmail
6.发送带附件的邮件:
    [1]编写Controller:
        @RestController
        @RequestMapping("/email")
        public class EmailController {
            @Autowired
            private JavaMailSender javaMailSender;
            @Value("${spring.mail.username}")
            private String from;
            @RequestMapping("sendAttachmentsMail")
            public String sendAttachmentsMail(){
                MimeMessage message = null;
                try {
                    message = javaMailSender.createMimeMessage();
                    MimeMessageHelper helper = new MimeMessageHelper(message,true);
                    helper.setFrom(from);
                    helper.setTo("xxxxxx@163.com");
                    helper.setSubject("一封带附件的邮件");
                    helper.setText("详情参见附件内容!");
                    // 传入附件
                    FileSystemResource file = new FileSystemResource(new File("src/main/resources/static/file/项目文档.docx"));
                    helper.addAttachment("项目文档.docx",file);
                    javaMailSender.send(message);
                    return "发送成功!";
                }catch (Exception e){
                    e.printStackTrace();
                    return e.getMessage();
                }
            }
        }
    [2]访问测试: http://localhost:8080/email/sendAttachmentsMail    
7.发送带静态资源的邮件:
    [1]编写Controller:
        @RestController
        @RequestMapping("/email")
        public class EmailController {
            @Autowired
            private JavaMailSender javaMailSender;
            @Value("${spring.mail.username}")
            private String from;
            @RequestMapping("sendInlineMail")
            public String sendInlineMail(){
                MimeMessage message = null;
                try {
                    message = javaMailSender.createMimeMessage();
                    MimeMessageHelper helper = new MimeMessageHelper(message,true);
                    helper.setFrom(from);
                    helper.setTo("xxxxxx@163.com");
                    helper.setSubject("一封带静态资源的邮件");
                    helper.setText("<html><body>很优秀:<img src='cid:img'/></body></html>",true);
                    // 传入附件
                    FileSystemResource file = new FileSystemResource(new File("src/main/resources/static/img/优秀.jpg"));
                    // helper.addInline("img", file);中的img和图片标签里cid后的名称相对应
                    helper.addInline("img",file);
                    javaMailSender.send(message);
                    return "发送成功!";
                }catch (Exception e){
                    e.printStackTrace();
                    return e.getMessage();
                }
            }
        }
    [2]访问测试: http://localhost:8080/email/sendInlineMail
8.使用模板发送邮件: (使用的模板解析引擎为Thymeleaf)
    [1]引入Thymeleaf依赖:
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
    [2]在template目录下创建一个emailTemplate.html模板:
        <!DOCTYPE html>
        <html lang="zh" xmlns:th="http://www.thymeleaf.org">
        <head>
            <meta charset="UTF-8" />
            <title>模板</title>
        </head>
        
        <body>
            您好,您的验证码为<span th:text="${code}"></span>,请在两分钟内使用完成操作。
        </body>
        </html>
    [3]编写Controller: (发送HTML邮件+变量绑定)
        @RestController
        @RequestMapping("/email")
        public class EmailController {
            @Autowired
            private JavaMailSender javaMailSender;
            @Autowired
            private TemplateEngine engine;
            @Value("${spring.mail.username}")
            private String from;
            @RequestMapping("sendTemplateEmail")
            public String sendTemplateEmail(String code){
                MimeMessage message = null;
                try {
                    message = javaMailSender.createMimeMessage();
                    MimeMessageHelper helper = new MimeMessageHelper(message,true);
                    helper.setFrom(from);
                    helper.setTo("xxxxxx@163.com");
                    helper.setSubject("邮件摸板测试");
                    // 处理邮件模板
                    Context context = new Context();
                    context.setVariable("code",code);
                    String template = engine.process("emailTemplate", context);
                    helper.setText(template,true);
                    javaMailSender.send(message);
                    return "发送成功!";
                }catch (Exception e){
                    e.printStackTrace();
                    return e.getMessage();
                }
            }
        }
    [4]访问测试: http://localhost:8080/email/sendTemplateEmail?code=123456