郵件服務是常用的服務之一,作用很多,對外可以給用戶發送活動、營銷廣告等;對內可以發送系統監控報告與告警。
本文將介紹Springboot如何整合郵件服務,并給出不同郵件服務商的整合配置。
如圖所示:
Springboot搭建
Springboot的搭建非常簡單,我們使用 https://start.spring.io/來構建,十分方便,選擇需要用到的模塊,就能快速完成項目的搭建:
引入依賴
為了使用郵件服務,我們需要引入相關的依賴,對于Springboot加入下面的依賴即可:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency>
配置文件
需要配置郵件服務提供商的相關參數,如服務地址、用戶名及密碼等。下面的例子是QQ的配置,其中密碼并不是QQ密碼,而是QQ授權碼,后續我們再講怎么獲得。
Springboot的配置文件application.yml如下:
server: port: 8080 spring: profiles: active: qq --- spring: profiles: qq mail: host: smtp.qq.com username: xxx@qq.com password: xxx properties: mail: smtp: auth: true starttls: enable: true required: true --- spring: profiles: netEase mail: host: smtp.163.com username: xxx@163.com password: xxx properties: mail: smtp: auth: true starttls: enable: true required: true
實現發送服務
將JavaMailSender注入,組裝Message后,就可以發送最簡單的文本郵件了。
@Autowired private JavaMailSender emailSender; public void sendNormalText(String from, String to, String subject, String text) { SimpleMailMessage message = new SimpleMailMessage(); message.setFrom(from); message.setTo(to); message.setSubject(subject); message.setText(text); emailSender.send(message); }
調用接口
服務調用實現后,通過Controller對外暴露REST接口,具體代碼如下:
@Value("${spring.mail.username}") private String username; @Autowired private MailService mailService; @GetMapping("/normalText") public Mono<String> sendNormalText() { mailService.sendNormalText(username, username, "Springboot Mail(Normal Text)", "This is a mail from Springboot!"); return Mono.just("sent"); }
把實現的MailService注入到Controller里,調用對應的方法即可。本次的郵件發送人和收件人都是同一個帳戶,實際實現可以靈活配置。
通過Postman調用接口來測試一下能不能正常發送:
成功返回"sent",并收到了郵件,測試通過。
簡單文本郵件
簡單文本郵件如何發送,剛剛已經講解,不再贅述。
HTML郵件
純文本雖然已經能滿足很多需求,但很多時候也需要更加豐富的樣式來提高郵件的表現力。這時HTML類型的郵件就非常有用。
Service代碼如下:
public void sendHtml(String from, String to, String subject, String text) throws MessagingException { MimeMessage message = emailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(text, true); emailSender.send(message); }
與簡單的文本不同的是,本次用到了MimeMessage和MimeMessageHelper,這是非常有用的類,后續我們經常會用到,組合使用能大大豐富郵件表現形式。
Controller的代碼如下:
@GetMapping("/html") public Mono<String> sendHtml() throws MessagingException { mailService.sendHtml(username, username, "Springboot Mail(HTML)", "<h1>This is a mail from Springboot!</h1>"); return Mono.just("sent"); }
帶附件郵件
郵件發送文件再正常不過,發送附件需要使用MimeMessageHelper.addAttachment(String attachmentFilename, InputStreamSource inputStreamSource)方法,第一個參數為附件名,第二參數為文件流資源。Service代碼如下:
public void sendAttachment(String from, String to, String subject, String text, String filePath) throws MessagingException { MimeMessage message = emailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(text, true); FileSystemResource file = new FileSystemResource(new File(filePath)); helper.addAttachment(filePath, file); emailSender.send(message); }
Controller代碼如下:
@GetMapping("/attachment") public Mono<String> sendAttachment() throws MessagingException { mailService.sendAttachment(username, username, "Springboot Mail(Attachment)", "<h1>Please check the attachment!</h1>", "/Pictures/postman.png"); return Mono.just("sent"); }
帶靜態資源郵件
我們訪問的網頁其實也是一個HTML,是可以帶很多靜態資源的,如圖片、視頻等。Service代碼如下:
public void sendStaticResource(String from, String to, String subject, String text, String filePath, String contentId) throws MessagingException { MimeMessage message = emailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); helper.setText(text, true); FileSystemResource file = new FileSystemResource(new File(filePath)); helper.addInline(contentId, file); emailSender.send(message); }
其中,contentId為HTML里靜態資源的ID,需要對應好。
Controller代碼如下:
@GetMapping("/inlinePicture") public Mono<String> sendStaticResource() throws MessagingException { mailService.sendStaticResource(username, username, "Springboot Mail(Static Resource)", "<html><body>With inline picture<img src='cid:picture' /></body></html>", "/Pictures/postman.png", "picture"); return Mono.just("sent"); }
模板郵件
Java的模板引擎很多,著名的有Freemarker、Thymeleaf、Velocity等,這不是本點的重點,所以只以Freemarker為例使用。
Service代碼如下:
@Autowired private FreeMarkerConfigurer freeMarkerConfigurer; public void sendTemplateFreemarker(String from, String to, String subject, Map<String, Object> model, String templateFile) throws Exception { MimeMessage message = emailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom(from); helper.setTo(to); helper.setSubject(subject); Template template = freeMarkerConfigurer.getConfiguration().getTemplate(templateFile); String html = FreeMarkerTemplateUtils.processTemplateIntoString(template, model); helper.setText(html, true); emailSender.send(message); }
注意需要注入FreeMarkerConfigurer,然后使用FreeMarkerTemplateUtils解析模板,返回String,就可以作為內容發送了。
Controller代碼如下:
@GetMapping("/template") public Mono<String> sendTemplateFreemarker() throws Exception { Map<String, Object> model = new HashMap<>(); model.put("username", username); model.put("templateType", "Freemarker"); mailService.sendTemplateFreemarker(username, username, "Springboot Mail(Template)", model, "template.html"); return Mono.just("sent"); }
注意模板文件template.html要放在resources/templates/目錄下面,這樣才能找得到。
模板內容如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>Hello ${username}</h1> <h1>This is a mail from Springboot using ${templateType}</h1> </body> </html>
其中${username}和${templateType}為需要替換的變量名,Freemarker提供了很多豐富的變量表達式,這里不展開講了。
郵件服務的提供商很多,國內最常用的應該是QQ郵箱和網易163郵箱了。
集成QQ郵件需要有必備的賬號,還要開通授權碼。開通授權碼后配置一下就可以使用了,官方的文檔如下:
https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28
需要注意的是,開通授權碼是需要使用綁定的手機號發短信到特定號碼的,如果沒有綁定手機或者綁定手機不可用,那都會影響開通。
開通之后,授權碼就要以作為密碼配置到文件中。
163
網易的開通方式與QQ沒有太大差別,具體的指導可以看如下官方文檔:
http://help.mail.163.com/faqDetail.do?code=d7a5dc8471cd0c0e8b4b8f4f8e49998b374173cfe9171305fa1ce630d7f67ac2cda80145a1742516
同樣也是需要綁定手機進行操作。
本次例子發送后收到郵件如圖所示:
郵件功能強大,Springboot也非常容易整合。技術利器,善用而不濫用。
文由掘金@天行天忌授權發布,前端晚間課對其內容進行微改。
HTML,超文本標記語言,是一種用于創建網頁的標準標記語言。自從引入 HTML 以來,它就一直用于構建互聯網。與 JavaScript 和 CSS 一起,HTML 構成前端開發的三劍客。
盡管許多新技術使網站創建過程變得更簡單、更高效,但 HTML 始終是核心。隨著 HTML5 的普及,在 2014 年,這種標記語言發生了很多變化,變得更加友好,瀏覽器對新標準的支持熱度也越來越高。而HTML并不止于此,還在不斷發生變化,并且可能會獲得一些特性來證明對 HTML6 的命名更改是合理的。
該元素<dialog> 將隨 HTML6 一起提供。它被認為等同于用 JavaScript 開發的模態,并且已經標準化,但只有少數瀏覽器完全支持。但這種現象會改變,很快它將在所有瀏覽器中得到支持。
這個元素在其默認格式下,只會將光標顯示在它所在的位置上,但可以使用 JavaScript 打開模式。
<dialog>
<form method="dialog">
<input type="submit" value="確定" />
<input type="submit" value="取消" />
</form>
</dialog>
在默認形式下,該元素創建一個灰色背景,其下方是非交互式內容。
可以在 <dialog> 其中的表單上使用一種方法,該方法將發送值并將其傳遞回自身 <dialog>。
總的來說,這個標簽在用戶交互和改進的界面中變得有益。
可以通過更改 <dialog> 標簽的 open 屬性以控制打開和關閉。
<dialog open>
<p>組件內容</p>
</dialog>
FutureClaw 雜志主編 Bobby Mozumder 建議:
將錨元素鏈接到 JSON/XML、API 端點,讓瀏覽器在內部將數據加載到新的數據結構中,然后瀏覽器將 DOM 元素替換為根據需要加載的任何數據。初始數據(以及標準錯誤響應)可以放在標題裝置中,如果需要,可以稍后替換。
據他介紹,這是單頁應用程序網頁設計模式,可以提高響應速度和加載時間,因為不需要加載 JavaScript。
這個是一個比較有意思的提案,就有點類似我們以前沒有做前后端分離之前的混合編程的模式,HTML變成模板語言,通過JSON API請求數據,不一樣的是變成瀏覽器來默認解析,瀏覽器內部加載數據到新的數據結構中,然后瀏覽器將按需加載到的數據替換成 DOM 元素。
大家可以看一下InfoQ上的這篇文章《針對非正式 HTML6 提案“無需 JavaScript 的單頁應用”引發的論戰》,了解更多!
https://www.infoq.cn/article/2015/03/html6-without-javascript
HTML6 愛好者相信即將到來的更新將允許瀏覽器調整圖像大小以獲得更好的觀看體驗。
每個瀏覽器都難以呈現相對于設備和屏幕尺寸的最佳圖像尺寸,不幸的是,src 標簽 img 在處理這個問題時不是很有效。
這個問題可以通過一個新標簽 <srcset> 來解決,它使瀏覽器在多個圖像之間進行選擇的工作變得更加容易。
將可用庫引入 HTML6 絕對是提高開發效率的重要一步。
很多時候,需要在互聯網上定義一般信息,而這些一般信息可以是任何公開的信息,例如電話號碼、姓名、地址等。微格式是能夠定義一般數據的標準。微格式可以增強設計者的能力,并可以減少搜索引擎推斷公共信息所需的努力。
盡管標簽<ul>、<ol>非常有用,但在某些情況下仍有一些不足之處。可以處理交互元素的標簽將是一個不錯的選擇。
這就是創建標簽 <menu> 的驅動力,它可以處理按鈕驅動的列表元素。
<menu type="toolbar">
<li><button>個人信息</button></li>
<li><button>系統設置</button></li>
<li><button>賬號注銷</button></li>
</menu>
因此 <menu>,除了能夠像普通列表一樣運行之外,還可以增強 HTML 列表的功能。
雖然HTML5在安全性方面還不錯,瀏覽器和網絡技術也提供了合理的保護。毫無疑問,在身份驗證和安全領域還有很多事情可以做。如密鑰可以異地存儲;這將防止不受歡迎的人訪問并支持身份驗證。使用嵌入式密鑰而不是 cookie,使數字簽名更好等。
HTML6 允許以更好的方式使用設備上的相機和媒體。將能夠控制相機、它的效果、模式、全景圖像、HDR 和其他屬性。
沒有什么是完美的,HTML 也不是完美的,所以 HTML 規范可以做很多事情來使它更好。應該對一些有用的規范進行標準化,以增強 HTML 的能力。小的變化已經開始推出。如增強藍牙支持、p2p 文件傳輸、惡意軟件保護、云存儲集成,下一個 HTML 版本可以考慮一下。
個漂亮的警告頁面模板,轉載自:折影輕夢,用來作為跳轉提示或者改一改用作404頁面什么的都挺好的,試試看吧!
下面兩張圖是我改了改配色,你們看看效果
https://www.tiezi.xyz/html/a1/tishi.html
關注我的頭條號,然后私信回復 1270 ,即可獲取下載地址。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。