摘要:前景介紹在日常的工作中,我們經(jīng)常會(huì)用到郵件服務(wù),比如發(fā)送驗(yàn)證碼,找回密碼確認(rèn),注冊(cè)時(shí)郵件驗(yàn)證等,所以今天在這里進(jìn)行郵件服務(wù)的一些操作。
前景介紹
在日常的工作中,我們經(jīng)常會(huì)用到郵件服務(wù),比如發(fā)送驗(yàn)證碼,找回密碼確認(rèn),注冊(cè)時(shí)郵件驗(yàn)證等,所以今天在這里進(jìn)行郵件服務(wù)的一些操作。
大致思路我們要做的其實(shí)就是把Java程序作為一個(gè)客戶端,然后通過(guò)配置SMTP協(xié)議去連接我們所使用的發(fā)送郵箱(from)對(duì)應(yīng)的SMTP服務(wù)器,然后通過(guò)SMTP協(xié)議,將郵件轉(zhuǎn)投到目標(biāo)郵箱(to)對(duì)應(yīng)的SMTP服務(wù)器,最后將該郵件分發(fā)到目標(biāo)郵箱
Spring Boot給我們集成了郵件的相關(guān)服務(wù),并給出了對(duì)應(yīng)的starter,這里我們來(lái)實(shí)戰(zhàn)學(xué)習(xí)一下郵件服務(wù)是怎么玩的。
引入POM萬(wàn)年不變的第一步:引入所需要的starter依賴,這里我采用的是和我的Spring Boot對(duì)應(yīng)的版本2.1.4,其余版本的話應(yīng)該是相差不大,可以同樣作為借鑒
配置文件org.springframework.boot spring-boot-starter-mail 2.1.4.RELEASE
這里由于國(guó)內(nèi)有幾大郵箱運(yùn)營(yíng)商,所以分為四種不同的情況來(lái)說(shuō)明
QQ郵箱
QQ郵箱是比較麻煩的一種,需要登錄到郵箱中找到對(duì)應(yīng)的配置,并驗(yàn)證密碼后開(kāi)啟STMP服務(wù)
點(diǎn)擊這里可以去獲取對(duì)應(yīng)的授權(quán)碼,后面的配置中我們會(huì)用到~
個(gè)人QQ郵箱的SMTP服務(wù)器的host是:smtp.qq.com
163郵箱
對(duì)應(yīng)的授權(quán)碼就是我們郵箱的密碼~
SMTP服務(wù)器的host是:smtp.163.com
騰訊企業(yè)郵箱
對(duì)應(yīng)的授權(quán)碼也是我們郵箱的密碼
企業(yè)的和個(gè)人的host略有不同:smtp.exmail.qq.com
阿里企業(yè)郵箱
對(duì)應(yīng)的授權(quán)碼也是我們郵箱的密碼
阿里的企業(yè)郵箱host是: smtp.mxhichina.com
得到對(duì)應(yīng)的信息之后,我們就可以去完善我們的配置信息了 ~
# 這里的host對(duì)應(yīng)是上面的幾大運(yùn)營(yíng)商的STMP服務(wù)器的host spring.mail.host=smtp.163.com spring.mail.username=****@163.com # 這里的password對(duì)應(yīng)的就是上面的授權(quán)碼 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編寫郵件的實(shí)體類
/** * 郵件實(shí)體類 * @author vi * @since 2019/07/17 */ @Data @NoArgsConstructor @AllArgsConstructor public class Mail { /** * 郵件發(fā)送人 */ private String from; /** * 郵件接收人 */ private String to; /** * 郵件主題 */ private String subject; /** * 郵件內(nèi)容 */ private String content; /** * 郵件主題 */ private String type; /** * 發(fā)送郵件模板時(shí)的模板文件名 */ private String templateName; /** * 模板參數(shù) */ private Map編寫發(fā)送郵件的方法variables; /** * 附件地址 */ private String attachPath; }
在這里,我將發(fā)送郵件分為了兩種情況:
發(fā)送普通郵件
/** * 發(fā)送普通郵件 * @param email 郵件對(duì)象 */ private static void sendSimpleMail(Mail email) { SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); // 郵件發(fā)送人 simpleMailMessage.setFrom(email.getFrom()); // 郵件接收人 simpleMailMessage.setTo(email.getTo()); // 郵件主題 simpleMailMessage.setSubject(email.getSubject()); // 郵件內(nèi)容 simpleMailMessage.setText(email.getContent()); // 發(fā)送郵件 javaMailSender.send(simpleMailMessage); }
發(fā)送MIME類型郵件(比如模板,附件,HTML都屬于該類型的郵件)
/** * 發(fā)送MIME類型的郵件 * @param email 郵件對(duì)象 */ private static void sendMimeMail(Mail email) { // 生成郵件字符串 String content = email.getContent(); if (email.getVariables() != null) { content = generate(email); } // 基于這個(gè)對(duì)象可以發(fā)送HTML,或者攜帶附件的二進(jìn)制郵件 MimeMessage message= javaMailSender.createMimeMessage(); try { // 構(gòu)建發(fā)送模板郵件的對(duì)象 MimeMessageHelper helper = new MimeMessageHelper(message,true); // 設(shè)置發(fā)送郵箱 helper.setFrom(email.getFrom()); // 設(shè)置接收郵箱 helper.setTo(email.getTo()); // 設(shè)置郵件名(主題) helper.setSubject(email.getSubject()); // 設(shè)置郵件內(nèi)容 helper.setText(content,true); // 這里可以發(fā)送帶有附件的郵件,如果沒(méi)有附件可以省略,就不在多做描述 if (!StringUtils.isNullOrEmpty(email.getAttachPath())) { FileSystemResource file = new FileSystemResource(new File(email.getAttachPath())); helper.addAttachment(file.getFilename(), file); } // 發(fā)送郵件 javaMailSender.send(message); } catch (MessagingException e) { } } /** * 生成模板字符串 * @param email 郵件對(duì)象 * @return */ private static String generate(Mail email) { Context context = new Context(); // 設(shè)置模板參數(shù) context.setVariables(email.getVariables()); // 加載模板后的內(nèi)容字符串 return templateEngine.process(email.getTemplateName(), context); }
最后可以把這兩個(gè)方法統(tǒng)一接口,通過(guò)Mail類中的類型來(lái)判斷調(diào)用哪一個(gè)方法即可~
/** * 對(duì)外開(kāi)放的統(tǒng)一發(fā)送郵件方法 * @param mail */ public static void sendEmail(Mail mail) { String type = mail.getType(); switch (type) { case "1": sendSimpleMail(mail); case "2": sendMimeMail(mail); } }關(guān)于模板的一些補(bǔ)充
如果我們需要發(fā)送模板郵件的話,需要使用到模板引擎freemaker或thymeleaf,這里我拿thymeleaf來(lái)說(shuō)一下~
第一步,可以引入pom文件
org.springframework.boot spring-boot-starter-thymeleaf
第二步,需要在配置文件中進(jìn)行配置
spring.thymeleaf.check-template-location=true spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML5 spring.thymeleaf.encoding=UTF-8
第三步,通過(guò)我們獲取到的模板參數(shù)對(duì)Mail類進(jìn)行set方法
mail.setVariables(email.getVariables());
第四步,我們需要在模板中去使用參數(shù)
Insert title here
注意,這里的thymeleaf的用法,使用標(biāo)簽th:text來(lái)賦值,更多的模板用法,可以去
查閱thymeleaf的用法~
后記郵件在這里就告一段落了,下篇預(yù)告:JVM系列(一):JVM簡(jiǎn)介,敬請(qǐng)期待,謝謝大家一直以來(lái)的支持!
公眾號(hào)原創(chuàng)文章,文筆有限,才疏學(xué)淺,文中若有不正之處,萬(wàn)望告知!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/76150.html
摘要:前言如題,今天介紹下是如何整合的。存儲(chǔ)結(jié)構(gòu)如下男一個(gè)優(yōu)秀的廢人準(zhǔn)備工作創(chuàng)建一個(gè)名為的數(shù)據(jù)庫(kù),不會(huì)建的。層實(shí)現(xiàn)類添加學(xué)生信息根據(jù)刪除學(xué)生信息更新學(xué)生信息根據(jù)查詢學(xué)生信息查詢學(xué)生信息列表層測(cè)試結(jié)果測(cè)試已經(jīng)全部通過(guò),這里僅展示了保存操作。 微信公眾號(hào):一個(gè)優(yōu)秀的廢人。如有問(wèn)題,請(qǐng)后臺(tái)留言,反正我也不會(huì)聽(tīng)。 showImg(https://segmentfault.com/img/remote...
摘要:前言如題,今天介紹下是如何整合的。存儲(chǔ)結(jié)構(gòu)如下男一個(gè)優(yōu)秀的廢人準(zhǔn)備工作創(chuàng)建一個(gè)名為的數(shù)據(jù)庫(kù),不會(huì)建的。層實(shí)現(xiàn)類添加學(xué)生信息根據(jù)刪除學(xué)生信息更新學(xué)生信息根據(jù)查詢學(xué)生信息查詢學(xué)生信息列表層測(cè)試結(jié)果測(cè)試已經(jīng)全部通過(guò),這里僅展示了保存操作。 微信公眾號(hào):一個(gè)優(yōu)秀的廢人。如有問(wèn)題,請(qǐng)后臺(tái)留言,反正我也不會(huì)聽(tīng)。 showImg(https://segmentfault.com/img/remote...
摘要:需要注意的是必須要使用版本為以上才支持屬性。與格式文件不同,正對(duì)不同的,無(wú)法在一個(gè)文件設(shè)置,官方采用命名形式為格式來(lái)達(dá)成一樣的效果。采用方式添加的是屬于額外激活的,也就是說(shuō)覆蓋掉外部傳入的指定的。 showImg(https://segmentfault.com/img/remote/1460000019924197?w=1050&h=500); Spring Boot Profile...
摘要:代碼如下所示自定義業(yè)務(wù)實(shí)現(xiàn)恒宇少年碼云消息內(nèi)容是否顯示消息內(nèi)容,我們內(nèi)的代碼比較簡(jiǎn)單,根據(jù)屬性參數(shù)進(jìn)行返回格式化后的字符串。 在我們學(xué)習(xí)SpringBoot時(shí)都已經(jīng)了解到starter是SpringBoot的核心組成部分,SpringBoot為我們提供了盡可能完善的封裝,提供了一系列的自動(dòng)化配置的starter插件,我們?cè)谑褂胹pring-boot-starter-web時(shí)只需要在po...
摘要:本文是作者自己對(duì)中線程的狀態(tài)線程間協(xié)作相關(guān)使用的理解與總結(jié),不對(duì)之處,望指出,共勉。當(dāng)中的的數(shù)目而不是已占用的位置數(shù)大于集合番一文通版集合番一文通版垃圾回收機(jī)制講得很透徹,深入淺出。 一小時(shí)搞明白自定義注解 Annotation(注解)就是 Java 提供了一種元程序中的元素關(guān)聯(lián)任何信息和著任何元數(shù)據(jù)(metadata)的途徑和方法。Annotion(注解) 是一個(gè)接口,程序可以通過(guò)...
閱讀 2752·2021-10-26 09:50
閱讀 2395·2021-10-11 11:08
閱讀 2135·2019-08-30 15:53
閱讀 1913·2019-08-30 15:44
閱讀 2389·2019-08-28 18:12
閱讀 2528·2019-08-26 13:59
閱讀 2859·2019-08-26 12:19
閱讀 2759·2019-08-26 12:09