当前位置: 首页 > news >正文

Spring boot 发送邮箱

一、简介

        Spring 提供了非常好用的 JavaMailSender 接口实现邮件发送。在 SpringBoot 的 Starter 模块中也为此提供了自动化配置。下面通过实例看看如何在 SpringBoot 中使用 JavaMailSender 发送邮件。

 org.springframework.mail 是Spring Framework对邮件支持的基础包,发送邮件的核心接口MailSender,SimpleMailMessage封装了发送简单邮件的属性 ,这个包还包含检查异常的层次结构,这些层次结构在较低级别的邮件系统异常上提供了更高级别的抽象,而根异常是MailException

org.springframework.mail.javamail.JavaMailSender接口添加了专门的JavaMail功能,例如MIME消息支持到MailSender接口 (从其继承)。JavaMailSender还提供了一个名为org.springframework.mail.javamail.MimeMessagePreparator的回调接口,用于准备一个MimeMessage。

二、使用 SpringBoot 创建 Java Web 项目,添加邮件相关依赖包

  在 SpringBoot 工程中的 pom.xml 中引入 spring-boot-starter-mail 依赖。

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

三、使用

假设我们有一个名为OrderManager的业务类,如下面的示例所示:

public interface OrderManager {void placeOrder(Order order) throws MessagingException;
}

3、1MailSender和SimpleMailMessage的基本用法

public class SimpleOrderManager implements OrderManager {@Value("${spring.mail.from}")private String mailFrom;@Resourceprivate MailSender mailSender;public void placeOrder(Order order) {// Do the business calculations...// Call the collaborators to persist the order...// Create a thread safe "copy" of the template message and customize itSimpleMailMessage msg = new SimpleMailMessage();msg.setTo(order.getCustomer().getEmailAddress());msg.setFrom(mailFrom);msg.setText("Dear " + order.getCustomer().getFirstName()+ order.getCustomer().getLastName()+ ", thank you for placing order. Your order number is "+ order.getOrderNumber());try {this.mailSender.send(msg);} catch (MailException ex) {// simply log it and go on...System.err.println(ex.getMessage());}}}

3.2 JavaMailSender 和MimeMessagePreparator的用法

@Service
public class SimpleOrderManagerPreparator implements OrderManager {@Value("${spring.mail.from}")private String mailFrom;@Resourceprivate JavaMailSender mailSender;public void setMailSender(JavaMailSender mailSender) {this.mailSender = mailSender;}@Overridepublic void placeOrder(final Order order) {// Do the business calculations...// Call the collaborators to persist the order...MimeMessagePreparator preparator = new MimeMessagePreparator() {public void prepare(MimeMessage mimeMessage) throws Exception {mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress(order.getCustomer().getEmailAddress()));mimeMessage.setFrom(new InternetAddress(mailFrom));mimeMessage.setText("Dear " + order.getCustomer().getFirstName() + " " +order.getCustomer().getLastName() + ", thanks for your order. " +"Your order number is " + order.getOrderNumber() + ".");}};try {this.mailSender.send(preparator);} catch (MailException ex) {// simply log it and go on...System.err.println(ex.getMessage());}}}

邮件代码可以作为一个切面,可以在OrderManager目标上的适当连接点处运行。

3.3 JavaMail MimeMessageHelper的使用

使用MimeMessageHelper可以代替基础的JavaMail API。

@Service
public class SimpleOrderManagerHelper  implements OrderManager {@Value("${spring.mail.from}")private String mailFrom;@Resourceprivate JavaMailSender mailSender;public void placeOrder(Order order) throws MessagingException {// Do the business calculations...// Call the collaborators to persist the order...// Create a thread safe "copy" of the template message and customize itMimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message);helper.setTo(order.getCustomer().getEmailAddress());helper.setFrom(mailFrom);helper.setText("Dear " + order.getCustomer().getFirstName()+ order.getCustomer().getLastName()+ ", thank you for placing order. Your order number is "+ order.getOrderNumber());try {this.mailSender.send(message);} catch (MailException ex) {// simply log it and go on...System.err.println(ex.getMessage());}}
}

3.4 发送附件

下面的示例将展示如何使用MimeMessageHelper发送带有单个JPEG图像附件的电子邮件:

@Service
public class SimpleOrderManagerAttachments implements OrderManager {@Value("${spring.mail.from}")private String mailFrom;@Resourceprivate JavaMailSender mailSender;public void placeOrder(Order order) throws MessagingException {// Do the business calculations...// Call the collaborators to persist the order...// Create a thread safe "copy" of the template message and customize itMimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setTo(order.getCustomer().getEmailAddress());helper.setFrom(mailFrom);helper.setText("Check out this image!");// let's attach the infamous windows Sample file (this time copied to c:/)FileSystemResource file = new FileSystemResource(new File("./sample.png"));helper.addAttachment("CoolImage.jpg", file);try {this.mailSender.send(message);} catch (MailException ex) {// simply log it and go on...System.err.println(ex.getMessage());}}
}
发送附件和内联资源
多部分电子邮件消息允许附件和内联资源。内联资源的示例包括要在邮件中使用但不想显示为附件的图像或样式表。
附件
下面的示例向您展示如何使用MimeMessageHelper发送带有单个JPEG图像附件的电子邮件:

3.5 内联资源

下面的示例将展示如何使用MimeMessageHelper发送带有内联映像的电子邮件:

@Service
public class SimpleOrderManagerInlineResources implements OrderManager {@Value("${spring.mail.from}")private String mailFrom;@Resourceprivate JavaMailSender mailSender;public void placeOrder(Order order) throws MessagingException {// Do the business calculations...// Call the collaborators to persist the order...// Create a thread safe "copy" of the template message and customize itMimeMessage message = mailSender.createMimeMessage();MimeMessageHelper helper = new MimeMessageHelper(message, true);helper.setTo(order.getCustomer().getEmailAddress());helper.setFrom(mailFrom);helper.setText("<html><body><img src='cid:identifier1234'></body></html>", true);// let's attach the infamous windows Sample file (this time copied to c:/)FileSystemResource res = new FileSystemResource(new File("./sample.png"));helper.addInline("identifier1234", res);try {this.mailSender.send(message);} catch (MailException ex) {// simply log it and go on...System.err.println(ex.getMessage());}}
}

