JavaMail(四)——傳送HTML格式、內嵌圖片、帶附件的郵件
程式碼如下:
package com.company;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
/**
* Created by lining on 2018/5/26.
*/
public class ComplexMessage {
private static final String nickname = "李寧";
private static final String username = "152****[email protected]";
private static final String password = "******";
private static final String protocol = "smtp";
private static final String host = "smtp.163.com" ;
private static final String port = "25";
public static void main(String[] args) {
String to = "******[email protected];******[email protected]";
String subject = "HTML+內嵌圖片+附件郵件主題";
String body = "<h4>HTML+附件+內嵌圖片的郵件測試!!!</h4></br><a href=http://www.apache.org>" + "點選跳轉</a>" +
"<h4>LOGO圖示</h4></hr><img src=\"cid:logo\">" +
"<h4>哈士奇</h4></hr><img src=\"cid:image\">";
String attach = "D:\\TXT\\CMD命令.txt;D:\\TXT\\常用MYSQL語句.txt";
Map<String, String> imagesMap = new HashMap<>();
imagesMap.put("logo","D:\\asf_logo_wide.gif");
imagesMap.put("image","D:\\哈士奇.jpg");
Email email = new Email();
email.setToEmails(to.split(";"));
email.setSubject(subject);
email.setContent(body);
email.setAttachments(attach.split(";"));
email.setImagesMap(imagesMap);
if (sendEmail(email)) {
System.out.println("郵件傳送成功!");
} else {
System.out.println("郵件傳送失敗!請及時解決!");
}
}
/**
* 傳送郵件
* @param email 郵件資訊實體
* @return 是否傳送成功 TRUE 傳送成功 FALSE 傳送失敗
*/
public static boolean sendEmail(Email email) {
try {
// 建立Session例項物件
Session session = createSession();
// 建立MimeMessage例項物件
MimeMessage message = createMessage(session, email);
// 傳送郵件
System.out.println("傳送郵件中......");
Transport.send(message);
return true;
} catch (Exception e) {
System.out.println("傳送郵件異常==》");
e.printStackTrace();
return false;
} finally {
System.out.println("郵件傳送結束...");
}
}
/**
* 建立與郵件伺服器的會話物件
* @return 伺服器的會話物件
*/
public static Session createSession() {
// 封裝屬性引數
Properties props = new Properties();
props.setProperty("mail.transport.protocol", protocol);
props.setProperty("mail.smtp.host", host);
props.setProperty("mail.smtp.port", port);
props.setProperty("mail.smtp.auth", "true"); // 是否需要驗證設定為TRUE,使用授權碼傳送郵件需要驗證
// 獲取與伺服器的會話Session物件
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 登陸賬號及密碼,密碼需要是第三方授權碼
return new PasswordAuthentication(username, password);
}
});
return session;
}
/**
* 建立郵件的核心內容
* @param session 與伺服器互動的會話物件
* @param email 郵件實體
* @return 生成的MimeMessage例項物件
* @throws Exception
*/
public static MimeMessage createMessage(Session session, Email email) throws Exception{
// 建立MimeMessage例項物件
MimeMessage message = new MimeMessage(session);
// 設定發件人
if (!nickname.isEmpty()) {
// 自定義發件人暱稱
message.setFrom(new InternetAddress(MimeUtility.encodeText(nickname) + " <" + username + ">"));
} else {
message.setFrom(new InternetAddress(username));
}
// 設定收件人
String[] toEmails = email.getToEmails();
if (toEmails != null && toEmails.length != 0) {
InternetAddress[] internetAddressTO = new InternetAddress[toEmails.length];
for (int i = 0; i < toEmails.length; i++) {
internetAddressTO[i] = new InternetAddress(toEmails[i]);
}
message.setRecipients(Message.RecipientType.TO, internetAddressTO);
}
// 設定密送人
String[] bccEmails = email.getBccEmails();
if (bccEmails != null && bccEmails.length != 0) {
InternetAddress[] internetAddressBCC = new InternetAddress[bccEmails.length];
for (int i = 0; i < bccEmails.length; i++) {
internetAddressBCC[i] = new InternetAddress(bccEmails[i]);
}
message.setRecipients(Message.RecipientType.BCC, internetAddressBCC);
}
// 設定抄送人
String[] ccEmails = email.getCcEmails();
if (ccEmails != null && ccEmails.length != 0) {
InternetAddress[] internetAddressCC = new InternetAddress[ccEmails.length];
for (int i = 0; i < ccEmails.length; i++) {
internetAddressCC[i] = new InternetAddress(ccEmails[i]);
}
message.setRecipients(Message.RecipientType.CC, internetAddressCC);
}
// 設定發生日期
message.setSentDate(new Date());
// 設定郵件主題
message.setSubject(email.getSubject());
/* 建立用於組合郵件正文和附件的MimeMultipart物件 */
MimeMultipart multipart = new MimeMultipart();
// 設定HTML內容
MimeBodyPart content = createContent(email.getContent(), email.getImagesMap());
multipart.addBodyPart(content);
// 設定附件
String[] attachments = email.getAttachments();
if (attachments != null && attachments.length != 0) {
for (String filename: attachments) {
MimeBodyPart attachPart = createAttachment(filename);
multipart.addBodyPart(attachPart);
}
}
// 將組合的MimeMultipart物件設定為整個郵件的內容,要注意呼叫saveChanges方法進行更新
message.setContent(multipart);
// 儲存並生成最終的郵件內容
message.saveChanges();
return message;
}
public static MimeBodyPart createContent(String body, Map<String, String> imagesMap) throws Exception {
/* 建立代表組合MIME訊息的MimeMultipart物件和該物件儲存到的MimeBodyPart物件 */
MimeBodyPart content = new MimeBodyPart();
// 建立一個MimeMultipart物件
MimeMultipart multipart = new MimeMultipart();
if (!body.isEmpty()) {
// 建立一個表示HTML正文的MimeBodyPart物件,並將它加入到前面的建立的MimeMultipart物件中
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(body, "text/html;charset=UTF-8");
multipart.addBodyPart(htmlBodyPart);
}
if (imagesMap != null && !imagesMap.isEmpty()) {
for (Map.Entry<String, String> entry: imagesMap.entrySet()) {
/* 建立一個表示圖片的MimeBodyPart物件,並將它加入到前面的建立的MimeMultipart物件中 */
MimeBodyPart pictureBodyPart = new MimeBodyPart();
// FileDataSource用於讀取檔案資料,並返回代表資料的輸入輸出流和資料的MIME型別
FileDataSource fileDataSource = new FileDataSource(entry.getValue());
// DataHandler類用於封裝FileDataSource物件,併為應用程式提供訪問資料的介面
pictureBodyPart.setDataHandler(new DataHandler(fileDataSource));
pictureBodyPart.setContentID(entry.getKey());
multipart.addBodyPart(pictureBodyPart);
}
}
// 將MimeMultipart物件儲存到MimeBodyPart物件中
content.setContent(multipart);
return content;
}
/**
* 建立郵件中的附件
* @param filepath 附件的路徑
* @return 生成的附件物件
* @throws Exception
*/
public static MimeBodyPart createAttachment(String filepath) throws Exception {
/* 建立一個表示附件的MimeBodyPart物件,並加入附件內容以及相應的資訊 */
MimeBodyPart attachPart = new MimeBodyPart();
// FileDataSource用於讀取檔案資料,並返回代表資料的輸入輸出流和資料的MIME型別
FileDataSource fileDataSource = new FileDataSource(filepath);
// DataHandler類用於封裝FileDataSource物件,併為應用程式提供訪問資料的介面
attachPart.setDataHandler(new DataHandler(fileDataSource));
// 設定附件名稱,MimeUtility.encodeText可以處理亂碼問題
attachPart.setFileName(MimeUtility.encodeText(fileDataSource.getName()));
return attachPart;
}
}
執行結果:
相關推薦
JavaMail(四)——傳送HTML格式、內嵌圖片、帶附件的郵件
程式碼如下: package com.company; import javax.activation.DataHandler; import javax.activation.FileDataSource; import javax.mail.
API開發實踐(四) 返回HTML
acea 指定 win filename static box 拖動地圖 ive let 分為兩個部分:生成HTML和返回HTML 生成HTML: 最終想要的時顯示地圖,不可避免的使用高德地圖的API。 【地圖API】地址錄入時如何獲得準確的經緯度?淘寶收貨地址詳解 改變幾
《SpringBoot從入門到放棄》之第(四)篇——開發Web應用之模板Thymeleaf、FreeMarker
SpringBoot提供了預設配置的模板引擎主要有以下幾種:Thymeleaf、FreeMarker、Velocity、Groovy、Mustache 預設的建立SpringBoot專案時,開發工具就幫我們建立好了src/main/resources/static目錄,該位
爬蟲入門系列(四):HTML文字解析庫BeautifulSoup
爬蟲入門系列目錄: 系列文章的第3篇介紹了網路請求庫神器 Requests ,請求把資料返回來之後就要提取目標資料,不同的網站返回的內容通常有多種不同的格式,一種是 json 格式,這類資料對開發者來說最友好。另一種 XML 格式的,還有一種最常見格式的是 HTML 文件,今天就來講講
SprongBoot傳送郵件(二)傳送HTML郵件
在“SprongBoot傳送郵件(一)傳送簡單文字郵件HelloWorld”的基礎上新增如下方法: /** * @param to 郵件收件人 * @param subject 郵件主題 * @param content 郵件
Java 將Word2003(doc)/Word2007(docx)轉Html格式檔案
程式碼實現: import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.converter.PicturesManager; import org.apache.poi.hwpf.conver
多媒體文件格式(四):TS 格式
code 不可 復雜 應用 element 模式 只需要 結構圖 音頻 一、TS 格式標準介紹 TS是一種音視頻封裝格式,全稱為MPEG2-TS。其中TS即"Transport Stream"的縮寫。 先簡要介紹一下什麽是MPEG2-TS: DVD的音視頻格式為MPEG2-
瀏覽器工作原理(四):HTML解析器 HTML Parser
HTML解析器的工作是將html標識解析為解析樹。 HTML文法定義(The HTML grammar definition) W3C組織制定規範定義了HTML的詞彙表和語法。 非上下文無關文法(Not a context free grammar) 正如在解析簡介中提
Python網路爬蟲(四):selenium+chrome爬取美女圖片
說明: Python版本:Python IDE:PyCharm chrome版本:我的版本63 chromedriver.exe:因為是模擬瀏覽器訪問,chrome需要再下載一個驅動,具體方式在我的上一篇部落格,內容很詳細。傳送門:Python網路爬蟲(
除非同時指定了 TOP,否則 ORDER BY 子句在檢視、內嵌函式、派生表和子查詢中無效。
在sql server 2000中,報錯:”除非同時指定了 TOP,否則 ORDER BY 子句在檢視、內嵌函式、派生表和子查詢中無效。“,如果實在要用 ORDER BY ,但是又不能指定確定的TOP資料時,怎麼辦呢? 解決方案: 使 用 TOP 100 PERCENT (
HTML筆記(四) - 圖像、表格、列表、區塊
sem inline 註意 樣式 而不是 style height nbsp 另一個 一、圖像 1、圖像標簽(<img>)和源屬性(<Src>) 在HTML中,圖像由<img>標簽定義,<img>是空標簽,它只包含屬性,並且沒
【網路爬蟲】【java】微博爬蟲(四):資料處理——jsoup工具解析html、dom4j讀寫xml
之前提到過,對於簡單的網頁結構解析,可以直接通過觀察法、手工寫正則解析,可以做出來,比如網易微博。但是對於結構稍微複雜點的,比如新浪微博,如果還用正則,用眼睛一個個去找,未免太麻煩了。 本文介紹兩個工具包:解析html, xml的jsoup,
自制Java虛擬機(四)-對象、new、invokespecial
utf pool tar 字節 can run 可見 frame 屬性 自制Java虛擬機(四)-對象、new、invokespecial 一、對象的表示 剛開始學Java的時候,圖書館各種教程,書名往往都是“Java面向對象高級編程”,通常作者都會與C++做個比較,列出的
u-boot移植(四)---代碼修改---時鐘修改、SDRAM
port write 啟動 tro nor ble 大小 pro 正常 最開始已經建立了新單板以及配置文件,現在就需要做的是代碼的修改,配置成適合目標板使用的u-boot。 一、時鐘修改 在代碼流程分析中,我們知道,系統的啟動是: 設置 CPU 為管理員模式 關閉
5、醜陋的字符串--全國模擬(四)
結束 改變 style div -h weight -c cout mes [編程題] 醜陋的字符串 時間限制:1秒 空間限制:32768K 牛牛喜歡字符串,但是他討厭醜陋的字符串。對於牛牛來說,一個字符串的醜陋值是字符串中相同連續字符對的個數。比如字符串“ABABAABB
1、黑白卡片--全國模擬(四)
第一個 存在 編程 mes col 1.8 != 整數 解題思路 [編程題] 黑白卡片 時間限制:1秒 空間限制:32768K 牛牛有n張卡片排成一個序列.每張卡片一面是黑色的,另一面是白色的。初始狀態的時候有些卡片是黑色朝上,有些卡片是白色朝上。牛牛現在想要把一些卡片翻過
1、黑化的牛牛--全國模擬(四)
size clas bold urn 解題思路 -a 限制 namespace fun [編程題] 黑化的牛牛 時間限制:1秒 空間限制:32768K 牛牛變得黑化了,想要摧毀掉地球。但他忘記了開啟地球毀滅器的密碼。牛牛手裏有一個字符串S,牛牛還記得從S中去掉一個字符就恰好
3、膨脹的牛牛--全國模擬(四)
style 包括 ios ria stream 包含 cnblogs 全國 cout [編程題] 膨脹的牛牛 時間限制:1秒 空間限制:32768K 牛牛以草料為食。牛牛有一天依次遇到n堆被施展了魔法的草料,牛牛只要遇到一堆跟他當前相同大小的草料,它就會把草料吃完,而使自己
Linux——信息分析(四)域名分析dig、host、
p地址 blog alt src org amt png 負責 一級域名 1、域名的命名格式為:WWW.<用戶名>.<二級域名>.<一級域名> dig www.baidu.com 解析過程說明
FPGA基礎知識(四)鎖存器、觸發器、寄存器和緩沖器的區別
高端 指示器 領域 串行 方法 register 緩沖區 計算機 字節 一、鎖存器鎖存器(latch)---對脈沖電平敏感,在時鐘脈沖的電平作用下改變狀態鎖存器是電平觸發的存儲單元,數據存儲的動作取決於輸入時鐘(或者使能)信號的電平值,僅當鎖存器處於使能狀態時,輸出才會隨著