热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

exchange无法收发邮件_SpringBoot2.x系列教程69SpringBoot中整合Mail实现邮件发送

SpringBoot2.x系列教程69--SpringBoot中整合邮件发送作者:一一哥注:本文案例以QQ邮箱发送的实现为例!一.邮件发送概述1.概述在

SpringBoot2.x系列教程69--SpringBoot中整合邮件发送

作者:一一哥

注:
本文案例以QQ邮箱发送的实现为例!

一. 邮件发送概述

1. 概述

在Spring框架中提供了一个JavaMailSender接口,可以实现发送邮件功能。

而在Spring Boot中提供了一个对应的spring-boot-starter-mail依赖,添加该依赖后,Spring Boot将创建一个默认的JavaMailSender,该sender可以通过spring.mail命名空间下的配置项进一步自定义。

2. 发送邮件的场景

  • 用户通过邮件注册激活;
  • 通过邮件找回密码;
  • 通过邮件发送系统情况;
  • 通过邮件发送报表信息等。

3. 常用邮箱系统提供商

126邮箱SMTP服务器地址:smtp.126.com,端口号:465或者994163邮箱SMTP服务器地址:smtp.163.com,端口号:465或者994qq邮箱SMTP服务器地址:smtp.qq.com,端口号:465或587yeah邮箱SMTP服务器地址:smtp.yeah.net,端口号:465或者994

4. QQ邮箱开启SMTP功能

为了保障用户邮箱的安全,QQ邮箱设置了POP3/SMTP/IMAP的开关。系统默认情况下相关设置是“关闭”状态的,在用户需要这些功能时请先“开启”,才可以用客户端软件收发邮件。

QQ邮箱开启SMTP功能步骤

默认情况下,SMTP服务器功能没有开启,所以需要在“设置”-->"账号"-->"POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务"中对SMTP进行开启。

ba1f4b07e3b0f0b0a436dba5f61b2b4c.png

可以看到默认情况下并没有开启SMTP服务。

3a1a8ac32a7da4cff0d43ff2201c8ad0.png

点击开启按钮就可以了,但是前提条件是你QQ邮箱绑定了手机号码,因为开启时需要发送短信验证码。

c8a464bff9ded3fc59dce1f6ab119bef.png

开启成功后,会有一个授权码,这个授权码就是我们进行邮件发送时的邮箱密码,可以把它记住,不记也可以。因为这个授权码可以多次生成,只要用的时候发一次短信验证码,就可以得到一个新的授权码了。

e4a69a3658d4c7eae4228089397164db.png

关于126或者163邮箱授权码的获取过程,与QQ类似,不一一列举。

二. Spring Boot整合邮件发送实现步骤

1. 创建web项目

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。

5fe43086ab78489c588a1117c85182b5.png

2. 添加依赖包

org.springframework.bootspring-boot-starter-mail
org.springframework.bootspring-boot-starter-freemarker

3. 创建application.yml配置文件

spring:#freemarker模板配置freemarker:template-loader-path: classpath:/templates/#spring.freemarker.prefix=suffix: .ftlcache: falsecharset: utf-8check-template-location: truecontent-type: text/html#邮件配置 mail:host: smtp.qq.comfrom: 2312119590@qq.comusername: 2312119590@qq.com#这里要替换成自己的邮箱授权码password: xxxxxxprotocol: smtpdefault-encoding: UTF-8#以下可以不配置properties:mail:smtp:auth: truestarttls:enable: truerequired: true

QQ邮箱配置

## QQ邮箱配置
spring:mail:host: smtp.qq.com #发送邮件服务器username: 2312119590@qq.com #发送邮件的邮箱地址password: xxx #客户端授权码,不是邮箱密码,在qq邮箱设置里面自动生成from: 2312119590@qq.com # 发送邮件的地址,和上面username一致protocol: smtpdefault-encoding: UTF-8#以下可以配置或者不配置properties:mail:smtp:port: 465 #端口号465或587auth: truestarttls:enable: truerequired: true

网易(126/163/yeah)邮箱配置

