SpringBoot实现邮件发送

  • 邮件协议
    • 一:SpringBoot集成邮件
      • 二:以HTML形式发送邮件
        • 三:SpringBoot+RabbitMQ

邮件协议

SMTP:SMTP全称Simple Mail Transfer Protocol(简单邮件传输协议),它是一种用于从源地址到目的地的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP必须提供账号密码才能登入,防止乱发。
IMAP:IMAP全称Internet Message Access Protocol(互联网访问协议),IMAP允许从邮件服务器上获取邮件的信息、下载邮件等。IMAP于POP类似,都是一种邮件获取协议。
POP3:POP3全称Post Office Protocol 3(邮局协议),POP3支持客户端远程管理服务器端的邮件。POP3常用于“离线”邮件处理,即允许客户端下载服务器邮件,然后服务器上的邮件将会被删除。目前很多POP3的邮件服务器只提供下载邮件功能,服务器本身并不删除邮件,这种属于改进版的POP3协议。

一:SpringBoot集成邮件

1.以文本形式发送邮件
(1.1)准备工作
开通邮箱SMTP服务,这里以163为列:


启动后会发来一个授权码,你保存起来后就可以发送邮件了。
(1.2)导入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency><!-- email依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

(1.3)配置yml文件

spring:# 邮件配置mail:# 邮件服务器地址host: smtp.qq.com# 你的邮箱地址username: *****@qq.com# 授权码password: *****# 编码格式default-encoding: utf-8# 协议protocol: smtpproperties:mail:smtp:auth: truestarttls:enable: truerequired: true

格式自己注意好。
(1.4)实体MailBean类

package com.xxxx.springbootemail.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;import java.io.Serializable;@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class MailBean implements Serializable {private static final long serialVersionUID = -2116367492649751914L;private String recipient;//邮件接收人private String subject; //邮件主题private String content; //邮件内容
}

创建RespBean类

package com.xxxx.springbootemail.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;/*** 公共返回对象*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class RespBean {private long code;private String message;private Object obj;/*** 成功返回结果* @param message* @return*/public static RespBean success(String message){return new RespBean(200,message,null);}/*** 成功返回结果* @param message* @param data* @return*/public static RespBean success(String message,Object data){return new RespBean(200,message,data);}/*** 失败返回结果* @param message* @return*/public static RespBean error(String message){return new RespBean(500,message,null);}/*** 失败返回结果* @param message* @param data* @return*/public static RespBean error(String message,Object data){return new RespBean(500,message,data);}
}

创建User类

