准备
依赖
<!--mail-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
按照之前我们了解的SpringBoot的自动装配原理,试着搜一搜MailAutoConfiguration,看看有没有这个类,结果还真有。不过他叫MailSenderAutoConfiguration
,那就接着看看MailProperties
呗!!
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ MimeMessage.class, MimeType.class, MailSender.class })
@ConditionalOnMissingBean(MailSender.class)
@Conditional(MailSenderCondition.class)
@EnableConfigurationProperties(MailProperties.class)
@Import({ MailSenderJndiConfiguration.class, MailSenderPropertiesConfiguration.class })
public class MailSenderAutoConfiguration {
/**
* Condition to trigger the creation of a {@link MailSender}. This kicks in if either
* the host or jndi name property is set.
*/
static class MailSenderCondition extends AnyNestedCondition {
MailSenderCondition() {
super(ConfigurationPhase.PARSE_CONFIGURATION);
}
@ConditionalOnProperty(prefix = "spring.mail", name = "host")
static class HostProperty {
}
@ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name")
static class JndiNameProperty {
}
}
}
MailProperties
我们可以明确的看见,他的内部就是我们之前在java-web时写的那些熟悉的配置。我们只需在application.yaml中修改就可以了。
@ConfigurationProperties(prefix = "spring.mail")
public class MailProperties {
private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
//SMTP server host. For instance, `smtp.example.com`.
private String host;
// SMTP server port.
private Integer port;
// Login user of the SMTP server.
private String username;
// Login password of the SMTP server.
private String password;
// Protocol used by the SMTP server.
private String protocol = "smtp";
// Default MimeMessage encoding.
private Charset defaultEncoding = DEFAULT_CHARSET;
//Additional JavaMail Session properties.
private Map<String, String> properties = new HashMap<>();
// Session JNDI name. When set, takes precedence over other Session settings.
private String jndiName;
……
}
配置application.yaml
spring:
mail:
username: 1287038845@qq.com
password: lncnwzwgwltohbih
host: smtp.qq.com
#开启加密验证
properties:
mail:
smtp:
ssl:
enable: true
测试代码:
@SpringBootTest
public class MailTest {
@Autowired
JavaMailSenderImpl mailSender;
//简单邮件
@Test
public void contextLoads(){
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setSubject("你好啊!!");
mailMessage.setText("这是一个测试邮件,springboot邮件!!");
mailMessage.setTo("1287038845@qq.com");
mailMessage.setFrom("1287038845@qq.com");
mailSender.send(mailMessage);
}
//复杂邮件
@Test
public void contextLoads2() throws MessagingException {
MimeMessage mimeMessage=mailSender.createMimeMessage();
//组装
MimeMessageHelper helper=new MimeMessageHelper(mimeMessage,true,"utf-8");;
//正文
helper.setSubject("你好啊!!这是一个复杂测试邮件!!");
//解析html
helper.setText("<h3 style='color:pink'>这是一个复杂测试邮件!!</h3>",true);
//附件
helper.addAttachment("girl.jpg",new File("D:\\springboot-mail\\src\\main\\resources\\gril.jpg"));
helper.setTo("1287038845@qq.com");
helper.setFrom("1287038845@qq.com");
mailSender.send(mimeMessage);
}
}
测试结果1:
测试结果2:
用到的几个类
JavaMailSenderImpl
制作{@link Java邮件发送器}接口的实现,
支持Java邮件{@linkMime消息MIME消息}和Spring{@链接简单邮件消息简单邮件消息}.
也可以用作普通的{@链接org.springframework.mail。 邮件发件人}实现,
允许将所有设置本地定义为bean属性。
或者,可以预先配置JavaMail{@link javax.mail.Session}指定,
可能从应用服务器的JNDI环境中提取。
此对象中的非默认属性将始终覆盖设置在Java邮件{@代码会话}中。
注意,如果在本地覆盖所有值,在设置预先配置的{@code Session}时没有附加值。
SimpleMailMessage、MimeMessage
前者是简单的邮件,后者是复杂邮件(包含html、附件等)。
MimeMessageHelper
这是一个帮助类, org.springframework.mail的简单设置器。 简单邮件消息,将数值直接应用于底层MIME消息。 允许定义由所有方法自动应用的整个消息的字符编码提供对HTML文本内容、图像等内联元素和典型元素的支持邮件附件。 还支持伴随邮件地址的个人姓名。 请注意,高级设置仍然可以直接应用于底层MIME消息对象!
他提供不同构造器给我们选择使用。例如:是否解析html,编码格式等。