概述
要发送邮件,必须借助已有的SMTP服务。要么借助本地安装的邮箱客户端,要么借助网络邮箱的SMTP服务。
从本地直接凭空将信息发送到某个指定邮箱是做不到的。
这里使用网络邮箱的SMTP服务。
开启SMTP服务
网络邮箱的SMTP服务默认都是关闭的,需要进入设置后打开。
所有网络邮箱开启SMTP服务的方式都基本相同。这里以QQ邮箱为例。打开邮箱后点击设置,选择其下的账户选项卡:
向下找到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,然后将其中的IMAP/SMTP服务打开。
注意后面的 (什么是 IMAP,它又是如何设置?) ,点击后弹出说明,在里面可以看到QQ邮箱的发送邮件服务器地址,后面会用到。
点击开启IMAP/SMTP服务,会弹窗提示需要用绑定的手机发短信到指定号码:
发送后,点击我已发送,就会开启SMTP并给出授权码。记下该授权码,后面要用到。
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
修改配置文件
spring:
mail:
host: smtp.qq.com # 发送邮件服务器。
username: xxx@qq.com # 发送邮件的邮箱地址。
password: xxx # 客户端授权码,非邮箱密码。由QQ邮箱生成。
default-encoding: utf-8 # 编码。
properties:
mail:
smtp:
port: 465 # 修改端口号为465(SMTP-over-SSL)。
ssl.enable: true # 开启SSL。
starttls:
enable: true
required: true
其中:
- host: 邮件服务器地址。各家地址是固定的。在QQ邮箱开启IMAP/SMTP服务的地方有说明(什么是 IMAP,它又是如何设置?),点击后可以在说明中看到QQ邮箱的发送邮件服务器为smtp.qq.com。其他邮箱同理。
- password: 客户端授权码,非邮箱密码。即前面开启SMTP服务后生成的授权码。
- mail.smtp.port: 端口号。默认为25。但25端口是SMTP,不安全,现在大多数邮件服务器都禁用该端口。因此将其修改为465端口,该端口是SMTPS,使用SSL/TLS通讯,更安全。但要注意必须配合
mail.smtp.ssl.enable
。 - mail.smtp.ssl.enable:开启SSL。若将端口更换为465,则必须开启。
发送
发送需要使用JavaMailSender
。首先要将其引入:
@Resource
private JavaMailSender javaMailSender;
简单邮件
简单邮件只包含标题和文字内容。使用SimpleMailMessage
来构造邮件消息。
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom(env.getProperty("spring.mail.username")); // 发送方地址。必须与配置中的username相同。
simpleMailMessage.setTo("xxx@qq.com"); // 接收方地址。
simpleMailMessage.setSubject("测试标题"); // 邮件标题。
simpleMailMessage.setText("测试内容"); // 邮件文字内容。
javaMailSender.send(simpleMailMessage);
复杂邮件
复杂邮件可在内容中嵌入html,可包含图片,可添加附件。
复杂邮件需要使用MimeMessage
来构造邮件消息。
try {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
messageHelper.setFrom(env.getProperty("spring.mail.username"));
messageHelper.setTo("xxx@qq.com");
messageHelper.setSubject("测试标题");
messageHelper.setText("<h1>标题</h1><br/><p>这是内容</p><img src=\"cid:image01\">", true); // html内容字符串。
// 添加html中引用的图片资源。
File image = new File("D:/TEST/testImage.jpg");
messageHelper.addInline("image01", new FileSystemResource(image));
// 添加附件。
File file = new File("D:/TEST/testFile.zip");
messageHelper.addAttachment("测试文件1", new FileSystemResource(file));
// 发送。
javaMailSender.send(messageHelper.getMimeMessage());
} catch (MessagingException e) {
e.printStackTrace();
}
其中:
MimeMessageHelper.setText()
可传入一个html格式的文本,该文本会以html形式展示在邮件内容中。注意第二个参数必须传入true
才会将第一个参数以html格式解析。- html格式文本中可以引用图片,其属性为
src="cid:image01"
。cid:
是固定格式,不需要修改。后面的image01
是自定义的图片id,需要与后面传入的图片资源对应起来。 MessageHelper.addInline()
第一个参数为资源的cid,与html格式文本中引用的cid对应起来。若无法对应,则此处传入的资源文件会作为附件添加到邮件中。MessageHelper.addAttachment()
第一个参数为附件的文件名。
其他
- 发送邮件需要耗费一定时间。哪怕是最简单的邮件,也无法做到请求后立即发送完成。
- 发送的附件不能包含
.bat
后缀的文件,否则收不到。