package com.xxxx.springbootemail.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class User {private static final long serialVersionUID = -2116367492649751914L;//用户名private String name;//密码private String password;//邮箱private String mailbox;}

(1.5)创建MailUtil类

package com.xxxx.springbootemail.utils;import com.xxxx.springbootemail.pojo.MailBean;
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.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Component;@Component
public class MailUtil {@Value("${spring.mail.username}")private String MAIL_SENDER; //邮件发送者@Autowiredprivate JavaMailSender javaMailSender;//注入QQ发送邮件的beanprivate Logger logger = LoggerFactory.getLogger(MailUtil.class);/*** 发送文本邮件** @param mailBean*/public void sendSimpleMail(MailBean mailBean) {try {SimpleMailMessage mailMessage= new SimpleMailMessage();mailMessage.setFrom(MAIL_SENDER);//发送者mailMessage.setTo(mailBean.getRecipient());//接收者mailMessage.setSubject(mailBean.getSubject());//邮件标题mailMessage.setText(mailBean.getContent());//邮件内容javaMailSender.send(mailMessage);//发送邮箱} catch (Exception e) {logger.error("邮件发送失败", e.getMessage());}}
}

其中:
from,即为邮件发送者,一般设置在配置文件中
to,邮件接收者,此参数可以为数组,同时发送多人
subject,邮件主题
Text,邮件内容
content,邮件的主体
copyTo:抄送人

(1.6)编写Controller类

package com.xxxx.springbootemail.controller;import com.xxxx.springbootemail.pojo.MailBean;
import com.xxxx.springbootemail.pojo.RespBean;
import com.xxxx.springbootemail.pojo.User;
import com.xxxx.springbootemail.utils.MailUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;import java.util.Date;@Controller
public class Mail {@Autowiredprivate MailUtil mailUtil;@PostMapping("/mails")@ResponseBodypublic RespBean doMail(User user){System.out.println("数据: " + user);if (user != null){MailBean mailBean = new MailBean();mailBean.setRecipient(user.getMailbox());//接收者mailBean.setSubject("用户信息");//标题//内容主体mailBean.setContent("SpringBootMail发送一个简单格式的邮件,时间为:" + new Date());mailUtil.sendSimpleMail(mailBean);return RespBean.success("查询成功",user);}return RespBean.error("发送失败!");}}

(1.7)编写html模板
下面展示一些 内联代码片

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<form action="/mails" method="post"><span>用户名:</span><input type="text" name="name"><span>密码:</span><input type="password" name="password"><span>邮箱:</span><input type="email" name="mailbox"><input type="submit" value="提交">
</form>
</body>
</html>

(1.8)测试

这里就邮件发送成功啦!!

二:以HTML形式发送邮件

与文本格式邮件代码对比,富文本HTML邮件发送使用MimeMessageHelper类,把setText()方法的消息文本设置为html,并将第二个参数设置为true,表示这是html的富文本。MimeMessageHelper支持发送复杂邮件模板,支持文本、附件、HTML、图片等。

(2.1)导入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

(2.2)创建email.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body><h3 th:text="|尊敬的${username} :|"></h3><br /><img src="http://gtms02.alicdn.com/tps/i2/T1YoblFq4cXXa94Hfd-32-32.png" /> 您有代金券即将到期,逾期失效,请尽早使用。<a th:href = "${url}" >点此查看</a><br />
</body>
</html>

(2.3)编写MailUtil类

/*** 发送HTML模板* @param mailBean*/public void sendHTMLMail(MailBean mailBean) {MimeMessage mimeMailMessage = null;try {mimeMailMessage = javaMailSender.createMimeMessage();//true 表示需要创建一个multipart messageMimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMailMessage, true);mimeMessageHelper.setFrom(MAIL_SENDER);//发送者mimeMessageHelper.setTo(mailBean.getRecipient());//接受者mimeMessageHelper.setSubject(mailBean.getSubject());//邮件标题//这里的 true,你加了的话,它发送你HTML页面里面的内容//不加的话,默认是 false,它发送整个HTML页面代码mimeMessageHelper.setText(mailBean.getContent(), true);//邮件抄送javaMailSender.send(mimeMailMessage);//发送邮件} catch (Exception e) {logger.error("邮件发送失败", e.getMessage());}}

(2.4)编写Controller类

@Autowired
private TemplateEngine templateEngine;@PostMapping("/mails2")@ResponseBodypublic RespBean doMail2(User user){System.out.println("数据: " + user);//以HTML模板发送邮件if (user != null){//注意:Context 类是在org.thymeleaf.context.Context包下的。Context context = new Context();//html中填充动态属性值context.setVariable("username", "码农用户");context.setVariable("url", "https://www.aliyun.com/?utm_content=se_1000301881");//注意:process第一个参数名称要和templates下的模板名称一致。要不然会报错//org.thymeleaf.exceptions.TemplateInputException: Error resolving template [email]String emailContent = templateEngine.process("email", context);MailBean mailBean = new MailBean();mailBean.setRecipient(user.getMailbox());mailBean.setSubject("主题:这是模板邮件");mailBean.setContent(emailContent);mailUtil.sendHTMLMail(mailBean);return RespBean.success("查询成功",user);}return RespBean.error("发送失败!");}

(2.5)测试

三:SpringBoot+RabbitMQ

利用Springboot集成邮箱,如果邮箱内容太大的话,发送消息会很慢,会阻挡程序继续运行下去,所以利用RabbitMQ的话,可以分开进行,发送邮件继续发,程序也可以继续往下运行。
(1)导入依赖

<!-- rabbitmq依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<!-- email依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId>
</dependency>

(2)配置yml文件

server:port: 8083spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/xadmin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456hikari:# 连接池名pool-name: DateHikariCP# 最小空闲连接数minimum-idle: 5# 空闲连接存活最大时间,默认600000(10分钟)idle-timeout: 180000# 最大连接数,默认10maximum-pool-size: 10# 从连接池返回的连接的自动提交auto-commit: true# 连接最大存活时间,0表示永久存活,默认1800000(30分钟)max-lifetime: 1800000# 连接超时时间,默认30000(30秒)connection-timeout: 30000# 测试连接是否可用的查询语句connection-test-query: SELECT 1# 邮件配置mail:# 邮件服务器地址host: smtp.qq.com# 你的邮箱地址username: *****@qq.com# 授权码password: *****# 编码格式default-encoding: utf-8# 协议protocol: smtpproperties:mail:smtp:auth: truestarttls:enable: truerequired: true# rabbitmq配置rabbitmq:# 服务器地址host: *****# 端口port: 5672# 用户名username: admin# 密码password: admin# 权限virtual-host: /shop# Mybatis-plus配置
mybatis-plus:# 配置Mapper映射文件mapper-locations: classpath*:/mapper/*Dao.xml# 配置MyBatis数据返回类型别名(默认别名是类名)type-aliases-package: com.zb.demo.entityconfiguration:# 自动驼峰命名map-underscore-to-camel-case: false# Mybatis SQL 打印(方法接口所在的包,不是Mapper.xml所在的包)
logging:level:cn.yeb.server.mapper: debug

注意格式!!
(3)配置Mq
(3.1)配置Config类

package com.example.demo3.config;import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitConfig {/*** 创建一个队列* @return*/@Beanpublic Queue mailQueue() {return new Queue("mq.email");//队列名称}
}

(3.2)配置MailReceiver

package com.example.demo3.utils;import com.example.demo3.entity.TUser;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.mail.MailProperties;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.Date;/*** 消息接收者*/
@Component
public class MailReceiver {private static final Logger LOGGER = LoggerFactory.getLogger(MailReceiver.class);@Autowiredprivate JavaMailSender javaMailSender;@Autowiredprivate MailProperties mailProperties;@Autowiredprivate TemplateEngine templateEngine;@RabbitListener(queuesToDeclare = {@Queue("mq.email")})//获取队列名称public void handler(TUser user){MimeMessage mimeMessage = javaMailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(mimeMessage);try {//发件人helper.setFrom(mailProperties.getUsername());//收件人helper.setTo(user.getMailbox());//主题helper.setSubject("入职欢迎邮件");//发送日期helper.setSentDate(new Date());//邮件内容Context context = new Context();context.setVariable("username", "码农用户");context.setVariable("url", "https://www.aliyun.com/?utm_content=se_1000301881");String mail = templateEngine.process("email", context);//跟模板名称要一样helper.setText(mail,true);//发送邮件javaMailSender.send(mimeMessage);} catch (MessagingException e) {LOGGER.error("邮件发送失败========>{}",e.getMessage());}}
}

(4)配置HTML模板

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h3 th:text="|尊敬的${username} :|"></h3><br />
<img src="http://gtms02.alicdn.com/tps/i2/T1YoblFq4cXXa94Hfd-32-32.png" /> 您有代金券即将到期,逾期失效,请尽早使用。<a th:href = "${url}" >点此查看</a>
<br />
</body>
</html>

(5)配置Controller
下面展示一些 内联代码片

package com.example.demo3.controller;import com.example.demo3.entity.RespBean;
import com.example.demo3.entity.TUser;
import com.example.demo3.service.TUserService;
import com.example.demo3.utils.MailUtil;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.thymeleaf.TemplateEngine;import javax.annotation.Resource;
import java.util.Date;/*** (TUser)表控制层** @author makejava* @since 2021-04-19 16:28:35*/
@RestController
@RequestMapping("/tUser")
public class TUserController {@Autowiredprivate RabbitTemplate rabbitTemplate;@PostMapping("/mails")public RespBean doMail(@RequestBody TUser user){System.out.println("数据: " + user);if (user != null){rabbitTemplate.convertAndSend("mq.email",user);return RespBean.success("查询成功",user);}return RespBean.error("发送失败!");}}

(6.)测试

OK!

SpringBoot三种实现邮箱发送功能相关推荐

  1. SpringBoot实现QQ邮箱发送功能

    SpringBoot实现QQ邮箱发送功能 一. 前言 1.互联网发展到现在,相必大家都知道发送邮件应该是网站的必备功能之一:用户注册发送邮箱验证.忘记密码.监控提醒以及发送营销信息等. Spring提 ...

  2. SpringBoot三种方式实现定时任务

    SpringBoot三种方式实现定时任务 定时任务实现的三种方式: Timer:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用 ...

  3. SpringBoot 三种拦截http请求方式Filter,interceptor和aop

    SpringBoot 三种拦截http请求方式Filter,interceptor和aop. 这三种拦截方式的拦截顺序是:filter->Interceptor-->ControllerA ...

  4. springboot三种过滤功能的使用与比较

    若要实现对请求的过滤,有三种方式可供选择:filter.interceptort和aop.本文主要讨论三种拦截器的使用场景与使用方式. 下文中的举例功能是计算每个请求的从开始到结束的时间,例子来源是慕 ...

  5. SpringBoot三种方法实现定时发送邮件的案例

    介绍 这里是小编成长之路的历程,也是小编的学习之路.希望和各位大佬们一起成长! 以下为小编最喜欢的两句话: 要有最朴素的生活和最遥远的梦想,即使明天天寒地冻,山高水远,路远马亡. 一个人为什么要努力? ...

  6. SpringBoot中快速实现邮箱发送

    前言 在许多企业级项目中,需要用到邮件发送的功能,如: 注册用户时需要邮箱发送验证 用户生日时发送邮件通知祝贺 发送邮件给用户等 创建工程导入依赖 <!-- 邮箱发送依赖 --> < ...

  7. 三大方面对比两种企业邮箱的功能,看完你就明白了

    企业邮箱有收费和免费的两种,那么应该选择哪一种呢? 今天我们从三大方面对比两种企业邮箱的基本功能,看完你就明白了. 1.容量方面: 收费企业邮箱无限容量,免费企业邮箱中容量最大的只有5G,还有2.3G ...

  8. 带你认识三种kafka消息发送模式

    摘要:在kafka-0.8.2之后,producer不再区分同步(sync)和异步方式(async),所有的请求以异步方式发送,这样提升了客户端效率. 本文分享自华为云社区<kafka消息发送模 ...

  9. c语言三种循环语句,C语言三种循环语句的功能等价性

    C语言程序中的.bile,dowhile,for三种循环语句在实现不同形式的循环功能上各具特色及优点,从而使C语言程序的循环功能准确简洁地实现了实际问题中不同形式及过程的循环要求,本文从一般逻辑关系上 ...

  10. php邮箱发送tp5源码,tp5 使用邮箱发送功能 PHPMailer

    PHPMailer PHPMailer 是一个封装好的 PHP 邮件发送类,支持发送 HTML 内容的电子邮件,以及可以添加附件发送,并不像 PHP 本身 mail() 函数需要服务器环境支持,您只需 ...

最新文章

  1. 单纯形法(四)理论部分(终结)
  2. python下载不下来_Python不能下载zip文件,而Browser/Selenium可以下载,这是为什么?...
  3. 内核分析PE获取DLL导出函数地址
  4. HTMLTestRunner加入logging输出
  5. Linux系统默默改变了人类世界的生活方式
  6. hdfs haadmin使用,DataNode动态上下线,NameNode状态切换管理,数据块的balance,HA下hdfs-api变化(来自学习资料)
  7. drf1 rest restful规范
  8. SparkStreaming “Could not read data from write ahead log record” 报错分析解决
  9. Flume:使用Apache Flume收集客户产品搜索点击数据
  10. 腾讯智慧出行和现代汽车集团创新中心(北京)正式建立创新战略合作伙伴关系
  11. 使用txt文件导入数据库内容
  12. 小米12系列或首发骁龙898旗舰芯:三星4nm工艺
  13. vs2005中文版/2010中文旗舰版等安装步骤和注意
  14. java自己写母版_Java 创建并用应用幻灯片母版
  15. python中bytearray函数_Python bytearray() 函数
  16. 微信支付-商家给小程序用户转账教程(全网最详细JAVA版)
  17. 《iOS开发进阶》读书笔记
  18. 【菠萝狗四足机器人】二次开发教程--第一章 【简介与开发环境搭建】
  19. STM32单片机初学心得
  20. 推荐几个免费看漫画的资源网站,请低调收藏

热门文章

  1. 计算机桌面来回闪烁,Windows10系统电脑屏幕一直闪烁的解决方案
  2. Python之xlsx文件转csv文件
  3. Panel的基本用法
  4. SDN控制器Ryu、Floodlight、OpenDayLight的安装以及Mininet连接
  5. Ubuntu系统如何连接WiFi
  6. 因子主成分分析,因子载荷矩阵、因子解释度 因子得分-在基金净值和主要金融因子分析上的应用
  7. 神经网络中验证集、训练集和测试集
  8. Linux 进程查看命令 ps top htop dstat
  9. snmp++ linux 编译出错_成为linux高手的第二步
  10. 输出任意乘法 口诀表