我们在发送Email和接收Email中已经介绍了如何通过JavaMail来收发电子邮件。在Spring中,同样可以集成JavaMail。

因为在服务器端,主要以发送邮件为主,例如在注册成功、登录时、购物付款后通知用户,基本上不会遇到接收用户邮件的情况,所以本节我们只讨论如何在Spring中发送邮件。

在Spring中,发送邮件最终也是需要JavaMail,Spring只对JavaMail做了一点简单的封装,目的是简化代码。为了在Spring中集成JavaMail,我们在pom.xml中添加以下依赖:

org.springframework:spring-context-support:5.2.0.RELEASE

javax.mail:javax.mail-api:1.6.2

com.sun.mail:javax.mail:1.6.2

以及其他Web相关依赖。

我们希望用户在注册成功后能收到注册邮件,为此,我们先定义一个JavaMailSender的Bean:

@Bean

JavaMailSender createJavaMailSender(

// smtp.properties:

@Value("${smtp.host}") String host,

@Value("${smtp.port}") int port,

@Value("${smtp.auth}") String auth,

@Value("${smtp.username}") String username,

@Value("${smtp.password}") String password,

@Value("${smtp.debug:true}") String debug)

{

var mailSender = new JavaMailSenderImpl();

mailSender.setHost(host);

mailSender.setPort(port);

mailSender.setUsername(username);

mailSender.setPassword(password);

Properties props = mailSender.getJavaMailProperties();

props.put("mail.transport.protocol", "smtp");

props.put("mail.smtp.auth", auth);

if (port == 587) {

props.put("mail.smtp.starttls.enable", "true");

}

if (port == 465) {

props.put("mail.smtp.socketFactory.port", "465");

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

}

props.put("mail.debug", debug);

return mailSender;

}

这个JavaMailSender接口的实现类是JavaMailSenderImpl,初始化时,传入的参数与JavaMail是完全一致的。

另外注意到需要注入的属性是从smtp.properties中读取的,因此,AppConfig导入的就不止一个.properties文件,可以导入多个:

@Configuration

@ComponentScan

@EnableWebMvc

@EnableTransactionManagement

@PropertySource({ "classpath:/jdbc.properties", "classpath:/smtp.properties" })

public class AppConfig {

...

}

下一步是封装一个MailService,并定义sendRegistrationMail()方法:

@Component

public class MailService {

@Value("${smtp.from}")

String from;

@Autowired

JavaMailSender mailSender;

public void sendRegistrationMail(User user) {

try {

MimeMessage mimeMessage = mailSender.createMimeMessage();

MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, "utf-8");

helper.setFrom(from);

helper.setTo(user.getEmail());

helper.setSubject("Welcome to Java course!");

String html = String.format("

Hi, %s,

Welcome to Java course!

Sent at %s

", user.getName(), LocalDateTime.now());

helper.setText(html, true);

mailSender.send(mimeMessage);

} catch (MessagingException e) {

throw new RuntimeException(e);

}

}

}

观察上述代码,MimeMessage是JavaMail的邮件对象,而MimeMessageHelper是Spring提供的用于简化设置MimeMessage的类,比如我们设置HTML邮件就可以直接调用setText(String text, boolean html)方法,而不必再调用比较繁琐的JavaMail接口方法。

最后一步是调用JavaMailSender.send()方法把邮件发送出去。

在MVC的某个Controller方法中,当用户注册成功后,我们就启动一个新线程来异步发送邮件:

User user = userService.register(email, password, name);

logger.info("user registered: {}", user.getEmail());

// send registration mail:

new Thread(() -> {

mailService.sendRegistrationMail(user);

}).start();

因为发送邮件是一种耗时的任务,从几秒到几分钟不等,因此,异步发送是保证页面能快速显示的必要措施。这里我们直接启动了一个新的线程,但实际上还有更优化的方法,我们在下一节讨论。

练习

小结

Spring可以集成JavaMail,通过简单的封装,能简化邮件发送代码。其核心是定义一个JavaMailSender的Bean,然后调用其send()方法。

