Spring框架發送電子郵件
前言:
Spring框架提供了一個有用的實用程序庫,用於發送電子郵件,使您不受底層郵件系統的限制,並負責代表客戶端進行低級資源處理。(就是對
JavaMail庫
進行了封裝)爲了使用Spring Framework的電子郵件庫,以下JAR必須位於應用程序的類路徑中:
直接使用Java Mail發送郵件
獲取
1. 引入依賴
<!--javax.mail依賴-->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
</dependency>
<!-- Spring依賴-start-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<!-- spring依賴-end -->
1.1 編寫配置文件mail.properties
#郵箱服務器
mail.host=smtp.qq.com
#端口
mail.port=465
#郵箱賬號
[email protected]
# 郵箱密碼(qq郵箱使用的是授權碼)
mail.password=自己
#發送協議 默認就是smtp
mail.protocol=smtp
#日記輸出
mail.debug=true
mail.default-encoding=UTF-8
#認證
mail.smtp.auth=true
#啓用STARTTLS,是一種明文通信協議的擴展,能夠讓明文的通信連線直接成爲加密連線(使用SSL或TLS加密)
mail.smtp.starttls.enable=true
mail.smtp.starttls.required=true
#啓用ssl
mail.smtp.ssl.enable=true
#引發成功報告異常
#mail.smtp.reportsuccess=true
#收郵件協議 hdnueendhjnxbegg
mail.store.protocol=pop3
#某些默認超時值是無限的,您可能需要更改該值,以避免線程被無響應的郵件服務器阻塞
mail.smtp.connectiontimeout=5000
mail.smtp.timeout=3000
mail.smtp.writetimeout=5000
1.2 註冊MailSender
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.mail.MailSender;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import zhihao.sendmail.SendMail;
import zhihao.sendmail.impl.SendMailImpl;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
/**
* @Author: zhihao
* @Date: 2020/3/26 17:43
* @Description: 使用配置類方式代替xml
* @Versions 1.0
**/
@Configuration
public class MailConfig {
/** 屬性集 */
public static Properties properties;
/** 加載配置文件到屬性集 */
static {
ResourceLoader loader = new DefaultResourceLoader();
Resource resource = loader.getResource(ResourceLoader.CLASSPATH_URL_PREFIX + "mail.properties");
properties = new Properties();
InputStream inputStream = null;
try {
inputStream = resource.getInputStream();
properties.load(inputStream);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 註冊發件人
*
* @return org.springframework.mail.MailSender
* @author: zhihao
* @date: 2020/3/27
*/
@Bean
public MailSender javaMailSender() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost(properties.getProperty("mail.host"));
javaMailSender.setPort(Integer.valueOf(properties.getProperty("mail.port")));
javaMailSender.setUsername(properties.getProperty("mail.username"));
javaMailSender.setPassword(properties.getProperty("mail.password"));
javaMailSender.setProtocol(properties.getProperty("mail.protocol"));
javaMailSender.setDefaultEncoding(properties.getProperty("mail.default-encoding"));
javaMailSender.setJavaMailProperties(properties);
return javaMailSender;
}
}
1.3 發送普通文本郵件
@Autowired
private JavaMailSender javaMailSender;
/**
* 發送普通文本郵件
*
* @param from 發送者郵箱
* @param to 接收者郵箱
* @param subject 郵件主題
* @param content 郵件內容
* @return boolean
* @author: zhihao
* @date: 2020/3/27
*/
@Override
public boolean sendTextMail(String from, String to, String subject, String content) {
SimpleMailMessage mailMessage = new SimpleMailMessage();
mailMessage.setFrom(from);
mailMessage.setTo(to);
mailMessage.setSubject(subject);
mailMessage.setText(content);
//發送
try {
javaMailSender.send(mailMessage);
return true;
} catch (MailException e) {
e.printStackTrace();
}
return false;
}
@Test
public void sendText(){
String from = MailConfig.properties.getProperty("mail.username");
sendMail.sendTextMail(from, from, "這是個普通郵件", "測試發送");
}
1.4 發送帶HTML
格式的郵件
@Autowired
private JavaMailSender javaMailSender;
/**
* 發送帶Html文本郵件
*
* @param from 發送者郵箱
* @param to 接收者郵箱
* @param subject 郵件主題
* @param content 帶Html文本郵件內容
* @return boolean
* @author: zhihao
* @date: 2020/3/27
*/
@Override
public boolean sendHtmlMail(String from, String to, String subject, String content) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
//傳遞對象進行構建發送html文本格式
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content,true);
javaMailSender.send(mimeMessage);
return true;
} catch (MessagingException e) {
e.printStackTrace();
}
return false;
}
@Test
public void sendHtml(){
String from = MailConfig.properties.getProperty("mail.username");
String html = "<html><body><img src='https://s1.ax1x.com/2020/03/16/8JHaM4.jpg'/>這個是個圖片</body></html>";
sendMail.sendHtmlMail(from, from, "Html格式", html);
}
1.5 發送帶附件的郵件
@Autowired
private JavaMailSender javaMailSender;
/**
* 發送帶附件文本郵件
*
* @param from 發送者郵箱
* @param to 接收者郵箱
* @param subject 郵件主題
* @param content 郵件文本內容,例如xx.jpg || xx.xlsx || xx.後綴名
* @param AnnexName 附件名
* @param inputStream 文件流
* @return boolean
* @author: zhihao
* @date: 2020/3/27
*/
@Override
public boolean sendAnnexMail(String from, String to, String subject, String content, String AnnexName, InputStream inputStream) {
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
try {
//傳遞對象進行構建發送附件文本格式
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true);
helper.setFrom(from);
helper.setTo(to);
helper.setSubject(subject);
helper.setText(content);
ByteArrayDataSource dataSource = new ByteArrayDataSource(inputStream,"application/octet-stream");
helper.addAttachment(AnnexName, dataSource);
javaMailSender.send(mimeMessage);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Test
public void sendAnnex() throws Exception {
String from = MailConfig.properties.getProperty("mail.username");
FileInputStream inputStream = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\hhhh.xlsx"));
// sendMail.sendAnnexMail(from, from, "這是個普通郵件", "圖片郵件","我的.jpg",inputStream);
sendMail.sendAnnexMail(from, from, "這是個附件郵件", "圖片郵件","我的.xlsx",inputStream);
}
1.6 使用HTML模板發送郵件
本質上還是使用發送HTML格式的郵件, 只是將頁面模板填充數據,並解析成頁面字符串發送。
/**
* 發送模板,本質上還是發送HTML郵件,只不過多了綁定變量的過程。
*
* @param from 發送者郵箱
* @param to 接收者郵箱
* @param subject 郵件主題
* @param content 模板Html文本內容
* @return boolean
* @author: zhihao
* @date: 2020/3/27
*/
@Override
public boolean sendHtmlTemplateMail(String from, String to, String subject, String content) {
//調用之前發送HTML格式
return this.sendHtmlMail(from, to, subject, content);
}
1.6.1 引入依賴
<!-- 頁面模板 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf</artifactId>
<version>3.0.11.RELEASE</version>
</dependency>
1.6.2 創建HTML頁面模板
emailTemplate.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>模板</title>
</head>
<body>
使用thymeleaf模板語法
你的偶像:<h1 style="color: red" th:text="${name}"></h1>
</body>
1.6.3 創建模板引擎
步驟:
- 創建模板引擎:
TemplateEngine
- 設置模板解析器
setTemplateResolver(template)
- 創建模板解析器並設置文件的前綴,後綴,模式
- 使用
TemplateEngine
調用process()
處理得到模板字符串
@Test
public void sendHtmlTemplateMail() throws Exception {
String from = MailConfig.properties.getProperty("mail.username");
Context context = new Context();
context.setVariable("name", "張韶涵");
//創建模板
TemplateEngine templateEngine = new TemplateEngine();
//設置模板解析器
FileTemplateResolver templateResolver = new FileTemplateResolver();
templateResolver.setTemplateMode("HTML");
//文件夾前綴
templateResolver.setPrefix("src/main/resources/");
//後綴
templateResolver.setSuffix(".html");
templateEngine.setTemplateResolver(templateResolver);
String process = templateEngine.process("emailTemplate", context);
sendMail.sendHtmlTemplateMail(from, from, "html模板郵件",process );
}
擴展資料:
項目代碼:
mail屬性配置說明
發送帶圖片的郵件:
發送帶靜態資源的郵件
發送帶靜態資源的郵件其實就是在發送HTML郵件的基礎上嵌入靜態資源(比如圖片),嵌入靜態資源的過程和傳入附件類似,
helper.addInline("img", file);
中的img和圖片標籤裏cid後的名稱相對應。
收郵件操作:
@Autowired
private JavaMailSenderImpl javaMailSender;
@Test
public void incomingMail() throws Exception {
//1.獲取會話
Session session = javaMailSender.getSession();
//2.通過會話獲取Store
Store store = session.getStore();
//3.連上郵件服務器 賬號----密碼(QQ郵箱使用授權碼)
store.connect(javaMailSender.getUsername(),MailConfig.properties.getProperty("mail.password"));
//4.獲取收件箱的郵件夾
Folder folder = store.getFolder("inbox");
//5.打開只讀郵件夾,還有很多操作
folder.open(Folder.READ_ONLY);
//6.獲取郵件
Message[] messages = folder.getMessages();
for (Message message : messages) {
String subject = message.getSubject();
Object content = message.getContent();
System.out.println("主題"+subject);
System.out.println("內容"+content);
}
folder.close();
store.close();
}
參考了:https://www.jianshu.com/p/0d1fc72d3414
1