        通过使用指定的Content-ID 将内联资源添加到MimeMessage。添加文本和资源的顺序非常重要。请务必先添加文本,然后再添加资源。如果您以相反的方式进行操作,则无法正常工作。

相关文章:

  • flutter 底部弹窗和中间弹窗
  • 分布式搜索引擎02
  • at least 1 bean which qualifies as autowire candidate
  • Jenkins的几种安装方式以及邮件配置
  • 基于深度学习的yolov5入侵检测系统
  • 微服务1 springcloud学习笔记P1-P40
  • C++ 设计模式 Forward Declaration Pimpl
  • C++基础——STL初识
  • 力扣第 119 场双周赛(Java)
  • hook其他调试技巧
  • 重构第一章:引言
  • HTML中使用JavaScript实现一个简单的鼠标悬停特效。
  • Softmax回归
  • Redis持久化机制 RDB 和 AOF 的选择
  • Nmap脚本未来的发展趋势
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • CAP 一致性协议及应用解析
  • CSS魔法堂:Absolute Positioning就这个样
  • HTTP中GET与POST的区别 99%的错误认识
  • java8-模拟hadoop
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • java取消线程实例
  • Laravel核心解读--Facades
  • oschina
  • Protobuf3语言指南
  • Python中eval与exec的使用及区别
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 创建一种深思熟虑的文化
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 深度解析利用ES6进行Promise封装总结
  • 算法---两个栈实现一个队列
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 06-01 点餐小程序前台界面搭建
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 回归生活:清理微信公众号
  • #AngularJS#$sce.trustAsResourceUrl
  • #ifdef 的技巧用法
  • #图像处理
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (Oracle)SQL优化技巧(一):分页查询
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (三十五)大数据实战——Superset可视化平台搭建
  • (一)RocketMQ初步认识
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .cn根服务器被攻击之后
  • .net core 6 redis操作类
  • .NET Core 通过 Ef Core 操作 Mysql
  • .Net MVC4 上传大文件,并保存表单