java mail pom_集成JavaMail相关推荐

  1. java mail smtps,使用javamail发SMTPS邮件,javamailsmtps邮件,Java通常情况下都不会

    使用javamail发SMTPS邮件,javamailsmtps邮件,Java通常情况下都不会 Java 通常情况下都不会对smtp发邮件加密,但是gmail做了加密. 首先需要引用 Javamail ...

  2. java mail 抄送多用户,JavaMail 发送邮件,收件人为多人,抄送多人。其中包含收件人邮箱错误时的处理...

    1.给客户做一个发邮件的功能.收件人和抄送人可能为单个人,也可能为多个人.但是当收件人或抄送人中某一个邮箱的格式错误时,整个邮件发送就会出错停止发送.但我还需要给那些其余的人发邮件,该怎么办? 2.解 ...

  3. java mail outlook_无法使用JavaMail读取Outlook邮件,而使用Gmail工作

    基本上,我编写了一个可从收件箱中读取电子邮件的应用程序.我一直使用Gmail发送的电子邮件测试应用程序.但是现在,当我试图阅读从Outlook发送的电子邮件时,我没有收到任何内容.无法使用JavaMa ...

  4. mail java_基于JavaMail的Java邮件发送:简单邮件发送

    http://blog.csdn.net/xietansheng/article/details/51673073 http://www.cnblogs.com/codeplus/archive/20 ...

  5. java velocity 邮件_邮件集成java mail + 读取邮件模板

    项目做异地登录提醒功能,通过java mail发送邮件.读取邮件模板sendMail.vm文件. 1.邮件发送 import java.io.StringWriter; import java.uti ...

  6. 邮件集成java mail + 读取邮件模板

    项目做异地登录提醒功能,通过java mail发送邮件.读取邮件模板sendMail.vm文件. 1.邮件发送 import java.io.StringWriter; import java.uti ...

  7. java邮件支持_使用Spring的JAVA Mail支持简化邮件发送功能

    闲来无事,翻看<Spring in Action>,发现Spring集成了对JAVA Mail的支持,有点小激动的看了一遍,嗯,话说真的简单了很多. Spring的邮件发送的核心是Mail ...

  8. java mail 学习笔记

    JAVA MAIL 学习 笔记 电子邮件协议的简介 SMTP 简单邮件传输 SMTP是Simple Mail Transfer Protocol的简称,即简单邮件传输协议.该协议定义了邮件客户端软件和 ...

  9. java邮件接收代码,JavaMail入门第四篇 接收邮件(示例代码)

    上一篇JavaMail入门第三篇 发送邮件中,我们学会了如何用JavaMail API提供的Transport类发送邮件,同样,JavaMail API中也提供了一些专门的类来对邮件的接收进行相关的操 ...

  10. Java Mail 邮件发送(一):入门Demo

    本文首发于简书,Java Mail 邮件发送(一):Demo 上周公司的项目要求开发邮件发送功能.自己在网上跟着教程边学边做了一下午,现在基本开发完成了.由于一个同事也想看下该怎么写,顺便学习下.所以 ...

最新文章

  1. 【正一专栏】巴萨艰难收获一场平局
  2. python中使用for循环,while循环,一条命令打印99乘法表
  3. 133. Clone Graph 克隆图
  4. java drawimage()方法
  5. win10关闭“Windows安全中心”功能的两种方法
  6. java-图像的几何变换
  7. 在公司具备这三个条件,就准备好跳槽吧
  8. [PHP]Yii rules常用规则
  9. 导入图片后截取_如何截取视频片段?这几个方法比专业剪辑软件还好用!
  10. 2022年6月TIOBE编程语言排名:Python、C、Java
  11. python信息安全书籍_2018年信息安全从业者书单推荐
  12. 简述JVM垃圾回收机制
  13. 下载谷歌瓦片地图并拼接为高清大图
  14. Windows版bitcoin客户端编译
  15. 触觉智能分享-RK3568 Android11修改默认输入法
  16. 黑客入侵微软邮件服务器部署勒索软件、惠普更新打印机漏洞|12月2日全球网络安全热点
  17. 为什么我们需要关注基于 EIP-3664 标准的可拆分,可组合的NFT?
  18. Linux Debian 系统的单网卡绑定多个IP地址的操作步骤
  19. 井号法(#)创建二叉树(利用前序遍历来建树)C++实现
  20. 现代IT项目中的需求管理如何做?

热门文章

  1. 微机原理与接口技术考点一文全(待更)
  2. 数据安全-整体解决方案
  3. 新思维计算机软件中心,新思维 通信建设工程预算编制软件
  4. Kindeditor富文本使用
  5. splitcontainer控件删除方法
  6. 显示器是计算机多媒体的什么设备,多媒体输入设备有哪些
  7. echarts快速实现迁徙地图
  8. VHDL——分频器设计
  9. 爱看小说网源码全站带数据打包ThinkPHP内核小说网站源码
  10. springboot+vue汽车4S店车辆销售维修管理系统java源码