本篇主要介紹的是如何在Springboot中發(fā)送郵件,這個(gè)場(chǎng)景很容易遇到,比如我們?cè)谧?cè)一個(gè)賬號(hào)的時(shí)候,系統(tǒng)會(huì)提示你接收一個(gè)郵件驗(yàn)證碼,這個(gè)時(shí)候,就需要在后臺(tái)配置相關(guān)參數(shù)并發(fā)送該郵件了。具體怎么實(shí)現(xiàn)的呢,請(qǐng)往下看:
-
- 添加pom依賴
<!--郵件--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> - 獲取郵箱授權(quán)碼。這里以QQ郵箱為例,我們登陸QQ郵箱,找到
設(shè)置-郵箱設(shè)置-賬戶-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務(wù),選擇開啟POP3/SMTP服務(wù),此時(shí)會(huì)得到一個(gè)授權(quán)碼,妥善保管,以下會(huì)用到的。
image.png
- 獲取郵箱授權(quán)碼。這里以QQ郵箱為例,我們登陸QQ郵箱,找到
-
3.applocation.properties中添加如下配置,yml文件請(qǐng)自行轉(zhuǎn)換格式
# 郵箱相關(guān)變量 #這里以QQ郵箱為例 #QQ郵箱服務(wù)器 spring.mail.host=smtp.qq.com #你的QQ郵箱賬戶 spring.mail.username=123456@qq.com #你的QQ郵箱第三方授權(quán)碼 spring.mail.password=xxxxxxxxxxxxxxxxx #編碼類型 spring.mail.default-encoding=UTF-8 #發(fā)送端口 spring.mail.port=465 #ssl spring.mail.properties.mail.smtp.ssl.enable=true- 注意,我在本地調(diào)試的時(shí)候,沒有加上面的
發(fā)送端口和ssl兩個(gè)配置,是沒問題的,正常的能發(fā)送,我的電腦是mac系統(tǒng);當(dāng)我將項(xiàng)目部署到我的一個(gè)windows服務(wù)器上的時(shí)候,郵箱發(fā)送這個(gè)功能就出現(xiàn)了問題,出現(xiàn)類似如下錯(cuò)誤信息
ERROR: Problem while sending message: javax.mail.MessagingException: Could not connect to SMTP host: smtp.qq.com, port: 25, response: -1- 搜索了一圈解決方案,統(tǒng)一的解決方案是讓我添加
發(fā)送端口配置項(xiàng),修改默認(rèn)的25端口為465端口,原因是QQ郵箱提供的幫助信息是這樣的:
image.png - 我就正常的添加了
發(fā)送端口這一項(xiàng)配置,可情況還是一樣,在mac上可以發(fā)送,但是在windows上報(bào)的錯(cuò)誤和上面一樣,只是其中的端口變成了port: 465。經(jīng)過了一些查詢,找到了這樣一句話:465端口(SMTPS):465端口是為SMTPS(SMTP-over-SSL)協(xié)議服務(wù)開放的,這是SMTP協(xié)議基于SSL安全協(xié)議之上的一種變種協(xié)議, 它繼承了SSL安全協(xié)議的非對(duì)稱加密的高度安全可靠性,可防止郵件泄露。 SMTPS和SMTP協(xié)議一樣,也是用來發(fā)送郵件的,只是更安全些,防止郵件被黑客截取泄露, 還可實(shí)現(xiàn)郵件發(fā)送者抗抵賴功能。防止發(fā)送者發(fā)送之后刪除已發(fā)郵件,拒不承認(rèn)發(fā)送過這樣一份郵件。 -
這時(shí)候我就懷疑是不是自己漏掉了郵箱的ssl配置,經(jīng)過搜索,得到了上面的ssl配置,此時(shí),windows上報(bào)超時(shí)的問題就解決了。
image.png
- 注意,我在本地調(diào)試的時(shí)候,沒有加上面的
-
- 定義發(fā)送郵件的實(shí)現(xiàn)類
package com.mutou.jobs.service; import javax.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; /** 郵件service. * @author 楊喜存 * @since 2019/12/6 11:22 AM */ @Service public class MailService { @Value("${spring.mail.username}") private String mail_username; @Resource private JavaMailSender mailSender; public void sendDefaultMail(String to, String subject, String content){ SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to);//收信人 message.setSubject(subject);//主題 message.setText(content);//內(nèi)容 message.setFrom(mail_username);//發(fā)信人 mailSender.send(message); } } -
- 就可以直接發(fā)送啦
mailService.sendDefaultMail( "收件人的郵箱","主題", "郵件內(nèi)容");
這是之前實(shí)現(xiàn)過的,前天晚上部署的時(shí)候發(fā)現(xiàn)的問題,這里拿出來做個(gè)記錄,實(shí)現(xiàn)的代碼不是重點(diǎn),問題才是重點(diǎn);如果你也遇到相同的問題,希望能幫到你。


