使用SpringBoot集成邮件模块。
在自己的博客新加了评论功能,为了能让自己及时的看到别人在我的个人博客留言信息,我在项目中使用了邮件模块,只要别人在我的博客进行了留言、评论,我将会在第一时间看到并且回复。【因为我也不是每时每刻都在后台系统查看信息】。所以就是方便别人也方便了自己。
在使用邮件服务的时候遇到了一些坑,在下面我也会讲我是如何解决的。
学过计算机网络后,我们都知道,发送邮件就需要使用某种协议。比如什么SMTP、IMAP、POP3.
基础知识
什么是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协议。
进阶知识
什么是JavaMailSender和JavaMailSenderImpl?javaMailSender和JavaMailSenderImpl是Spring官方提供的集成邮件服务的接口和实现类,以简单高效的设计著称,目前是Java后端发送邮件和集成邮件服务的主流工具。
如何通过JavaMailSenderImpl发送邮件?非常简单,直接在业务类注入JavaMailSenderImpl并调用send方法发送邮件。其中简单邮件可以通过SimpleMailMessage来发送邮件,而复杂的邮件(例如添加附件)可以借助MimeMessageHelper来构建MimeMessage发送邮件。例如:
@Autowired
private JavaMailSenderImpl mailSender;
public void sendMail() throws MessagingException {
//简单邮件
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom("jiuyue@163.com");
simpleMailMessage.setTo("September@qq.com");
simpleMailMessage.setSubject("BugBugBug");
simpleMailMessage.setText("一杯茶,一根烟,一个Bug改一天");
mailSender.send(simpleMailMessage);
//复杂邮件
MimeMessage mimeMessage = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
messageHelper.setFrom("jiuyue@163.com");
messageHelper.setTo("September@qq.com");
messageHelper.setSubject("BugBugBug");
messageHelper.setText("一杯茶,一根烟,一个Bug改一天!");
messageHelper.addInline("bug.gif", new File("xx/xx/bug.gif"));
messageHelper.addAttachment("bug.docx", new File("xx/xx/bug.docx"));
mailSender.send(mimeMessage);
}
为什么JavaMailSenderImpl 能够开箱即用?所谓开箱即用其实就是基于官方内置的自动配置,翻看源码可知晓邮件自动配置类(MailSenderPropertiesConfiguration) 为上下文提供了邮件服务实例(JavaMailSenderImpl)。具体源码如下:
@Configuration
@ConditionalOnProperty(prefix = "spring.mail", name = "host")
class MailSenderPropertiesConfiguration {
private final MailProperties properties;
MailSenderPropertiesConfiguration(MailProperties properties) {
this.properties = properties;
}
@Bean
@ConditionalOnMissingBean
public JavaMailSenderImpl mailSender() {
JavaMailSenderImpl sender = new JavaMailSenderImpl();
applyProperties(sender);
return