1. 程式人生 > >JavaMail(四)——傳送HTML格式、內嵌圖片、帶附件的郵件

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應用之模板ThymeleafFreeMarker

  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 將Word2003doc/Word2007docxHtml格式檔案

程式碼實現: 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工具解析htmldom4j讀寫xml

        之前提到過,對於簡單的網頁結構解析,可以直接通過觀察法、手工寫正則解析,可以做出來,比如網易微博。但是對於結構稍微複雜點的,比如新浪微博,如果還用正則,用眼睛一個個去找,未免太麻煩了。         本文介紹兩個工具包:解析html, xml的jsoup,

自制Java虛擬機-對象newinvokespecial

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——信息分析域名分析dighost

p地址 blog alt src org amt png 負責 一級域名 1、域名的命名格式為:WWW.<用戶名>.<二級域名>.<一級域名> dig www.baidu.com 解析過程說明

FPGA基礎知識鎖存器觸發器寄存器和緩沖器的區別

高端 指示器 領域 串行 方法 register 緩沖區 計算機 字節 一、鎖存器鎖存器(latch)---對脈沖電平敏感,在時鐘脈沖的電平作用下改變狀態鎖存器是電平觸發的存儲單元,數據存儲的動作取決於輸入時鐘(或者使能)信號的電平值,僅當鎖存器處於使能狀態時,輸出才會隨著