邮件服务

简介

我们日常生活中使用邮件服务的场景比较常见和多样化,比如系统异常发送邮件通知管理员,比如京东,天猫广告邮件等

依赖


        
            org.springframework.boot
            spring-boot-starter-mail
        

application.yml配置

#邮件参数设置
spring:
  mail:
    # 设置邮箱主机
    host: smtp.163.com
    #    邮箱端口号
    port: 465
    # 设置用户名
    username: [email protected]
    # 设置密码,该处的密码是邮箱开启SMTP的授权码而非自己登陆邮箱的密码
    password: xxxxxx
    default-encoding: utf-8
    # 设置是否需要认证,如果为true,那么用户名和密码就必须的,
    # 如果设置false,可以不设置用户名和密码,当然也得看你的对接的平台是否支持无密码进行访问的。
    properties:
      mail:
        smtp:
          ssl:
            enable: true
          auth: true
          starttls:
            # STARTTLS[1]  是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL),而不是另外使用一个端口作加密通信。
            enable: true
            required: true
          socketFactory:
            port: 465
          port: 465
          timeout: 25000

识别yml配置类MailSenderAutoConfiguration

可以看到MailSenderAutoConfiguration中自动识别spring.mail 的配置,以及@EnableConfigurationProperties({MailProperties.class})

package org.springframework.boot.autoconfigure.mail;

@Configuration(
    proxyBeanMethods = false
)
@ConditionalOnClass({MimeMessage.class, MimeType.class, MailSender.class})
@ConditionalOnMissingBean({MailSender.class})
@Conditional({MailSenderAutoConfiguration.MailSenderCondition.class})
@EnableConfigurationProperties({MailProperties.class})
@Import({MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class})
public class MailSenderAutoConfiguration {
    public MailSenderAutoConfiguration() {
    }

    static class MailSenderCondition extends AnyNestedCondition {
        MailSenderCondition() {
            super(ConfigurationPhase.PARSE_CONFIGURATION);
        }

        @ConditionalOnProperty(
            prefix = "spring.mail",
            name = {"jndi-name"}
        )
        static class JndiNameProperty {
            JndiNameProperty() {
            }
        }

        @ConditionalOnProperty(
            prefix = "spring.mail",
            name = {"host"}
        )
        static class HostProperty {
            HostProperty() {
            }
        }
    }
}

MailProperties

@ConfigurationProperties(
    prefix = "spring.mail"
)
public class MailProperties {
    private static final Charset DEFAULT_CHARSET;
    private String host;
    private Integer port;
    private String username;
    private String password;
    private String protocol = "smtp";
    private Charset defaultEncoding;
    private Map properties;
    private String jndiName;

简单邮件服务

从引入的依赖看出,spring-boot-starter-mail-xxx.jar对Sun公司的邮件api功能进行了相应的封装。


image.png

如果想单纯的发送简单的邮件服务,只需要使用MailSender对象即可

 @Autowired
 private MailSender mailSender;

他里面提供了两个简单的邮件发送方法
……

public interface MailSender {
    void send(SimpleMailMessage simpleMessage) throws MailException;
    void send(SimpleMailMessage... simpleMessages) throws MailException;
}

demo

@Service
public class MailServiceImpl implements MailService {
        //    @Autowired
    //    private MailSender mailSender;
    @Value("${spring.mail.username}")
    private String from;
 
    @Override
    public void simpleMail(String to, String subject, String mailText) throws Exception {
        SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
        simpleMailMessage.setFrom(from);
        simpleMailMessage.setTo(to);
        simpleMailMessage.setSubject(subject);
        simpleMailMessage.setText(mailText);
        mailSender.send(simpleMailMessage);
    }

富文本邮件服务

如果想要发送带有html样式、附件等的富文本邮件,那么简单的邮件服务就不能满足需求了,需要使用JavaMailSender 的createMimeMessage()方法来创建MimeMessage对象才行了。可以发现JavaMailSender 其实是继承MailSender的,所以使用这个也是可以使用简单邮件的方法。


image.png

发送富文本邮件需要借助MimeMessageHelper来完成

  1. 发送带有html样式的邮件内容 mimeMessageHelper.setText(mailText, true);设置为true就可以发送html的样式内容了
  2. 发送附件内容 mimeMessageHelper.addAttachment(file.getOriginalFilename(), file);
    @Value("${spring.mail.username}")
    private String from;
    @Autowired
    private JavaMailSender mailSender;

    @Override
    public void richTextMail(String to, String subject, String mailText, MultipartFile[] multipartFiles) throws Exception {
        MimeMessage mimeMessage = mailSender.createMimeMessage();
//        第二个参数表示消息是multipart类型的
        MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);
        mimeMessageHelper.setFrom(from);
        mimeMessageHelper.setTo(to);
        mimeMessageHelper.setSubject(subject);
        //true表示是否启动html模式
        mimeMessageHelper.setText(mailText, true);
        for (MultipartFile file : multipartFiles) {
            mimeMessageHelper.addAttachment(file.getOriginalFilename(), file);
        }
        mailSender.send(mimeMessage);
    }

注意,发送附件的邮件需要设置MultipartFile的配置 ,不然附件的大小等有可能超过限制

@Configuration
public class MultipartConfig {
    @Bean
    public MultipartConfigElement multipartConfigElement() {
        MultipartConfigFactory factory = new MultipartConfigFactory();
        //  单个数据大小
        factory.setMaxFileSize(DataSize.parse("102400KB"));
        /// 总上传数据大小
        factory.setMaxRequestSize(DataSize.parse("102400KB"));
        //设置文件路径
        factory.setLocation("/app/temp/");
        //默认值是0 ,就是不管文件大小,都会将文件保存到磁盘中
        //factory.setFileSizeThreshold(DataSize.parse("0B"));
        return factory.createMultipartConfig();
    }
}

邮件模板

可以结合thymelefaf、velocity等模板进行邮件模板设置
具体参考spring 实战 第四版

其他错误

  1. 这种错误是因为使用的from 的对象要是yml中p配置的host才行


    image.png

    解决方法


    image.png
  2. couldnot connect to SMTP host:smtp.163.com,port:465,response:-1


    image.png

解决办法
阿里云服务器等都屏蔽了25号端口,可以采用465端口,但是明确了465端口之后还是不行,yml配置中需要增加这句话才可以真正的发送邮件。

 properties:
      mail:
        smtp:
          ssl:
            enable: true
image.png

参考资料
demo
使用SpringBoot发送mail邮件
spring实战第四版 spring in action

你可能感兴趣的:(邮件服务)