一、邮件相关知识补充

  • SMTP(Simple Mail Transfer Protocol)

即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP协议属于TCP/IP协议族,它帮助每台计算机在发送或中转信件时找到下一个目的地。通过SMTP协议所指定的服务器,就可以把E-mail寄到收信人的服务器上了,整个过程只要几分钟。SMTP服务器则是遵循SMTP协议的发送邮件服务器,用来发送或中转发出的电子邮件。

在传输邮件过程中使用标准服务端口:25号端口

  • SMTP的工作方式

首先发送SMTP在接到用户的邮件请求后,判断此邮件是否为本地邮件,若是直接投送到用户的邮箱,否则向dns查询远端邮件服务器的MX纪录,并建立与远端接收SMTP之间的一个双向传送通道,此后SMTP命令由发送SMTP发出,由接收SMTP接收,而应答则反方面传送。一旦传送通道建立,SMTP发送者发送MAIL命令指明邮件发送者。如果SMTP接收者可以接收邮件则返回OK应答。SMTP发送者再发出RCPT命令确认邮件是否接收到。如果SMTP接收者接收,则返回OK应答;如果不能接收到,则发出拒绝接收应答(但不中止整个邮件操作),双方将如此重复多次。当接收者收到全部邮件后会接收到特别的序列,如果接收者成功处理了邮件,则返回OK应答即可。

  • POP3(Post Office Protocol 3)

即邮局协议的第3个版本,它是规定个人计算机如何连接到互联网上的邮件服务器进行收发邮件的协议。它是因特网电子邮件的第一个离线协议标准,POP3协议允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时根据客户端的操作删除或保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。POP3协议是TCP/IP协议族中的一员。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。

POP3使用标准默认端口:110号端口

  • IMAP4(Internet Message Access Protocol 4)

交互式数据消息访问协议第四个版本,它与POP3协议一样也是规定个人计算机如何访问互联网上的邮件服务器进行收发邮件的协议,但是IMAP4协议同POP3协议相比更高级。IMAP4协议支持客户机在线或者离线访问并阅读服务器上的邮件,还能交互式的操作服务器上的邮件。IMAP4协议更人性化的地方是不需要像POP3协议那样把邮件下载到本地,用户可以通过客户端直接对服务器上的邮件进行操作(这里的操作是指:在线阅读邮件

在线查看邮件主题 大小 发件地址等信息)。用户还可以在服务器上维护自己邮件目录(维护是指移动 新建 删除 重命名 共享 抓取文本

等操作)。IMAP4协议弥补了POP3协议的很多缺陷。本协议是用于客户机远程访问服务器上电子邮件,它是邮件传输协议新的标准。

IMAP4协议的默认端口:143号端口

IMAP4也支持ASCII码明文传输密码。

