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. ASP.NET Core Web Razor Pages系列教程八: 添加验证
  2. Golang内建库学习笔记(1)-sort和container
  3. Pytorch学习-tensorboard的使用
  4. CTEX - 在线文档 - TeX/LaTeX 常用宏包
  5. linux检测远程端口是否打开
  6. 技术女性的是是非非(2)
  7. 小迪和小捷的太空之旅——地球篇
  8. html三个div相同高度,两个并列div高度相同的问题_html/css_WEB-ITnose
  9. php7 ipv6,php将ipv4/ipv6的真实ip转换为数字
  10. property java用法_Java Properties getProperty(key)用法及代码示例
  11. HDU2089 不要62【数位DP+记忆化搜索】
  12. chrome下使用JS检测浏览器是否使用开发者工具
  13. php做个抽签人名,怎样在excel制作一个用于抽签函数,别的工具也行(excel随机抽取人名不重复)...
  14. html5 字段换行,关于换行以及换行属性
  15. POJ 6184 【三元环 +分治】
  16. 启动定时器t0的工作指令是_80c51单片机定时器t0工作于方式1定时时间1ms当晶振为6mhz时求计数初值为多少...
  17. 索引合并和组合索引的比较
  18. vue引入第三方原生js库
  19. ChatGPT 镜像网站,无需账号,无地区限制!
  20. discuz mysql类_Discuz论坛教程之数据库操作DB类和C::t类介绍

热门文章

  1. java网络编程Socket客户端给服务器端通信
  2. ipad的正确使用方法视频,ipad的正确使用方法图解
  3. 【法律】如何保障未来夫妻合法权益:婚前房屋财产约定协议书
  4. windows10开机时出现你的设备遇到问题,需要重启
  5. python系列:玩转大家来找茬
  6. QOS中 PQ,CQ.RR,WFQ,CBWFQ,LLQ区分
  7. 树莓派配置迅雷离线下载器
  8. php百度蜘蛛劫持,PHP模拟百度蜘蛛,伪造IP爬行网站,附源代码
  9. 贴片晶振的脚位方向如何区分
  10. 实现类似于目录的虚线填充样式