简介
我们日常生活中使用邮件服务的场景比较常见和多样化,比如系统异常发送邮件通知管理员,比如京东,天猫广告邮件等
依赖
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功能进行了相应的封装。
如果想单纯的发送简单的邮件服务,只需要使用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的,所以使用这个也是可以使用简单邮件的方法。
发送富文本邮件需要借助MimeMessageHelper来完成
- 发送带有html样式的邮件内容 mimeMessageHelper.setText(mailText, true);设置为true就可以发送html的样式内容了
- 发送附件内容 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 实战 第四版
其他错误
-
这种错误是因为使用的from 的对象要是yml中p配置的host才行
解决方法
-
couldnot connect to SMTP host:smtp.163.com,port:465,response:-1
解决办法
阿里云服务器等都屏蔽了25号端口,可以采用465端口,但是明确了465端口之后还是不行,yml配置中需要增加这句话才可以真正的发送邮件。
properties:
mail:
smtp:
ssl:
enable: true
参考资料
demo
使用SpringBoot发送mail邮件
spring实战第四版 spring in action