在日常的工作中,我们经常会用到邮件服务,比如发送验证码,找回密码确认,注册时邮件验证等,所以今天在这里进行邮件服务的一些操作。
大致思路我们要做的其实就是把Java程序作为一个客户端,然后通过配置SMTP协议去连接我们所使用的发送邮箱(from)对应的SMTP服务器,然后通过SMTP协议,将邮件转投到目标邮箱(to)对应的SMTP服务器,最后将该邮件分发到目标邮箱
Spring Boot给我们集成了邮件的相关服务,并给出了对应的starter,这里我们来实战学习一下邮件服务是怎么玩的。
引入POM万年不变的第一步:引入所需要的starter依赖,这里我采用的是和我的Spring Boot对应的版本2.1.4,其余版本的话应该是相差不大,可以同样作为借鉴
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> <version>2.1.4.RELEASE</version> </dependency> 配置文件这里由于国内有几大邮箱运营商,所以分为四种不同的情况来说明
QQ邮箱
QQ邮箱是比较麻烦的一种,需要登录到邮箱中找到对应的配置,并验证密码后开启STMP服务
点击这里可以去获取对应的授权码,后面的配置中我们会用到~
个人QQ邮箱的SMTP服务器的host是:smtp.qq.com
163邮箱
对应的授权码就是我们邮箱的密码~
SMTP服务器的host是:smtp.163.com
腾讯企业邮箱
对应的授权码也是我们邮箱的密码
企业的和个人的host略有不同:smtp.exmail.qq.com
阿里企业邮箱
对应的授权码也是我们邮箱的密码
阿里的企业邮箱host是: smtp.mxhichina.com
得到对应的信息之后,我们就可以去完善我们的配置信息了 ~
# 这里的host对应是上面的几大运营商的STMP服务器的host spring.mail.host=smtp.163.com spring.mail.username=****@163.com # 这里的password对应的就是上面的授权码 spring.mail.password=*** spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=true spring.mail.properties.mail.smtp.starttls.required=true spring.mail.default-encoding=UTF-8 编写邮件的实体类 /** * 邮件实体类 * @author vi * @since 2019/07/17 */ @Data @NoArgsConstructor @AllArgsConstructor public class Mail { /** * 邮件发送人 */ private String from; /** * 邮件接收人 */ private String to; /** * 邮件主题 */ private String subject; /** * 邮件内容 */ private String content; /** * 邮件主题 */ private String type; /** * 发送邮件模板时的模板文件名 */ private String templateName; /** * 模板参数 */ private Map<String,Object> variables; /** * 附件地址 */ private String attachPath; } 编写发送邮件的方法在这里,我将发送邮件分为了两种情况:
发送普通邮件
/** * 发送普通邮件 * @param email 邮件对象 */ private static void sendSimpleMail(Mail email) { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); // 邮件发送人 simpleMailMessage.setFrom(email.getFrom()); // 邮件接收人 simpleMailMessage.setTo(email.getTo()); // 邮件主题 simpleMailMessage.setSubject(email.getSubject()); // 邮件内容 simpleMailMessage.setText(email.getContent()); // 发送邮件 javaMailSender.send(simpleMailMessage); }发送MIME类型邮件(比如模板,附件,HTML都属于该类型的邮件)
/** * 发送MIME类型的邮件 * @param email 邮件对象 */ private static void sendMimeMail(Mail email) { // 生成邮件字符串 String content = email.getContent(); if (email.getVariables() != null) { content = generate(email); } // 基于这个对象可以发送HTML,或者携带附件的二进制邮件 MimeMessage message= javaMailSender.createMimeMessage(); try { // 构建发送模板邮件的对象 MimeMessageHelper helper = new MimeMessageHelper(message,true); // 设置发送邮箱 helper.setFrom(email.getFrom()); // 设置接收邮箱 helper.setTo(email.getTo()); // 设置邮件名(主题) helper.setSubject(email.getSubject()); // 设置邮件内容 helper.setText(content,true); // 这里可以发送带有附件的邮件,如果没有附件可以省略,就不在多做描述 if (!StringUtils.isNullOrEmpty(email.getAttachPath())) { FileSystemResource file = new FileSystemResource(new File(email.getAttachPath())); helper.addAttachment(file.getFilename(), file); } // 发送邮件 javaMailSender.send(message); } catch (MessagingException e) { } } /** * 生成模板字符串 * @param email 邮件对象 * @return */ private static String generate(Mail email) { Context context = new Context(); // 设置模板参数 context.setVariables(email.getVariables()); // 加载模板后的内容字符串 return templateEngine.process(email.getTemplateName(), context); }