跟多文章訪問我的博客網站:http://www.caoyong.xin:8080/blogger
SpringEmail
今天來說一說使用Spring來發送郵件,在一些項目中會遇到用戶註冊的時候,需要提供郵箱地址,提供郵箱地址的目的在於,進行郵箱驗證,所以我們需要在用戶點擊註冊的時候,發送一封郵件給用戶,然後用戶點擊郵箱中的郵件裏的地址。我們這樣就可以確認該用戶,同意註冊。
目錄
:準備環境
:瞭解API
:代碼展示
1:準備環境
今天使用的是Spring+QQ。使用Spring給我們的QQ發送一封郵件。SpringEmail封裝了JavaEmail的API,在此基礎上開發的。所以使用更加方便。
首先,我們要有一些理論知識,發送郵件的大體過程是什麼樣的。
通俗來說就是發送方郵件服務器和收件方郵件服務器之間的通信。在我們這裏,QQ郵件服務器,既是發送方郵件服務器也是收件方郵件服務器(聽不懂,接着往下看)。我們使用SpringEmail來演示,自己的QQ郵箱給別人發送一封QQ郵件,我們發送郵件是在QQ郵件服務器上發送的,而別人接受郵件也是通過QQ郵件服務器的。所以,QQ郵件服務器,既是發送方郵件服務器也是收件方郵件服務器。
接下來我們要去我們的QQ郵箱去設置一些東西。
1.1:登錄自己的QQ郵箱,點擊設置》賬戶
開啓POP3/SMTP服務,這個時候會生成授權碼,記住這個授權碼,稍後會用。
1.2:準備架包
使用Spring的Email功能除Spring核心jar之外還需要Spring-support、javax.mail等jar包支持,需要構建到項目中。
<!-- springMVCEmail -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
2:瞭解API
Spring中將Javaemail的API封裝好了,我們只需要拿來使用,所以我們要了解一下,有哪些API。
JavaMailSenderImpl類
該類是JavaMailSender的實現類在spring-context-support架包中,用於設置郵件服務器的一些參數,比如服務器地址,端口,發送人用戶名,授權碼等等。下面我們就來了解一下
setJavaMailProperties:需要一個Properties類型的參數,設置一些安全協議。
setHost:設置郵件服務器地址
setPort:設置端口號
setUserName :發件人的用戶名
setPassword:發件人的密碼或者授權碼
send():我們可以看到重載了很多的send()方法,已發送不同類型的郵件,有普通郵件,有帶附件的郵件,有帶html的郵件。
MailMessage接口,
這是一個藉口用於設置發送的郵件的內容,收件人信息等內容,他有兩個實現類MimeMailMessage和SimpleMailMessage
MailMessage定義的方法
setFrom();發送人郵箱
setCc():抄送地址
setBcc():暗送地址
setTo():收件人郵箱地址,可以羣發多人,使用字符串數組存儲,收件人的郵件地址
setSubject():設置郵件主題
setText():設置文本格式的郵件內容
MimeMessageHelper類
是Spring封裝用於發送郵件的工具類,可以發送帶附件的,帶圖片的,帶HTML格式的郵件
3:代碼展示
3.1:發送文本格式的郵件
public void senderEmail() {
try {
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
senderImpl.setHost("smtp.qq.com");//郵件服務器 如qq smtp.qq.com 163網易 smtp.163.com
senderImpl.setUsername("15*****[email protected]");//發送人服務器的用戶名
senderImpl.setPassword("h*********jg");//此處爲qq郵箱的授權碼,而非郵箱密碼。
senderImpl.setPort(465);//端口 默認25 ,或者587
SimpleMailMessage message = new SimpleMailMessage();
message.setTo("29****[email protected]");//收信人郵箱
message.setFrom("15*****[email protected]");//發送人郵箱
message.setSubject("這是郵件主題");//郵件主題
message.setText("這是郵件內容");//郵件內容
Properties prop = new Properties();
MailSSLSocketFactory sf = new MailSSLSocketFactory();//安全協議
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
prop.put("mail.smtp.auth", "true");//自動驗證發送人郵箱用戶名和授權碼
prop.put("mail.smtp.timeout", "25000");//超時時間
senderImpl.setJavaMailProperties(prop);
senderImpl.send(message);
System.out.println("發送成功");
} catch (GeneralSecurityException e) {
e.printStackTrace();
}
}
結果:
3.2:發送帶附件的郵件
public void senderEmailAttachment() {
try {
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
senderImpl.setHost("smtp.qq.com");//郵件服務器 如qq smtp.qq.com 163網易 smtp.163.com
senderImpl.setUsername("15******[email protected]");//發送人服務器的用戶名
senderImpl.setPassword("h**********hjg");//此處爲qq郵箱的授權碼,而非郵箱密碼。
senderImpl.setPort(465);//端口 默認25 ,或者587
MimeMessage message = senderImpl.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("15*****[email protected]");//發送方
helper.setTo("29******[email protected]");//收件人
helper.setSubject("Spring Email Test1");//主題
helper.setText("這是一個帶有附件的郵件1");//內容
File file = new File("E:\\attachment.txt");
FileSystemResource attachment = new FileSystemResource(file);
helper.addAttachment("您的附件", attachment);//附件
Properties prop = new Properties();
MailSSLSocketFactory sf = new MailSSLSocketFactory();//安全協議
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
prop.put("mail.smtp.auth", "true");//自動驗證發送人郵箱用戶名和授權碼
prop.put("mail.smtp.timeout", "25000");//超時時間
senderImpl.setJavaMailProperties(prop);
senderImpl.send(message);
System.out.println("郵件發送完畢");
} catch (Exception e) {
e.printStackTrace();
}
}
結果:
3.3:發送HTML格式的郵件
public void senderEmailHtml() {
try {
JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
senderImpl.setHost("smtp.qq.com");//郵件服務器 如qq smtp.qq.com 163網易 smtp.163.com
senderImpl.setUsername("15********[email protected]");//發送人服務器的用戶名
senderImpl.setPassword("h**********jg");//此處爲qq郵箱的授權碼,而非郵箱密碼。
senderImpl.setPort(465);//端口 默認25 ,或者587
MimeMessage message = senderImpl.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(message, true);
helper.setFrom("15******[email protected]");//發送方
helper.setTo("29*******[email protected]");//收件人
helper.setSubject("Spring Email Test2");//主題
StringBuilder info = new StringBuilder();//編寫HTML
info.append("<html><body><img src='cid:image'>");
info.append("<h2>Hello Word!</h2>");
info.append("</body></html>");
helper.setText(info.toString(),true);
ClassPathResource image = new ClassPathResource("01.jpg");
helper.addInline("image", image);//添加圖片
Properties prop = new Properties();
MailSSLSocketFactory sf = new MailSSLSocketFactory();//安全協議
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable", "true");
prop.put("mail.smtp.ssl.socketFactory", sf);
prop.put("mail.smtp.auth", "true");//自動驗證發送人郵箱用戶名和授權碼
prop.put("mail.smtp.timeout", "25000");//超時時間
senderImpl.setJavaMailProperties(prop);
senderImpl.send(message);
System.out.println("郵件發送完畢");
} catch (Exception e) {
e.printStackTrace();
}
}
結果: