現在發送郵件是一個網站必備的功能,比如註冊激活,或者忘記密碼等等都需要發送郵件。正常我們會用JavaMail相關api來寫發送郵件的相關代碼,但現在springboot提供了一套更簡易使用的封裝。也就是我們使用SpringBoot來發送郵件的話,代碼就簡單許多,畢竟SpringBoot是開箱即用的 ,它提供了什麼,我們瞭解之後覺得可行,就使用它,自己沒必要再寫原生的。
發送郵件流程圖
現在的Java項目大多都是按照MVC架構模型來開發的,但是這裏不使用Controller層,是直接在測試中發送郵件,假如測試中發送郵件成功,那麼改爲用戶發送請求來發送郵件也會成功。發送郵件,也就是要有發送方和接收方,我們需要在系統中配置發送方的信息,而接受方的信息我們需要根據從客戶端發來的請求決定。作爲發送方的我們,需要被授權,被誰授權?
- 假如我使用QQ郵箱發送郵件,那麼我就需要開啓QQ郵箱授權碼。
- 假如我使用網易郵箱發送郵件,那我就需要開啓網易郵箱授權碼。
我們接下來就一 一開啓這兩個郵箱的授權碼
- 開啓QQ郵箱授權碼
- 開啓網易郵箱授權碼
上圖的步驟都會生成授權碼,我們需要記住它,可以選擇保存在本地電腦上,因爲我們接下來配置發送方信息需要授權碼。
接下來我們就開始編寫代碼發送郵件,我們使用IDEA創建SpringBoot項目,下篇博客可以快速瞭解如何在IDEA中創建SpringBoot項目。
SpringBoot快速入門
導入依賴
spring-boot-starter-mail
:這個啓動器內部封裝了發送郵件的代碼,必須引入的。
spring-boot-starter-web
:這個啓動器整合了JavaWeb常用的功能,如果只是簡單在測試中發送郵件,那麼就不需要引入它。
spring-boot-starter-thymeleaf
:模板引擎依賴,如果需要將數據渲染到頁面上,就需要引入它。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
配置發送方信息
我們需要在SpringBoot配置文件(application.yml)中配置發送方的信息,包括以下信息:
- 用戶名:也就是我們的郵箱賬號
- 密碼:我們剛剛生成的授權碼
- 郵箱主機:配置使用哪個郵箱服務器發送郵件
還有等等其他可選配置,在下面配置代碼中,大家需要填寫自己的用戶名、密碼、from(和用戶名一樣)。
QQ郵箱配置
spring:
mail:
host: smtp.qq.com #發送郵件服務器
username: #發送郵件的郵箱地址
password: #客戶端授權碼,不是郵箱密碼,這個在qq郵箱設置裏面自動生成的
properties.mail.smtp.port: 465 #端口號465或587
from: # 發送郵件的地址,和上面username一致
properties.mail.smtp.starttls.enable: true
properties.mail.smtp.starttls.required: true
properties.mail.smtp.ssl.enable: true
default-encoding: utf-8
網易郵箱配置
spring:
mail:
host: smtp.163.com #發送郵件服務器
username: #發送郵件的郵箱地址
password: #客戶端授權碼,不是郵箱密碼,網易的是自己設置的
properties.mail.smtp.port: 994 #465或者994
from: # 發送郵件的地址,和上面username一致
properties.mail.smtp.starttls.enable: true
properties.mail.smtp.starttls.required: true
properties.mail.smtp.ssl.enable: true
default-encoding: utf-8
EmailService
我們需要自己封裝郵件服務,這個服務只是便於Controller層調用,也就是根據客戶端發送的請求來調用,封裝三種郵件服務
- 發送普通文本郵件
- 發送HTML郵件:一般在註冊激活時使用
- 發送帶附件的郵件:可以發送圖片等等附件
public interface EmailService {
/**
* 發送文本郵件
* @param to 收件人
* @param subject 主題
* @param content 內容
*/
void sendSimpleMail(String to, String subject, String content);
/**
* 發送HTML郵件
* @param to 收件人
* @param subject 主題
* @param content 內容
*/
void sendHtmlMail(String to, String subject, String content);
/**
* 發送帶附件的郵件
* @param to 收件人
* @param subject 主題
* @param content 內容
* @param filePath 附件
*/
public void sendAttachmentsMail(String to, String subject, String content, String filePath);
}
EmailServiceImpl
我們需要實現上面的郵件服務,在具體的實現裏面,則是調用了SpringBoot提供的JavaMailSender(封裝了發送郵件的代碼)。
@Service
public class EmailServiceImpl implements EmailService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private JavaMailSender javaMailSender;
//注入配置文件中配置的信息——>from
@Value("${spring.mail.from}")
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);
//發送郵件
javaMailSender.send(message);
}
@Override
public void sendHtmlMail(String to, String subject, String content) {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper;
try {
messageHelper = new MimeMessageHelper(message,true);
messageHelper.setFrom(from);
messageHelper.setTo(to);
message.setSubject(subject);
messageHelper.setText(content,true);
javaMailSender.send(message);
logger.info("郵件已經發送!");
} catch (MessagingException e) {
logger.error("發送郵件時發生異常:"+e);
}
}
@Override
public void sendAttachmentsMail(String to, String subject, String content, String filePath) {
MimeMessage message = javaMailSender.createMimeMessage();
MimeMessageHelper messageHelper;
try {
messageHelper = new MimeMessageHelper(message,true);
messageHelper.setFrom(from);
messageHelper.setTo(to);
messageHelper.setSubject(subject);
messageHelper.setText(content,true);
//攜帶附件
FileSystemResource file = new FileSystemResource(filePath);
String fileName = filePath.substring(filePath.lastIndexOf(File.separator));
messageHelper.addAttachment(fileName,file);
javaMailSender.send(message);
logger.info("郵件加附件發送成功!");
} catch (MessagingException e) {
logger.error("發送失敗:"+e);
}
}
}
EmailServiceTest
我們直接在測試中發送郵件,如果測試中發送郵件沒問題,那麼轉爲用戶請求發送郵件也沒有問題的。
@RunWith(SpringRunner.class)
@SpringBootTest
public class EmailServiceTest{
@Autowired
private EmailService emailService;
@Test
public void sendSimpleEmail(){
String content = "你好,恭喜你...";
emailService.sendSimpleMail("[email protected]","祝福郵件",content);
}
@Test
public void sendMimeEmail(){
String content = "<a href='https://blog.csdn.net/'>你好,歡迎註冊網站,請點擊鏈接激活</a>";
emailService.sendHtmlMail("[email protected]","激活郵件",content);
}
@Test
public void sendAttachment(){
emailService.sendAttachmentsMail("[email protected]","發送附件","這是Java體系圖","F:/圖片/愛旅行.jpg");
}
}
這樣我們就實現了提供Java代碼來發送郵件。發送附件功能其實就是讀取我們本地電腦的文件,然後添加到發送流中即可。
發送郵件附件的源代碼