二、整合邮件

  1. 添加依赖
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>
  2. 添加邮箱配置
    spring:
    mail:
    default-encoding: UTF-8
    host: smtp.163.com //邮箱服务器地址
    password: xxyyooo //密码
    username: xxx@oo.com //用户名
  3. 编写MailService
    package top.xtslife.mail.email;
    
    /**
    * @Author 小涛
    * @Create 2019/8/19 9:52
    */
    public interface MailService {
    /**
    * 简单邮件
    * @param to
    * @param subject
    * @param content
    */
    void sendSimpleMail(String to,String subject,String content); /**
    * html邮件
    * @param to
    * @param subject
    * @param content
    */
    void sendHtmlMail(String to, String subject, String content); /**
    * 发送带附件的邮件
    * @param to
    * @param subject
    * @param content
    * @param filePath
    */
    void sendAttachmentsMail(String to, String subject, String content, String filePath); /**
    * 发送带静态资源的邮件
    * @param to
    * @param subject
    * @param content
    * @param rscPath
    * @param rscId
    */
    void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId);
    }
  4. 编写MailSetviceImpl
    package top.xtslife.mail.email;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.core.io.FileSystemResource;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.mail.javamail.MimeMailMessage;
    import org.springframework.mail.javamail.MimeMessageHelper;
    import org.springframework.stereotype.Component;
    import org.springframework.stereotype.Service; import javax.mail.MessagingException;
    import javax.mail.internet.MimeMessage;
    import java.io.File; /**
    * @Author 小涛
    * @Create 2019-08-19 9:40
    */
    @Component
    public class MailServiceImpl implements MailService {
    private final Logger LOGGER = LoggerFactory.getLogger(MailServiceImpl.class);
    @Autowired
    private JavaMailSender mailSender; @Value("${spring.mail.username}")
    private String from;
    // 简单邮件
    public void sendSimpleMail(String to,String subject,String content){
    // 创建简单邮件会话类
    SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
    // 设置发送人
    simpleMailMessage.setFrom(from);
    // 设置接收人
    simpleMailMessage.setTo(to);
    // 设置主题
    simpleMailMessage.setSubject(subject);
    // 设置内容
    simpleMailMessage.setText(content);
    try{
    mailSender.send(simpleMailMessage);
    LOGGER.info("简单邮件已经发送...");
    }catch (Exception e){
    LOGGER.error("发送简单邮件时异常",e);
    } } //HTML邮件
    @Override
    public void sendHtmlMail(String to, String subject, String content) {
    // 为底层JavaMail会话创建一个新的JavaMail MimeMessage
    MimeMessage mimeMessage = mailSender.createMimeMessage();
    try {
    MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
    mimeMessageHelper.setFrom(from);
    mimeMessageHelper.setTo(to);
    mimeMessageHelper.setSubject(subject);
    mimeMessageHelper.setText(content,true);
    mailSender.send(mimeMessage);
    LOGGER.info("html邮件发送成功");
    } catch (MessagingException e) {
    LOGGER.error("发送HTML邮件时发生异常",e);
    } } // 包含附件的邮件
    @Override
    public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
    MimeMessage mimeMessage = mailSender.createMimeMessage();
    try {
    MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
    mimeMessageHelper.setFrom(from);
    mimeMessageHelper.setTo(to);
    mimeMessageHelper.setSubject(subject);
    mimeMessageHelper.setText(content,true); FileSystemResource fileSystemResource = new FileSystemResource(new File(filePath));
    String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
    mimeMessageHelper.addAttachment(fileName,fileSystemResource);
    mailSender.send(mimeMessage);
    LOGGER.info("带附件的邮件已经发送");
    } catch (MessagingException e) {
    LOGGER.error("发送带附件的邮件发生异常",e);
    } } // 包含静态资源的邮件
    @Override
    public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {
    MimeMessage mimeMessage = mailSender.createMimeMessage();
    try {
    MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
    mimeMessageHelper.setFrom(from);
    mimeMessageHelper.setTo(to);
    mimeMessageHelper.setSubject(subject);
    mimeMessageHelper.setText(content,true); FileSystemResource res = new FileSystemResource(new File(rscPath));
    mimeMessageHelper.addInline(rscId, res);
    mailSender.send(mimeMessage);
    LOGGER.info("嵌入静态资源的邮件已经发送。");
    } catch (MessagingException e) {
    LOGGER.error("发送嵌入静态资源的邮件时发生异常!", e);
    } }
    }
  5. 编写相关测试类
    package top.xtslife.mail;
    
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    import org.thymeleaf.ITemplateEngine;
    import org.thymeleaf.context.Context;
    import top.xtslife.mail.email.MailService; @RunWith(SpringRunner.class)
    @SpringBootTest
    public class MailApplicationTests { @Autowired
    private MailService mailServiceImpl;
    @Autowired
    private ITemplateEngine templateEngine; @Test
    public void testSimpleMail(){
    mailServiceImpl.sendSimpleMail("710612280@qq.com","简单邮件测试","myfirst email:hello world");
    } @Test
    public void testHtmlMail(){
    String content = "<html>\n" +
    "<body>\n" +
    " <h3>hello world ! 这是一封Html邮件!</h3>\n" +
    "</body>\n" +
    "</html>";
    mailServiceImpl.sendHtmlMail("710612280@qq.com","html邮件测试",content);
    } @Test
    public void sendAttachmentsMail(){
    String filepath = "E:\\Snipaste_2019-08-15_17-28-01.png";
    mailServiceImpl.sendAttachmentsMail("710612280@qq.com","带附件的邮件","这个是我的带附件的邮件",filepath);
    } @Test
    public void sendInlineResourceMail() {
    String rscId = "neo006";
    String content="<html><body>这是有图片的邮件:<img src=\'cid:" + rscId + "\' ></body></html>";
    String imgPath = "E:\\Snipaste_2019-08-15_17-28-01.png"; mailServiceImpl.sendInlineResourceMail("710612280@qq.com", "主题:这是有图片的邮件", content, imgPath, rscId);
    } @Test
    public void sendTemplateMail() {
    //创建邮件正文
    Context context = new Context();
    context.setVariable("id", "006");
    String emailContent = templateEngine.process("emailTemplate", context); mailServiceImpl.sendHtmlMail("710612280@qq.com","主题:这是模板邮件",emailContent);
    }
    }

    三、邮件模板

    1. 添加依赖

      <!--thymeleaf-->
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
      </dependency>
      <!--freemarker-->
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-freemarker</artifactId>
      </dependency>
    2. 在 resorces/templates 下创建 模板(例emailTemplate.html)

      <!DOCTYPE html>
      <html lang="zh" xmlns:th="http://www.thymeleaf.org">
      <head>
      <meta charset="UTF-8"/>
      <title>Title</title>
      </head>
      <body>
      您好,这是验证邮件,请点击下面的链接完成验证,<br/>
      <a href="#" th:href="@{ http://www.ityouknow.com/neo/{id}(id=${id}) }">激活账号</a>
      </body>
      </html>

      注:这里使用的是thymeleaf模板引擎

    3. 解析模板并发送

      @Test
      public void sendTemplateMail() {
      //创建邮件正文
      Context context = new Context();
      context.setVariable("id", "006");
      String emailContent = templateEngine.process("emailTemplate", context); mailService.sendHtmlMail("710612280@qq.com","主题:这是模板邮件",emailContent);
      }

    四、其他知识

    • 发送失败

      因为各种原因,总会有邮件发送失败的情况,比如:邮件发送过于频繁、网络异常等。在出现这种情况的时候,我们一般会考虑重新重试发送邮件,会分为以下几个步骤来实现:

      • 1、接收到发送邮件请求,首先记录请求并且入库。
      • 2、调用邮件发送接口发送邮件,并且将发送结果记录入库。
      • 3、启动定时系统扫描时间段内,未发送成功并且重试次数小于3次的邮件,进行再次发送
    • 异步发送

      很多时候邮件发送并不是我们主业务必须关注的结果,比如通知类、提醒类的业务可以允许延时或者失败。这个时候可以采用异步的方式来发送邮件,加快主交易执行速度,在实际项目中可以采用MQ发送邮件相关参数,监听到消息队列之后启动发送邮件

