前言
众所周知,现在在后台服务器中发送邮件已经是一个非常常用的功能了。通常来说虽然HTML并非是一个非常标准的信息格式,但是至少许多邮件客户端都至少支持一部分标记语言。 在这边教程中主要是关于教你如何在Spring Boot 应用中发送邮件以及使用非常简单强大的Thymeleaf模板引擎来制作邮件内容。
文章末尾附上源码,已经开源到Github上,是我公司做项目的时候处理邮件这一块用到的。 基本上覆盖了大部分邮件发送需求。稍微修改了一下,奉献给有需要的人。当你看完文章在看一下这封源码,你会对这一块更加的了解。而且你能掌握常用的邮件发送:
纯文本邮件
添加依赖(Mail starter dependencies)
首先制作并且通过SMTP邮件服务器来发送一个纯文本邮件。
如果你之前有用过Spring Boot的话,那你宁该并不好奇在你建立一个新工程的时候,Spring Boot已经帮你继承了常用的依赖库。 通常你只需要在你的 pom.xml 中添加如下依赖即可:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId></dependency>
邮件服务器属性配置(Properties configuration)
通常情况下,如果所需要的依赖在 class path 中都是可用的话,这时候Spring会自动帮你注册一个默认实现的邮件发送服务 (default mail sender service)。 spring.mail.host 属性已经被自动定义了, 所有我们所需要做的事情就是把这个属性添加到我们应用的 application.properties 配置文件中。
application.properties 在resource文件夹下
Spring Boot 提供的默认邮件发送服务 其实已经非常强大了,我们可以通过简单的配置它的属性就可以了。所谓的属性其实说白了就是配置它的邮件SMTP 服务器:
spring.mail.port=25 # SMTP server portspring.mail.username= # Login used for authenticationspring.mail.password= # Password for the given loginspring.mail.protocol=smtpspring.mail.defaultEncoding=UTF-8 # Default message encoding
这里附带一份 gmail 的SMTP服务器配置清单:
spring.mail.host = smtp.gmail.comspring.mail.username = *****@gmail.comspring.mail.password = ****spring.mail.properties.mail.smtp.auth = truespring.mail.properties.mail.smtp.socketFactory.port = 587spring.mail.properties.mail.smtp.socketFactory.class = javax.net.ssl.SSLSocketFactoryspring.mail.properties.mail.smtp.socketFactory.fallback = false
邮件发送服务(Mail sending service)
在这里我们使用 Autowired 在注入我们的service, 它主要就是生成邮件的相关信息
@Servicepublic class MailClient { private JavaMailSender mailSender; @Autowired public MailService(JavaMailSender mailSender) { this.mailSender = mailSender; } public void prepareAndSend(String recipient, String message) { //TODO implement } }
生成邮件内容
下面是一个简单的生成邮件内容的代码。
public void prepareAndSend(String recipient, String message) { MimeMessagePreparator messagePreparator = mimeMessage -> { MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage); messageHelper.setFrom("sample@dolszewski.com"); messageHelper.setTo(recipient); messageHelper.setSubject("Sample mail subject"); messageHelper.setText(message); }; try { mailSender.send(messagePreparator); } catch (MailException e) { // runtime exception; compiler will not force you to handle it }}
send() 需要被重写以接受不同类型的参数变量:
MimeMessageHelper类是MimeMessage的装饰类,它提供了更多的开发人员友好界面,并为类的许多属性添加了输入验证。你可以不用,但是别人肯定会用,而且你会后悔不用 XD。
send() 会抛出 **MailException ** 异常,这是个运行时异常,也就是通常所说的 RuntimeException。 在消息传递失败的情况下,很可能会重复发送操作,或者至少使用一些更复杂的解决方案处理这种情况,例如:使用相应的堆栈跟踪记录错误消息。
手动测试
通常如果你想邮件功能,你首先需要拥有一个SMTP服务器在你本机的电脑上处理你的请求。 如果你还没用过,下面给你们推荐一些常用的: