SpringBoot2.x整合SMTP邮件服务(配置篇)

JAVA && Spring && SpringBoot2.x — 学习目录

SpringBoot中使用Freemarker构建邮箱模板
SpringBoot2.x整合SMTP邮件服务(配置篇)

1. javaMail概述

JavaMail是由sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类。

  • SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;
  • POP3:用于接收电子邮件的标准协议;
  • IMAP:互联网消息协议,是POP3的代替协议;

这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP3S和IMAPS。

2. SMTP协议

SMTP:简单邮件传输协议,是一个基于文本的协议。在其上指定了一个消息的一个或多个接收者(收件人和抄送人),然后消息文本会被传输。可以使用简单的telnet程序来测试一个SMTP服务器。

如今绝大多数邮件服务器都使用该协议。当你给别人发邮件时,你的服务器的某个动态端口(大于1024)就会和邮件服务器的25端口建立一个连接,你发送的邮件会通过这个连接传送到邮件服务器上,保存起来。

需要主要的是,现在国内外的大云主机商(例如:阿里云),多数不允许连接外网的25端口。不过可以使用javaMail来连接465端口进行发送邮件。

SMTP协议本身都是不安全的协议。因考虑到网络安全因素,可以使用基于SSL协议的安全邮件收发协议。即SMTPS(SMTP-over-SSL)。465端口便是基于SMTPS协议开放的

3. JavaMail的关键对象

JavaMail作为收发邮件进行高级的抽象,形成了一些关键的接口和类。

3.1 配置类

以SMTP协议为例子

属性名 属性类型 说明
mail.stmp.host String SMTP服务器地址,如smtp.qq.com
mail.stmp.port int SMTP服务器端口号,默认为25
mail.stmp.auth boolean SMTP服务器是否需要用户认证,默认为false
mail.stmp.user String SMTP默认的登陆用户名
mail.stmp.from String 默认的邮件发送源地址
mail.stmp.socketFactory.class String socket工厂类类名,通过设置该属性可以覆盖提供者默认的实现,必须实现javax.net.SocketFactory接口
mail.stmp.socketFactory.port int 指定socket工厂类所用的端口号,如果没有规定,则使用默认的端口号
mail.smtp.socketFactory.fallback boolean 设置为true时,当使用指定的socket类创建socket失败后,将使用Java.net.Socket创建socket,默认为true
mail.stmp.timeout int I/O连接超时时间,单位为毫秒,默认为永不超时

3.2 SpringBoot2.x配置

自动装载的源码:org.springframework.boot.autoconfigure.mail.MailSenderPropertiesConfiguration

  #集成邮件服务器
spring:
  mail:
    host: smtp.qq.com
    port: 465     #设置端口465,因为阿里25端口默认禁用
    username: 12xxxxxx@qq.com #邮箱地址
    password: asdjgsadkjad  #qq授权码,而非密码
    default-encoding: UTF-8   #默认编码
    protocol: smtp    #邮件协议
    properties:
      mail:
        smtp:
          timeout: 1000              #设置邮件发送超时时间(IO连接时间)
          ssl.trust: smtp.qq.com
          socketFactory:    #因为阿里云服务器25端口默认加密,需要改用sl加密465端口发送邮件
            class: javax.net.ssl.SSLSocketFactory #SSL证书Socket工厂(指定Socket工厂)
            port: 465                   #设置ssl端口
            fallback: true         #当指定的socket工厂创建socket失败时,是否使用默认的socket工厂创建
          auth: true  # 设置是否需要认证,如果为true,那么用户名和密码就必须的
          # 是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL),而不是另外使用一个端口作加密通信。
          starttls:
            enable: true
            required: true

  freemarker:
    settings:
      classic_compatible: true   #解决模板空指针问题

文章参考

JavaMail发送和接收邮件

http://www.360doc.com/content/18/0124/10/7831345_724640547.shtml

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。