springboot整合邮件的更多相关文章

  1. Springboot】Springboot整合邮件服务(HTML/附件/模板-QQ、网易)

    介绍 邮件服务是常用的服务之一,作用很多,对外可以给用户发送活动.营销广告等:对内可以发送系统监控报告与告警. 本文将介绍Springboot如何整合邮件服务,并给出不同邮件服务商的整合配置. 如图所 ...

  2. springboot系列九,springboot整合邮件服务、整合定时任务调度

    一.整合邮件服务 如果要进行邮件的整合处理,那么你一定需要有一个邮件服务器,实际上 java 本身提供有一套 JavaMail 组件以实现邮件服务器的搭建,但是这个搭建的服务器意义不大,因为你现在搭建 ...

  3. SpringBoot整合邮件发送

    本节介绍SpringBoot项目如何快速配置和发送邮件,包括简单的邮件配置.发送简单邮件.发送HTML邮件.发送携带附件的邮件等. 示例源码在:https://github.com/laolunsi/ ...

  4. springboot整合邮件发送(163邮箱发送为例)

    先登录163邮箱获取授权  勾选后安装提示会叫你设置授权密码之类的:记住授权的密码 1.引入maven依赖 <dependency> <groupId>org.springfr ...

  5. SpringBoot 整合邮件oh-my-email 实现发送邮件功能

    导读 最近手头上要负责整个Message Gateway服务的搭建,涉及到:微信推送(点我直达).短信.邮件等等,到github上发现有个微型的开源邮件框架,整理下来,以备项目中使用到,到时候应该会使 ...

  6. SpringBoot系列九:SpringBoot服务整合(整合邮件服务、定时调度、Actuator监控)

    声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 服务整合 2.背景 在进行项目开发的时候经常会遇见以下的几个问题:需要进行邮件发送.定时的任务调 ...

  7. SpringBoot整合Mail发送邮件&发送模板邮件

    整合mail发送邮件,其实就是通过代码来操作发送邮件的步骤,编辑收件人.邮件内容.邮件附件等等.通过邮件可以拓展出短信验证码.消息通知等业务. 一.pom文件引入依赖 <dependency&g ...

  8. SpringBoot 整合 Shiro 密码登录与邮件验证码登录(多 Realm 认证)

    导入依赖(pom.xml)  <!--整合Shiro安全框架--> <dependency> <groupId>org.apache.shiro</group ...

  9. SpringBoot整合篇

    目录 SpringBoot整合篇 SpringBoot简介 SpringBoot运行 SpringBoot目录结构 整合JdbcTemplate @RestController 整合JSP 整合JPA ...

