spring通過QQ郵箱傳送Email
本文簡要介紹如何通過Spring框架的支援,通過QQ郵箱來發送郵件,包括簡單文字,附件、以及內聯圖片、HTML以及HTTP圖片。
spring-context-support很早就內建支援郵件傳送。
當然, 官方文件明確指出, 需要依賴 JavaMail 這個庫。
在這個年代, 我們很少自己搭建 smtp 伺服器來發送郵件, 一般都是使用郵件提供商的服務。 例如 QQ郵箱, 企業郵箱, 163, 或者阿里雲之類的廠商。
註冊一個賬號, 然後參考郵件服務商的幫助中心, 以及賬戶設定頁面, 獲取smtp伺服器埠資訊, 以及你註冊的賬號和密碼, 儲存到一個比較安全的地方。
相關依賴。
pom.xml中的依賴如下:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId >mail</artifactId>
<version>1.4.7</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.2</version>
</dependency>
其中, commons-io
根據需要決定, 本文中使用了 IOUtils工具類, 提供了很多方便又強大的IO工具方法, 有興趣可以研究一下。
Spring-Mail 相關的介面與實現類
MailSender
, 傳送簡單郵件的頂層介面。JavaMailSender
, 繼承頂層介面, 支援傳送 MIME 郵件。JavaMailSenderImpl
實現類, 顧名思義。SimpleMailMessage
類, 簡單郵件資訊, 包括from
,to
,cc
,subject
以及text
欄位。MimeMessagePreparator
介面, 用於 MIME 郵件回撥。MimeMessageHelper
輔助類, 可用於建立 MIME 郵件。支援圖片、附件、以及 HTML 樣式等。
簡單測試程式碼
下面是簡單的測試程式碼。 實際使用時請參考本文末尾的相關連結。把程式碼組織好看一點,好用一點。
package com.cncounter.test.spring;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
public class TestSpringEmail {
public static void main(String[] args) {
//
sendTextEmail();
}
public static void sendTextEmail() {
//
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
// 參考QQ郵箱幫助中心
mailSender.setHost("smtp.qq.com"); // QQ郵箱smtp傳送伺服器地址
//mailSender.setPort(465); // QQ這個埠不可用
mailSender.setPort(587);// 埠號
mailSender.setUsername("[email protected]"); // 使用你自己的賬號
mailSender.setPassword("usbusbcnzztbsbtob"); // 授權碼-發簡訊獲取
// 郵件資訊
SimpleMailMessage msg = new SimpleMailMessage();
msg.setFrom("[email protected]"); // 發件人郵箱
msg.setTo("[email protected]"); // 收件人郵箱
msg.setSubject("測試Spring郵件"); // 標題
msg.setText("您的訂單號碼: 20181120075; 請勿告訴別人!"); // 文字資訊
try {
mailSender.send(msg);
System.out.println("郵件傳送成功!"); // 沒有報錯就是好訊息 :-)
} catch (MailException ex) {
System.err.println("傳送失敗:" + ex.getMessage());
}
}
}
測試結果如下圖所示:
可以看到, 簡單驗證碼之類的文字, 通過這些封裝好的工具類, 程式碼編寫很容易。
傳送附件示例
以下是傳送附件的示例。 根據需要, 可以傳送多個附件。
package com.cncounter.test.spring;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.*;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.*;
import java.util.Properties;
public class TestSpringAttachEmail {
public static void main(String[] args) throws Exception {
// 傳送帶附件的MIME郵件
sendAttachmentEmail();
}
// 傳送帶附件的MIME郵件
public static void sendAttachmentEmail() throws MessagingException, IOException {
// 郵件傳送器
JavaMailSender mailSender = getJavaMailSender();
// MIME 郵件
MimeMessage mimeMessage = mailSender.createMimeMessage();
// 輔助類; 明確使用 UTF-8 編碼; 否則HTML報中文亂碼
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
//
boolean isHTML = true;
// 郵件資訊
helper.setFrom("[email protected]"); // 發件人郵箱
helper.setTo("[email protected]"); // 收件人郵箱
helper.setSubject("測試Spring傳送附件-1"); // 標題
helper.setText("請點選: <a href='http://www.yuledanao.com/dl/PWA_INTRO.zip'><b>PWA開發簡介.zip</b></a>;" +
" 或者下載附件!", isHTML); // HTML-資訊
// 增加1個附件; 可以使用多種資源API
String fileName1 = "E:/PWA開發簡介.zip";
InputStream inputStream1 = new FileInputStream(fileName1);
//
// Java Mail 會開啟2次 InputStreamResource
// 第一次確定編碼, 第二次才執行編碼。
ByteArrayResource byteResource1 =
new ByteArrayResource(IOUtils.toByteArray(inputStream1));
// 所以不能使用 InputStreamResource
// InputStreamResource attachment1 = new InputStreamResource(inputStream1);
helper.addAttachment("PWA開發簡介.zip", byteResource1);
try {
mailSender.send(mimeMessage);
System.out.println("郵件傳送成功!"); // 沒有報錯就是好訊息 :-)
} catch (MailException ex) {
System.err.println("傳送失敗:" + ex.getMessage());
} finally {
IOUtils.closeQuietly(inputStream1);
}
}
// 獲取郵件傳送器
public static JavaMailSender getJavaMailSender() {
//
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
// 參考QQ郵箱幫助中心
mailSender.setHost("smtp.qq.com"); // QQ郵箱smtp傳送伺服器地址
//mailSender.setPort(465); // QQ這個埠不可用? 為什麼?
mailSender.setPort(587);// 埠號
mailSender.setUsername("[email protected]"); // 使用你自己的賬號
mailSender.setPassword("usbusbcnzztbsbtob"); // 授權碼-發簡訊獲取
//
// 相關屬性配置, 也可以不修改,使用預設值
Properties props = mailSender.getJavaMailProperties();
props.put("mail.transport.protocol", "smtp");// 協議
props.put("mail.smtp.auth", "true");// 登入
props.put("mail.smtp.starttls.enable", "true");//使用SSL
props.put("mail.debug", "true");// 除錯資訊輸出
//
return mailSender;
}
}
當然, 具體的程式碼請根據需要進行適當的封裝。 比如自定義工具類。
結果如下圖所示:
傳送內聯圖片示例
有兩種手段,請根據需要選擇:
- HTML嵌入http路徑的圖片。
- 以內聯資源的方式傳送圖片。
以下是這兩種內聯圖片的示例:
package com.cncounter.test.spring;
import org.apache.commons.io.IOUtils;
import org.springframework.core.io.ByteArrayResource;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class TestSpringImageEmail {
public static void main(String[] args) throws Exception {
// 傳送帶內聯圖片的MIME郵件
sendImageEmail();
}
// 傳送帶內聯圖片的MIME郵件
public static void sendImageEmail() throws MessagingException, IOException {
// 郵件傳送器
JavaMailSender mailSender = getJavaMailSender();
// MIME 郵件
MimeMessage mimeMessage = mailSender.createMimeMessage();
// 輔助類; 明確使用 UTF-8 編碼; 否則HTML報中文亂碼
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
//
boolean isHTML = true;
// 郵件資訊
helper.setFrom("[email protected]"); // 發件人郵箱
helper.setTo("[email protected]"); // 收件人郵箱
helper.setSubject("測試Spring傳送內聯圖片-3"); // 標題
helper.setText("<h1>測試圖片</h1>" +
"海信電視-InLine:" +
"<br/>" +
"<a target='_blank' href='http://www.yuledanao.com/dl/haixin.png'><img src='cid:image1' /></a>" +
"<br/>" +
"img-src-http資源:" +
"<br/>" +
"<a target='_blank' href='http://www.yuledanao.com/dl/haixin.png'><img src='http://www.yuledanao.com/dl/haixin.png' /></a>" +
"<br/>" +
"<br/>" +
"請點選: <a target='_blank' href='http://www.yuledanao.com/dl/PWA_INTRO.zip'><b>PWA開發簡介.zip</b></a>;" +
" 或者下載附件!", isHTML); // HTML-資訊
// cid - content-ID
// 增加內聯圖片:
// 不作為附件傳送
String imageName1 = "E:/haixin.png";
InputStream imageInputStream1 = new FileInputStream(imageName1);
ByteArrayResource imageResource1 =
new ByteArrayResource(IOUtils.toByteArray(imageInputStream1));
helper.addInline("image1", imageResource1, "image/png");
// 增加1個附件; 可以使用多種資源API
String fileName1 = "E:/PWA開發簡介.zip";
InputStream inputStream1 = new FileInputStream(fileName1);
//
// Java Mail 會開啟2次 InputStreamResource;
// 第一次確定編碼, 第二次才執行編碼。
ByteArrayResource byteResource1 =
new ByteArrayResource(IOUtils.toByteArray(inputStream1));
// 所以不能直接使用 InputStreamResource
// InputStreamResource attachment1 = new InputStreamResource(inputStream1);
helper.addAttachment("PWA開發簡介.zip", byteResource1);
try {
mailSender.send(mimeMessage);
System.out.println("郵件傳送成功!"); // 沒有報錯就是好訊息 :-)
} catch (MailException ex) {
System.err.println("傳送失敗:" + ex.getMessage());
} finally {
IOUtils.closeQuietly(inputStream1);
}
}
// 獲取郵件傳送器
public static JavaMailSender getJavaMailSender() {
//
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
// 參考QQ郵箱幫助中心
mailSender.setHost("smtp.qq.com"); // QQ郵箱smtp傳送伺服器地址
//mailSender.setPort(465); // QQ這個埠不可用? 為什麼?
mailSender.setPort(587);// 埠號
mailSender.setUsername("[email protected]"); // 使用你自己的賬號
mailSender.setPassword("usbusbcnzztbsbtob"); // 授權碼-發簡訊獲取
//
// 相關屬性配置, 也可以不修改,使用預設值
Properties props = mailSender.getJavaMailProperties();
props.put("mail.transport.protocol", "smtp");// 協議
props.put("mail.smtp.auth", "true");// 登入
props.put("mail.smtp.starttls.enable", "true");//使用SSL
//props.put("mail.debug", "true");// 除錯資訊輸出
//
return mailSender;
}
}
如果在公網上沒有固定的HTTP伺服器或者CDN伺服器, 則需要使用內聯的方式來發送圖片。
可以從網路上下載到圖片資源, 則引用 HTTP 資源更簡單便捷。
需要CSS樣式則設定HTML元素的style屬性即可。
執行結果如下圖所示:
和傳送附件並不衝突。如果需要傳送很多圖片, 可以使用模板技術, 以及 Map/Bean來封裝傳入的資料。
更多資訊, 請參考相關連結。
相關連結
日期: 2018年4月8日
相關推薦
spring通過QQ郵箱傳送Email
本文簡要介紹如何通過Spring框架的支援,通過QQ郵箱來發送郵件,包括簡單文字,附件、以及內聯圖片、HTML以及HTTP圖片。 spring-context-support很早就內建支援郵件傳送。 當然, 官方文件明確指出, 需要依賴 JavaMa
java實現通過QQ郵箱傳送啟用郵件 springBoot
使用者郵件啟用 通過QQ郵箱傳送啟用郵件 soringBoot 本文主要介紹了使用java 呼叫郵箱傳送郵件的功能 首先新建一個springboot專案 pom依賴如下 <parent> <groupId>org.springframewor
這裡是通過QQ郵箱 sina新浪郵箱 163郵箱的簡單傳送Email
1.首先去官網下載傳送Email的相應的jar檔案如 smtp.jar mailapi.jar等 2.去QQ sina 163中的設定裡開啟POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 一些你傳送Email的服務歇協議 及生成授權碼等
Python使用QQ郵箱傳送多收件人email
實際開發過程中使用到郵箱的概率很高,那麼如何藉助python使用qq郵箱傳送郵件呢? 程式碼很簡單,短短几行程式碼就可以實現這個功能。 使用到的模組有smtplib和email這個兩個模組,關於這兩個模組的方法就不多說了。 程式碼如下: #codin
PHP通過PHPMailer類庫實現QQ郵箱傳送方法
其實PHP郵箱傳送功能並非每個專案都一定用得到,但其實每個完整的專案,一般都會包含一個PHP郵箱傳送功能。 一般郵箱傳送功能普遍用於註冊啟用,密碼找回,以及留言回覆等等功能上。而且這也是很多人頭疼的問
Spring Boot學習(十四)之Spring boot中使用QQ郵箱傳送郵件
相信使用過Spring的眾多開發者都知道Spring提供了非常好用的JavaMailSender介面實現郵件傳送。在Spring Boot的Starter模組中也為此提供了自動化配置。下面通過例項看看如
Jsp 實現Email傳送,QQ郵箱傳送時530錯誤的解決
1.163郵箱與QQ郵箱進行測試 * 163郵箱的安全驗證沒有那麼嚴格 ,所以可以忽略一下操作.直接看程式碼 1.1.首先確定你需要用來發送的qq,進入QQ郵箱開啟ssl. * qq郵箱 > 賬戶 >圖中箭頭位置
java 通過QQ郵箱發郵件
public static void main(String[] args) throws Exception { Properties props = System.getProperties(); &
Springboot2.0.4呼叫qq郵箱傳送郵件
開場白:沒記錯的話,用不同框架開發一個發郵箱的功能,都會遇到多多少少的問題,這次也不能例外,否則就沒有意義了。 今天用springboot2.0.4開發發郵件功能,遇到了以下三個坑 專案中添加了該依賴,但是仍舊找不到 下面的物件,一直說該物件沒有被發現,後來
py3傳送使用QQ郵箱傳送html附件
#html附件 下面是將測試報告放到附件中傳送 email_text = MIMEText('測試報告') att1 = MIMEText(mailbody,'base64','utf-8') att1['Content-Type'] = '
CI框架中QQ郵箱傳送郵件
public function qq(){ $this->load->library('email'); $config['protocol'] = 'smtp';
flask_email實現QQ郵箱傳送郵件
直接上程式碼 from flask import Flask from flask_mail import Mail, Message from threading import Thread #
java實現qq郵箱傳送註冊驗證碼
import javax.mail.*; import javax.mail.internet.MimeMessage;/** * * @param email 傳送郵箱驗證碼(註冊) * @return 驗證碼給前段 */ @RequestMapping(valu
Python SMTP模組使用QQ郵箱傳送郵件
前言: 嘗試實現《Python程式設計快速上手 讓繁瑣工作自動化》書籍中的第十六章習題部分,使用python傳送email資訊,嘗試傳送Html,附件和正文都同時存在的郵件,使用QQ郵箱,最終實現根據表格標記對不同使用者發不同郵件功能。(根據之前編寫的讀取表格示例可以
Java 基於JavaMail實現向QQ郵箱傳送郵件
需求 最近專案在做新聞爬蟲,想實現這個功能:爬蟲某個頁面失敗後,把這個頁面的 url 發到筆者的郵箱。最終實現的效果圖如下,後期可以加上過濾標籤、失敗狀態碼等,方便分類搜尋異常。 開發人員可以根據郵件裡的 url 和堆疊資訊,分析爬蟲失敗的原因。 是
java程式碼使用QQ郵箱傳送郵件
import java.util.Properties; import javax.mail.Authenticator; import javax.mail.Message.RecipientType; import javax.mail.MessagingException; import javax.
阿里雲上的使用QQ郵箱傳送郵件
直接上程式碼了 由於阿里雲禁用了25埠所以替換成465埠並修改協議為ssl才能傳送郵件 參考我的另一篇部落格 http://blog.csdn.net/u013412790/article/details/54912506 public class Se
Java使用QQ郵箱傳送郵件
本文介紹通過java,使用QQ郵箱進行傳送郵件。 首先要開啟郵箱的SMTP服務,騰訊會給一個授權碼。 package util; import java.util.Properties; import javax.mail.Authenticator; import
Python用QQ郵箱傳送郵件時授權碼問題
QQ郵箱最新推出了一個授權碼,需已驗證的手機號向QQ郵箱伺服器傳送一條簡訊獲得。該授權碼用於第三方客戶端登入,代替了第三方登入時使用的個人郵箱密碼。 在測試過程中遇到兩個問題: 1.提示需建立SSL安全連線。於是將smtplib.SMTP() 改成了smtplib.SMT
python 3.6.3 , 使用QQ 郵箱傳送郵件
示例程式碼:#coding=utf-8 import smtplib from email.mime.text import MIMEText msg_from='[email protec