spring:mail:host: smtp.126.com #发送邮件服务器username: xx@126.com #发送邮件的邮箱地址password: xxxxxxx #客户端授权码,不是邮箱密码,网易的是自己设置的properties.mail.smtp.port: 994 #465或者994from: xxx@126.com # 发送邮件的地址,和上面username一致default-encoding: UTF-8#以下可以配置或者不配置properties:mail:smtp:port: 465 #端口号465或994auth: truestarttls:enable: truerequired: true

4. 定义发送邮件的服务类

定义邮件发送接口IMailService

package com.yyg.boot.mail;/*** @Author 一一哥Sun* @Date Created in 2020/4/20* @Description 封装一个发邮件的接口,方便后边直接调用.*/
public interface IMailService {/*** 发送文本邮件** @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 fileName 邮件模板文件名称* @param model 邮件数据载体*/void sendModelMail(String to, String subject, String fileName, Object model);}

定义邮件发送实现类IMailServiceImpl

package com.yyg.boot.mail.impl;import com.yyg.boot.mail.IMailService;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.util.Objects;/*** @Author 一一哥Sun* @Date Created in 2020/4/20* @Description Description*/
@Slf4j
@Service
public class IMailServiceImpl implements IMailService {/*** Spring Boot 提供了一个发送邮件的简单抽象,使用的是下面这个接口,这里直接注入即可使用*/@Autowiredprivate JavaMailSender mailSender;@Autowiredprivate Configuration configuration;/*** 配置文件中我的qq邮箱*/@Value("${spring.mail.from}")private String from;/*** 简单文本邮件** @param to 收件人* @param subject 主题* @param content 内容*/@Overridepublic void sendSimpleMail(String to, String subject, String content) {//创建SimpleMailMessage对象SimpleMailMessage message = new SimpleMailMessage();//邮件发送人message.setFrom(from);//邮件接收人message.setTo(to);//邮件主题message.setSubject(subject);//邮件内容message.setText(content);//发送邮件mailSender.send(message);}/*** html邮件** @param to 收件人* @param subject 主题* @param content 内容*/@Overridepublic void sendHtmlMail(String to, String subject, String content) {//获取MimeMessage对象MimeMessage message = mailSender.createMimeMessage();MimeMessageHelper messageHelper;try {messageHelper = new MimeMessageHelper(message, true);//邮件发送人messageHelper.setFrom(from);//邮件接收人messageHelper.setTo(to);//邮件主题message.setSubject(subject);//邮件内容,html格式messageHelper.setText(content, true);//发送mailSender.send(message);//日志信息log.info("邮件已经发送...");} catch (MessagingException e) {log.error("发送邮件时发生异常!", e);}}/*** 带附件的邮件* @param to 收件人* @param subject 主题* @param content 内容* @param filePath 附件*/@Overridepublic void sendAttachmentsMail(String to, String subject, String content, String filePath) {MimeMessage message = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);//FileSystemResource file = new FileSystemResource(new File(filePath));ClassPathResource resource = new ClassPathResource(filePath);FileSystemResource file = new FileSystemResource(resource.getFile());helper.addAttachment(Objects.requireNonNull(file.getFilename()), file);//可以同时添加多个附件,只需要在这里直接添加第2,第3...附件就行了.//helper.addAttachment(fileName2, file2);mailSender.send(message);//日志信息log.info("邮件已经发送...");} catch (MessagingException e) {log.error("发送邮件时发生异常!", e);} catch (IOException e) {e.printStackTrace();log.error("发送邮件时发生异常!", e);}}@Overridepublic void sendModelMail(String to, String subject, String fileName, Object model) {MimeMessage mimeMessage = mailSender.createMimeMessage();try {MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);Template template = configuration.getTemplate(fileName);String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);helper.setText(html, true);mailSender.send(mimeMessage);//日志信息log.info("邮件已经发送...");} catch (MessagingException e) {log.error("发送邮件时发生异常!", e);} catch (TemplateException e) {e.printStackTrace();log.error("发送邮件时发生异常!", e);} catch (IOException e) {e.printStackTrace();}}}

5. 定义实体类

package com.yyg.boot.entity;import lombok.Data;import java.util.Date;/*** @Author 一一哥Sun* @Date Created in 2020/4/20* @Description Description*/
@Data
public class Employee {/*** 员工编号*/private Long id;/*** 员工名称*/private String username;/*** 合同期限*/private Integer contractTerm;/*** 员工薪水*/private Double salary;/*** 合同起始日期*/private Date beginContract;/*** 合同截至日期*/private Date endContract;/*** 部门名称*/private String departmentName;/*** 职位名称*/private String posName;}

6. 创建入口类

package com.yyg.boot;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/*** @Author 一一哥Sun* @Date Created in 2020/4/20* @Description Description*/
@SpringBootApplication
public class MailApplication {public static void main(String[] args){SpringApplication.run(MailApplication.class,args);}}

7. 创建Controller接口

7.1 定义发送简单邮件的接口方法:

@GetMapping("/simple")
public String sendSimpleMail() {iMailService.sendSimpleMail("收件箱@qq.com", "邮件标题", "邮件内容.....机密");return "success";
}

启动程序进行测试

邮件发送成功:

b01093cb2bf7adf73fd66859b4a58939.png

去目标邮箱的收件箱中进行查看,可以看到如下邮件内容,说明邮件发送成功!

badabee75b4775ade521eebed7a4dec5.png

7.2定义发送html格式邮件的接口方法:

@GetMapping("/html")
public String sendHtmlMail() {iMailService.sendHtmlMail("收件箱@qq.com", "邮件主题", "

邮件主题


邮件内容

");return "success";
}

邮件发送成功:

631446711b80606b4ce64d2c9b8c4078.png

去目标邮箱的收件箱中进行查看,可以看到如下邮件内容,说明邮件发送成功!

9ce2c42e397e3a8c9d3e7e8c85e07ceb.png

7.3创建发送带附件的邮件接口方法:

@GetMapping("/attachment")
public String sendAttachmentMail() {iMailService.sendAttachmentsMail("收件箱@qq.com", "主题:带附件的邮件", "有附件的邮件,不要错过哦...", "static/touxiang.png");return "success";
}

注意:

我这里是把附件直接放到了项目的resource/static目录下了,我们也可以存放到桌面等位置。

邮件发送成功:

ccd7f1fd3b2cebd2e11c57e9861e99e1.png

然后去目标邮箱的收件箱中进行查看,可以看到如下邮件内容,说明邮件发送成功!

85a1b14db60eae53bb5bc088af54d37a.png



7.4创建发送模板邮件的接口方法:

首先利用FreeMarker创建页面模板。

${username}--你好,欢迎加入XXX大家庭!您的入职信息如下:



工号${id}
合同期限${contractTerm}年
员工薪资${salary}/月(美元)
合同起始日期${beginContract?string("yyyy-MM-dd")}
合同截至日期${endContract?string("yyyy-MM-dd")}
所属部门${departmentName}
职位${posName}

希望在未来的日子里,携手共进!


别忘了在application.yml文件中对freemarker进行配置:

spring:freemarker:template-loader-path: classpath:/templates/#spring.freemarker.prefix=suffix: .ftlcache: falsecharset: utf-8check-template-location: truecontent-type: text/html

创建接口方法

@PostMapping("/model")public String sendModelMail(@RequestBody Employee employee) {iMailService.sendModelMail("收件箱@qq.com", "主题:新员工入职欢迎邮件--模板邮件", "mail.ftl", employee);return "success";
}

在postman中进行接口测试

29e742727a4fa9aad6fef81670861ae1.png

然后去目标邮箱的收件箱中进行查看,可以看到如下邮件内容,说明邮件发送成功!

08bd6b1eca27882f378265f90d500dcc.png

8. Controller完整代码

package com.yyg.boot.web;import com.yyg.boot.entity.Employee;
import com.yyg.boot.mail.IMailService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;/*** @Author 一一哥Sun* @Date Created in 2020/4/20* @Description Description*/
@RestController
@RequestMapping("/mail")
public class MailController {@Autowiredprivate IMailService iMailService;@GetMapping("/simple")public String sendSimpleMail() {iMailService.sendSimpleMail("309733895@qq.com", "邮件标题", "邮件内容.....机密");return "success";}@GetMapping("/html")public String sendHtmlMail() {iMailService.sendHtmlMail("309733895@qq.com", "邮件主题", "

邮件主题


邮件内容

");return "success";}@GetMapping("/attachment")public String sendAttachmentMail() {iMailService.sendAttachmentsMail("309733895@qq.com", "主题:带附件的邮件", "有附件的邮件,不要错过哦...", "static/touxiang.png");return "success";}@PostMapping("/model")public String sendModelMail(@RequestBody Employee employee) {iMailService.sendModelMail("309733895@qq.com", "主题:新员工入职欢迎邮件--模板邮件", "mail.ftl", employee);return "success";}}

9. 完整项目结构

21e578091b0e84ab5a3ab842b6ccba1f.png





推荐阅读
  • 在前文探讨了Spring如何为特定的bean选择合适的通知器后,本文将进一步深入分析Spring AOP框架中代理对象的生成机制。具体而言,我们将详细解析如何通过代理技术将通知器(Advisor)中包含的通知(Advice)应用到目标bean上,以实现切面编程的核心功能。 ... [详细]
  • 为了确保iOS应用能够安全地访问网站数据,本文介绍了如何在Nginx服务器上轻松配置CertBot以实现SSL证书的自动化管理。通过这一过程,可以确保应用始终使用HTTPS协议,从而提升数据传输的安全性和可靠性。文章详细阐述了配置步骤和常见问题的解决方法,帮助读者快速上手并成功部署SSL证书。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 在Java Web服务开发中,Apache CXF 和 Axis2 是两个广泛使用的框架。CXF 由于其与 Spring 框架的无缝集成能力,以及更简便的部署方式,成为了许多开发者的首选。本文将详细介绍如何使用 CXF 框架进行 Web 服务的开发,包括环境搭建、服务发布和客户端调用等关键步骤,为开发者提供一个全面的实践指南。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • MySQL数据库安装图文教程
    本文详细介绍了MySQL数据库的安装步骤。首先,用户需要打开已下载的MySQL安装文件,例如 `mysql-5.5.40-win32.msi`,并双击运行。接下来,在安装向导中选择安装类型,通常推荐选择“典型”安装选项,以确保大多数常用功能都能被正确安装。此外,文章还提供了详细的图文说明,帮助用户顺利完成整个安装过程,确保数据库系统能够稳定运行。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文深入解析了WCF Binding模型中的绑定元素,详细介绍了信道、信道管理器、信道监听器和信道工厂的概念与作用。从对象创建的角度来看,信道管理器负责信道的生成。具体而言,客户端的信道通过信道工厂进行实例化,而服务端则通过信道监听器来接收请求。文章还探讨了这些组件之间的交互机制及其在WCF通信中的重要性。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 本文详细介绍了在Linux系统上编译安装MySQL 5.5源码的步骤。首先,通过Yum安装必要的依赖软件包,如GCC、GCC-C++等,确保编译环境的完备。接着,下载并解压MySQL 5.5的源码包,配置编译选项,进行编译和安装。最后,完成安装后,进行基本的配置和启动测试,确保MySQL服务正常运行。 ... [详细]
  • 本文以 www.域名.com 为例,详细介绍如何为每个注册用户提供独立的二级域名,如 abc.域名.com。实现这一功能的核心步骤包括:首先,确保域名支持泛解析,即将 A 记录设置为 *.域名.com,以便将所有二级域名请求指向同一服务器。接着,在服务器端使用 ASP.NET 2.0 进行配置,通过解析 HTTP 请求中的主机头信息,动态识别并处理不同的二级域名,从而实现个性化内容展示。此外,还需在数据库中维护用户与二级域名的对应关系,确保每个用户的二级域名都能正确映射到其专属内容。 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
author-avatar
安静2502917547
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有