配置pom引入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
</dependencies>
在application.properties进行邮箱相关配置
# 不同邮箱不同配置
#163 邮箱配置:
spring.mail.host=smtp.163.com //邮箱服务器地址
spring.mail.username=yourEmail@163.com //用户名
spring.mail.password=xxyyooo //密码
spring.mail.default-encoding=UTF-8
#126 邮箱配置:
spring.mail.host=smtp.126.com
spring.mail.username=yourEmail@126.com
spring.mail.password=yourPassword
spring.mail.default-encoding=UTF-8
#QQ 邮箱配置:
spring.mail.host=smtp.qq.com
spring.mail.username=yourEmail@qq.com
spring.mail.password=yourPassword
spring.mail.default-encoding=UTF-8
#超时时间,可选
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=3000
spring.mail.properties.mail.smtp.writetimeout=5000
开启 POP 3 / SMTP 服务、IMAP / SMTP 服务(以QQ邮箱为例)
- 打开QQ邮箱设置
- 选择账户界面
- 下拉到POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
- 选择开启后获取授权密码
利用JavaMailSender进行简单的邮件发送
创建一个邮件发送服务接口:
public interface MailService {
void sendSimpleMail(String to, String subject, String content);
}
实现接口:
@Component
public class MailServiceImpl implements MailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender mailSender;
/**
* 邮件发送者,一般设置在配置文件中
*/
@Value("${spring.mail.username}")
private String from;
/**
* 简单邮件发送
*
* @param to 邮件接收者,此参数可以为数组,同时发送多人
* @param subject 邮件主题
* @param content 邮件的主体
*/
@Override
public void sendSimpleMail(String to, String subject, String content) {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(from);
message.setTo(to);
message.setSubject(subject);
message.setText(content);
try {
mailSender.send(message);
logger.info("简单邮件已经发送。");
} catch (Exception e) {
logger.error("发送简单邮件时发生异常!", e);
}
}
}
调试邮件发送功能
@RunWith(SpringRunner.class)
@Spring BootTest
public class MailServiceTest {
@Autowired
private MailService MailService;
@Test
public void testSimpleMail() throws Exception {
mailService.sendSimpleMail("yourFriend@qq.com","这是一封普通的邮件","大家好,这是我的第一封邮件!");
}
}
利用MimeMessageHelper类进行富文本邮件发送
- MimeMessageHelper 类还支持发送复杂邮件模板,支持文本、附件、HTML、图片等。
/**
* 发送Html格式邮件
*
* @param to 邮件接收者,此参数可以为数组,同时发送多人
* @param subject 邮件主题
* @param content 邮件的主体
*/
@Override
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = mailSender.createMimeMessage();
try {
//true 表示需要创建一个 multipart message
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
mailSender.send(message);
logger.info("html邮件发送成功");
} catch (Exception e) {
logger.error("发送html邮件时发生异常!", e);
}
}
发送带附件的邮件
/**
* 发送带附件的邮件
*
* @param to 邮件接收者,此参数可以为数组,同时发送多人
* @param subject 邮件主题
* @param content 邮件的主体
* @param filePath 文件路径
*/
@Override
public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource file = new FileSystemResource(new File(filePath));
String fileName = file.getFilename();
//多个附件,就多次添加文件
helper.addAttachment(fileName, file);
mailSender.send(message);
logger.info("带附件的邮件已经发送。");
} catch (Exception e) {
logger.error("发送带附件的邮件时发生异常!", e);
}
}
发送带静态资源的邮件
/**
* 发送带静态资源的邮件
*
* @param to 邮件接收者,此参数可以为数组,同时发送多人
* @param subject 邮件主题
* @param content 邮件的主体
* @param rscPath 资源路径
* @param rscId 资源ID
*/
@Override
public void sendInlineResourceMail(String to, String subject, String content, String rscPath, String rscId) {
MimeMessage message = mailSender.createMimeMessage();
try {
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content, true);
FileSystemResource res = new FileSystemResource(new File(rscPath));
helper.addInline(rscId, res);
mailSender.send(message);
logger.info("嵌入静态资源的邮件已经发送。");
} catch (Exception e) {
logger.error("发送嵌入静态资源的邮件时发生异常!", e);
}
}
- 测试发送一封带图片的邮件:
@Test
public void sendInlineResourceMail() {
String rscId = "testImg01";
String content = "<html><body>这是有图片的邮件:<img src=\'cid:" + rscId + "\' ></body></html>";
String imgPath = "C:\\Users\\lenovo\\Downloads\\0dd7912397dda1442866bd77b1b7d0a20df4868c.jpg";
mailService.sendInlineResourceMail("yourFriend@qq.com", "主题:这是有图片的邮件", content, imgPath, rscId);
}
邮件发送功能问题
- 对外提供发送邮件的服务接口
- 固定格式邮件是否考虑使用模板
- 发送邮件时出现网络错误,是否考虑适当的重试机制
- 邮件系统是否考虑异步化,提升服务响应时间
- 是否开发邮件后台管理系统、开发出对应的管理软件、通过页面发送邮件、统计发送邮件成功率等数据。
- 常见异常处理措施
邮件失败常见错误码
- 421 HL:ICC 该 IP 同时并发连接数过大,超过了网易的限制,被临时禁止连接。
- 451 Requested mail action not taken: too much fail authentication 登录失败次数过多,被临时禁止登录,请检查密码与帐号验证设置。
- 553 authentication is required,密码配置不正确。
- 554 DT:SPM 发送的邮件内容包含了未被许可的信息,或被系统识别为垃圾邮件,请检查是否有用户发送病毒或者垃圾邮件。
- 550 Invalid User 请求的用户不存在。
- 554 MI:STC 发件人当天内累计邮件数量超过限制,当天不再接收该发件人的投信。