springboot邮件功能实现
Springboot spring-boot-starter-mail依赖实现发送邮件
情况一:发件人唯一,收件人自定义
使用包中 JavaMailSender 接口类
依赖导入
pom.xml
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
|
配置文件
application.properties(application.yml)
这里以163邮箱为例,只要可以获取SMTP功能的邮箱都可以使用
.properties文件配置方式: spring.mail.host=smtp.163.com(123.126.97.3) //邮箱服务器地址或者IP地址,两者皆可, //获取邮箱服务器地址的方法,直接通过搜索器搜索即可得到相应邮箱服务器地址,注意使用SMTP协议地址! //获得邮箱服务器IP地址方法,在获得服务器地址之后, //通过cmd命令: ping 邮箱服务器地址 可以获得 //IP地址和SMTP协议地址区别:IP地址更加直接。
//邮箱用户名 例如 talent_management@163.com spring.mail.username=xxx@oo.com
//注意:这里不是邮箱密码,而是开启SMTP功能后获得的授权码,开启方法可自行搜索 spring.mail.password=xxxxxxx //规定默认编码 spring.mail.default-encoding=UTF-8 //指定邮箱发送端口 spring.mail.port=465 //以下配置不知道有什么用 spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.starttls.enable=false spring.mail.properties.mail.smtp.starttls.required=false spring.mail.properties.mail.smtp.socketFactory.port=465 spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory spring.mail.properties.mail.smtp.socketFactory.fallback=false
//全局定义一个发送方邮箱地址,最好跟上方用户名相同 //通过@Value调用 mail.fromMail.addr=talent_management@163.com
|
spring: mail: host: 123.126.97.3 //邮箱服务器IP地址或地址,这里用的是163邮箱STMP地址对应IP username: talent_management@163.com password: xxxxx default-encoding: UTF-8 port: 465 properties: mail: smtp: auth: true starttls: enable: true required: true socketFactory: port: 465 class: javax.net.ssl.SSLSocketFactory fallback: false mail: fromMail: addr: talent_management@163.com
|
具体实现
MailService 接口和 MailServiceImpl实现
实现最简单的邮件发送
方法实现
@Service public class MailServiceImpl implements MailService { private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired private JavaMailSender mailSender;
@Value("${mail.fromMail.addr}") private String from;
@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); } } }
|
测试发送简单邮件
@Test void testSimpleMail() throws Exception { String checkCode = String.valueOf(new Random().nextInt(899999) + 100000); String message = " 【跨平台人才管理组织】验证码:" + checkCode + ",该验证码5分钟内有效,请勿泄露于他人!"; System.out.println(checkCode); MailService.sendSimpleMail("1246426827@qq.com", "跨平台人才管理平台验证", message); }
|
实现html页面发送(在上文件中加入该方法)
public void sendHtmlMail(String to, String subject, String content) { MimeMessage message = mailSender.createMimeMessage();
try { 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 (MessagingException e) { logger.error("发送html邮件时发生异常!", e); } }
|
情况一:获取的数据直接是html文件的所有字符组成的字符串
可以直接使用上述方法
测试:
@Test public void testHtmlMail() throws Exception { String content = "<html>\n" + "<body>\n" + " <h3>这是一封Html邮件!</h3>\n" + "</body>\n" + "</html>"; MailService.sendHtmlMail("1246426827@qq.com", "test simple mail", content); }
|
情况二,获取到的是html文件里的部分可自定义数据
需要将这些数据先填入html文件当中过后,再发送
案例:具有固定格式的验证码发送邮件实现
- 需要添加的文件: 验证码邮件html页面:email_template.html
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <meta charset="utf-8"/> </head> <body> <div class="qmbox qm_con_body_content qqmail_webmail_only" id="mailContentContainer" style=""> <style type="text/css"> .qmbox body { margin: 0; padding: 0; background: #fff; font-family: "Verdana, Arial, Helvetica, sans-serif"; font-size: 14px; line-height: 24px; }
.qmbox div, .qmbox p, .qmbox span, .qmbox img { margin: 0; padding: 0; }
.qmbox img { border: none; }
.qmbox .contaner { margin: 0 auto; }
.qmbox .title { margin: 0 auto; background: url() #CCC repeat-x; height: 30px; text-align: center; font-weight: bold; padding-top: 12px; font-size: 16px; }
.qmbox .content { margin: 4px; }
.qmbox .biaoti { padding: 6px; color: #000; }
.qmbox .xtop, .qmbox .xbottom { display: block; font-size: 1px; }
.qmbox .xb1, .qmbox .xb2, .qmbox .xb3, .qmbox .xb4 { display: block; overflow: hidden; }
.qmbox .xb1, .qmbox .xb2, .qmbox .xb3 { height: 1px; }
.qmbox .xb2, .qmbox .xb3, .qmbox .xb4 { border-left: 1px solid #BCBCBC; border-right: 1px solid #BCBCBC; }
.qmbox .xb1 { margin: 0 5px; background: #BCBCBC; }
.qmbox .xb2 { margin: 0 3px; border-width: 0 2px; }
.qmbox .xb3 { margin: 0 2px; }
.qmbox .xb4 { height: 2px; margin: 0 1px; }
.qmbox .xboxcontent { display: block; border: 0 solid #BCBCBC; border-width: 0 1px; }
.qmbox .line { margin-top: 6px; border-top: 1px dashed #B9B9B9; padding: 4px; }
.qmbox .neirong { padding: 6px; color: #666666; }
.qmbox .foot { padding: 6px; color: #777; }
.qmbox .font_darkblue { color: #006699; font-weight: bold; }
.qmbox .font_lightblue { color: #008BD1; font-weight: bold; }
.qmbox .font_gray { color: #888; font-size: 12px; } </style> <div class="contaner"> <div class="title">$(title)</div> <div class="content"> <p class="biaoti"><b>亲爱的用户,你好!</b></p> <b class="xtop"><b class="xb1"></b><b class="xb2"></b><b class="xb3"></b><b class="xb4"></b></b> <div class="xboxcontent"> <div class="neirong"> <p><b>请核对你的用户名:</b><span id="userName" class="font_darkblue">$(userName)</span></p> <p><b>$(type)的验证码:</b><span class="font_lightblue"><span id="yzm" data="$(captcha)" onclick="return false;" t="7" style="border-bottom: 1px dashed rgb(204, 204, 204); z-index: 1; position: static;">$(captcha)</span></span><br><span class="font_gray">(请输入该验证码完成$(type),验证码30分钟内有效!)</span></p> <div class="line">如果你未申请$(type)服务,请忽略该邮件。</div> </div> </div> <b class="xbottom"><b class="xb4"></b><b class="xb3"></b><b class="xb2"></b><b class="xb1"></b></b> <p class="foot">如果仍有问题,请拨打我们的会员服务专线: <span data="800-820-5100" onclick="return false;" t="7" style="border-bottom: 1px dashed rgb(204, 204, 204); z-index: 1; position: static;">021-51875288 </span></p> </div> </div> <style type="text/css"> .qmbox style, .qmbox script, .qmbox head, .qmbox link, .qmbox meta { display: none !important; } </style> </div> </body> </html>
|
上述页面需要填入的信息:title、userName、type、captcha
@Component public class EmailTemplate { public void initEmailTemplate() { StringBuilder sb = new StringBuilder(); try { String encoding = "UTF-8"; ClassPathResource classPathResource = new ClassPathResource("templates/emailTemplate.html"); InputStream resourceAsStream = classPathResource.getInputStream(); InputStreamReader read = new InputStreamReader( resourceAsStream, encoding); BufferedReader bufferedReader = new BufferedReader(read); String lineTxt = null; while ((lineTxt = bufferedReader.readLine()) != null) { sb.append(lineTxt); } System.setProperty("emailTemplate", sb.toString()); System.out.println("注入文件:"+sb.toString()); resourceAsStream.close(); read.close(); System.out.println("注入完成"); } catch (IOException e) { System.out.println("读取文件内容出错"); e.printStackTrace(); } } }
|
public String setHtmlString(String title, String userName, String type, String captcha) { String emailTemplet = System.getProperty("emailTemplate");
emailTemplet = emailTemplet.replace("$(title)", title); emailTemplet = emailTemplet.replace("$(userName)", userName); emailTemplet = emailTemplet.replace("$(type)", type); emailTemplet = emailTemplet.replace("$(captcha)", captcha); return emailTemplet; }
|
@Autowired private EmailTemplate emailTemplate; @Test public void testHtmlFileSend(){ emailTemplate.initEmailTemplate(); String content = emailTemplate.setHtmlString("title", "userName", "邮箱绑定", "验证码"); MailService.sendHtmlMail("1246426827@qq.com", "跨组织人才管理系统验证码", content); }
|
实现带附件的邮件发送
方法实现
public void sendAttachmentsMail(String to, String subject, String content, String filePath){ 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 file = new FileSystemResource(new File(filePath)); String fileName = filePath.substring(filePath.lastIndexOf(File.separator)); helper.addAttachment(fileName, file);
mailSender.send(message); logger.info("带附件的邮件已经发送。"); } catch (MessagingException e) { logger.error("发送带附件的邮件时发生异常!", e); } }
|
添加多个附件可以使用多条 helper.addAttachment(fileName, file)
测试带附件的邮件发送
@Test public void sendAttachmentsMail() { String filePath="e:\\tmp\\application.log"; mailService.sendAttachmentsMail("1246426827@qq.com", "主题:带附件的邮件", "有附件,请查收!", filePath); }
|
实现带静态资源的邮件发送
方法实现
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 (MessagingException e) { logger.error("发送嵌入静态资源的邮件时发生异常!", e); } }
|
测试带静态资源的邮件发送
@Test public void sendInlineResourceMail() { String rscId = "111"; String content="<html><body>这是有图片的邮件:<img src=\'cid:" + rscId + "\' ></body></html>"; String imgPath = "C:\\Users\\summer\\Pictures\\favicon.png";
mailService.sendInlineResourceMail("1246426827@qq.com", "有图片的邮件", content, imgPath, rscId); }
|
情况二:发件人自定义,收件人自定义
使用包中 JavaMailSenderImpl 类
上述情况,我们是通过在 application.properties(application.yml)中全局的配置 host,username,password等属性
然后通过 JavaMailSender类中的接口 send() 进行邮件发送
JavaMailSenderImpl是JavaMailSender的实现类,内部声明了host,username,password,port,default-encoding等属性
情况二是通过使用该实现类来进行实时的配置属性,即在发送邮件的时候来对properties配置
依赖导入
同样是导入 spring-boot-starter-mail 包