随机推荐

  1. 教你用好 Javascript 数组

    原文链接:https://juejin.im/post/5d9769b26fb9a04df26c1b89 作为 Javascript 的标准对象之一,数组是非常底层而且实用的数据结构.虽然结构很简单, ...

  2. UOJ Easy Round #5

    Preface 本着刷遍(只刷一遍)各大OJ的原则我找到了一场UOJ的比赛 无奈UOJ一般的比赛难度太大,我就精选了UER中最简单的一场打了一下,就当是CSP前的练习吧 A. [UER #5]万圣节的 ...

  3. ZooKeeper 入门看这篇就够了

    什么是 ZooKeeper? ZooKeeper 是一个分布式的,开放源码的分布式应用程序协同服务.ZooKeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原 ...

  4. Azure EA (1) 查看国内Azure账单

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China 有关Azure EA Portal的详细内容,可以参考我的GitHu ...

  5. Vue.js 源码分析(二十五) 高级应用 插槽 详解

    我们定义一个组件的时候,可以在组件的某个节点内预留一个位置,当父组件调用该组件的时候可以指定该位置具体的内容,这就是插槽的用法,子组件模板可以通过slot标签(插槽)规定对应的内容放置在哪里,比如: ...

  6. 短的 Guid 帮助类

    直接贴代码了: /// <summary> /// 短的 Guid 帮助类 /// </summary> public class ShortGuidHelper { #reg ...

  7. mysql 开启慢查询及其用mysqldumpslow做日志分析

    mysql慢查询日志是mysql提供的一种日志记录,它是用来记录在mysql中相应时间超过阈值的语句,就是指运行时间超过long_query_time值的sql,会被记录在慢查询日志中.long_qu ...

  8. Docker安装redis的使用

    1.Docker安装redis的使用. docker search redis检索redis的服务.先检索再拉取. 2.这里我们拉取官方的镜像,标签为5.0.5.[root@slaver4 ~]# d ...

  9. Linux磁盘系统——磁盘系统简介

    Linux磁盘系统——磁盘系统简介 摘要:本文主要学习了Linux系统中有关磁盘的一些知识. 文件系统 说明 硬盘是用来存储数据的,可以将其想象成柜子,只不过柜子是用来存储衣物的.新买来的硬盘,通常要 ...

  10. Java开发设计——UML类图

    Java开发设计——UML类图 摘要:本文主要介绍了UML类图的相关知识. 简介 在UML中,类使用包含类名.属性和操作且带有分隔线的长方形来表示,类图分为三层. 第一层是类的名称,如果是抽象类或接口 ...