SpringBoot实现QQ邮箱发送功能 |
您所在的位置:网站首页 › 使用qq发送邮件 › SpringBoot实现QQ邮箱发送功能 |
SpringBoot实现QQ邮箱发送功能
一. 前言
1、互联网发展到现在,相必大家都知道发送邮件应该是网站的必备功能之一:用户注册发送邮箱验证、忘记密码、监控提醒以及发送营销信息等。 Spring提供一个邮件框架: Spring Email 2、Spring Email抽象的核心是MailSender接口,MailSender的实现能够把Email发送给邮件服务器,由邮件服务器实现邮件发送的功能。 早期发送邮件是通过Java自带的JavaMail类来发送邮件的,不过需要自己封装消息体,后来Spring推出了JavaMailSender类大大简化了发送邮件的过程,JavaMailSender继承自MailSender,提供了更强大的邮件发送功能,可支持不同类型的邮件发送。再到现在的Spring Boot又对其进行封装从而出现了spring-boot-starter-mail,进一步优化和完善邮件发送功能。 3、 邮件协议 什么是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协议。4、进阶知识 什么是JavaMailSender和JavaMailSenderImpl? javaMailSender和JavaMailSenderImpl是Spring官方提供的集成邮件服务的接口和实现类,以简单高效的设计著称,目前是Java后端发送邮件和集成邮件服务的主流工具。如何通过JavaMailSenderImpl发送邮件? 非常简单,直接在业务类注入JavaMailSenderImpl并调用send方法发送邮件。其中简单邮件可以通过SimpleMailMessage来发送邮件,而复杂的邮件(例如添加附件)可以借助MimeMessageHelper来构建MimeMessage发送邮件。 二. SpringBoot集成邮箱 1.以文本形式发送邮件 1.1.准备工作开通邮箱SMTP服务,这里以163为例: 开启后会发来一个授权码,你保存起来,之后这样就可以发送邮件了。 1.2.导入依赖 org.springframework.boot spring-boot-starter-thymeleaf org.springframework.boot spring-boot-starter-web org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-mail 1.3.配置application.yml文件 spring: # 邮件配置 mail: # 邮件服务器地址 host: smtp.qq.com # 你的邮箱地址 username: *****@qq.com # 授权码 password: ***** # 编码格式 default-encoding: utf-8 # 协议 protocol: smtp properties: mail: smtp: auth: true starttls: enable: true required: 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; //邮件发送者 @Autowired private JavaMailSender javaMailSender;//注入QQ发送邮件的bean private 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 { @Autowired private MailUtil mailUtil; @PostMapping("/mails") @ResponseBody public 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模板 Title 用户名: 密码: 邮箱: 1.8.测试这里邮件就发送成功了!!!!!! 2. 以HTML形式发送邮件与文本格式邮件代码对比,富文本HTML邮件发送使用MimeMessageHelper类,把setText()方法的消息文本设置为html,并将第二个参数设置为true,表示这是html的富文本。MimeMessageHelper支持发送复杂邮件模板,支持文本、附件、HTML、图片等。 2.1.导入依赖 org.springframework.boot spring-boot-starter-thymeleaf 2.2.创建email.html Title![]() 利用Springboot集成邮箱,如果邮箱内容太大的话,发送消息会很慢,会阻挡程序继续运行下去,所以利用RabbitMQ的话,可以分开进行,发送邮件继续发,程序也可以继续往下运行。 3.1. 导入依赖 org.springframework.boot spring-boot-starter-amqp org.springframework.boot spring-boot-starter-mail 3.2. 配置application.yml文件 server: port: 8083 spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/xadmin?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai username: root password: 123456 hikari: # 连接池名 pool-name: DateHikariCP # 最小空闲连接数 minimum-idle: 5 # 空闲连接存活最大时间,默认600000(10分钟) idle-timeout: 180000 # 最大连接数,默认10 maximum-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: smtp properties: mail: smtp: auth: true starttls: enable: true required: 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.entity configuration: # 自动驼峰命名 map-underscore-to-camel-case: false # Mybatis SQL 打印(方法接口所在的包,不是Mapper.xml所在的包) logging: level: cn.yeb.server.mapper: debug 3.3.配置RabbitMQ 3.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 */ @Bean public Queue mailQueue() { return new Queue("mq.email");//队列名称 } } 3.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); @Autowired private JavaMailSender javaMailSender; @Autowired private MailProperties mailProperties; @Autowired private 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()); } } } 3.4.配置HTML模板 Title![]() 测试完成!!!! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |