欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java程序中使用JavaMail發(fā)送帶圖片和附件的郵件

 更新時(shí)間:2015年11月24日 17:51:16   作者:haolloyin  
這篇文章主要介紹了Java程序中使用JavaMail發(fā)送帶圖片和附件的郵件,JavaMail是專(zhuān)門(mén)用來(lái)處理郵件的Java API,需要的朋友可以參考下

我們常常在郵件中添加附件,以達(dá)到傳輸較大文件的目的。而上一篇文章只是將本機(jī)的一張圖片內(nèi)嵌到郵件的 HTML 格式的正文當(dāng)中,這樣的郵件顯得不夠豐富多彩。我們想要一封正文部分圖文并茂,而游客附帶若干附件的郵件。
下面是代碼結(jié)構(gòu)中3個(gè)重要的方法:

  1. MimeBodyPart createAttachment(String fileName) 方法用于創(chuàng)建附件并返回;
  2. MimeBodyPart createContent(String body, String fileName) 方法用于創(chuàng)建正文部分并返回;
  3. MimeMessage createMessage(Session session) 方法用于調(diào)用上面的兩個(gè)方法生成郵件。

其實(shí),創(chuàng)建一個(gè)內(nèi)含附件的郵件與上一篇文章中創(chuàng)建正文中包含圖片的郵件的原理,甚至代碼都幾乎相同。也就是使用 JAF 框架中的 FileDataSource 類(lèi)和 DataHandler 類(lèi)來(lái)獲得給定路徑的資源文件,JAF 框架中的這兩個(gè)類(lèi)共同協(xié)作可以獲知文件所屬的 MIME 類(lèi)型,它們會(huì)正確地添加到郵件組織結(jié)構(gòu)中的對(duì)應(yīng)消息頭中。

不同的是:
在 HTML 格式的正文中內(nèi)含圖片是使用 MimeBody.setContentID() 方法設(shè)置對(duì)應(yīng)的資源文件的唯一標(biāo)識(shí)符,即 MIME 協(xié)議對(duì)于郵件的結(jié)構(gòu)組織格式中的 Content-ID 頭字段;
而在 MIME 郵件中添加附件是使用 MimeBodyPart.setFileName() 方法來(lái)關(guān)聯(lián) FileSourceData 對(duì)象指向的資源文件。
程序代碼:
這個(gè)不同點(diǎn)在下面代碼中會(huì)用橙色背景強(qiáng)調(diào)指出,代碼如下:

import java.io.FileOutputStream; 
import java.util.Properties; 
 
import javax.activation.DataHandler; 
import javax.activation.FileDataSource; 
import javax.mail.Message; 
import javax.mail.Session; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeBodyPart; 
import javax.mail.internet.MimeMessage; 
import javax.mail.internet.MimeMultipart; 
 
/** 
 * 創(chuàng)建內(nèi)含附件、圖文并茂的郵件 
 * @author haolloyin 
 */ 
public class WithAttachmentMessage { 
 
  /** 
   * 根據(jù)傳入的文件路徑創(chuàng)建附件并返回 
   */ 
  public MimeBodyPart createAttachment(String fileName) throws Exception { 
    MimeBodyPart attachmentPart = new MimeBodyPart(); 
    FileDataSource fds = new FileDataSource(fileName); 
    attachmentPart.setDataHandler(new DataHandler(fds)); 
    attachmentPart.setFileName(fds.getName()); 
    return attachmentPart; 
  } 
 
  /** 
   * 根據(jù)傳入的郵件正文body和文件路徑創(chuàng)建圖文并茂的正文部分 
   */ 
  public MimeBodyPart createContent(String body, String fileName) 
      throws Exception { 
    // 用于保存最終正文部分 
    MimeBodyPart contentBody = new MimeBodyPart(); 
    // 用于組合文本和圖片,"related"型的MimeMultipart對(duì)象 
    MimeMultipart contentMulti = new MimeMultipart("related"); 
 
    // 正文的文本部分 
    MimeBodyPart textBody = new MimeBodyPart(); 
    textBody.setContent(body, "text/html;charset=gbk"); 
    contentMulti.addBodyPart(textBody); 
 
    // 正文的圖片部分 
    MimeBodyPart jpgBody = new MimeBodyPart(); 
    FileDataSource fds = new FileDataSource(fileName); 
    jpgBody.setDataHandler(new DataHandler(fds)); 
    jpgBody.setContentID("logo_jpg"); 
    contentMulti.addBodyPart(jpgBody); 
 
    // 將上面"related"型的 MimeMultipart 對(duì)象作為郵件的正文 
    contentBody.setContent(contentMulti); 
    return contentBody; 
  } 
 
  /** 
   * 根據(jù)傳入的 Seesion 對(duì)象創(chuàng)建混合型的 MIME消息 
   */ 
  public MimeMessage createMessage(Session session) throws Exception { 
    String from = test_hao@163.com; 
    String to = "test_hao@sina.cn"; 
    String subject = "創(chuàng)建內(nèi)含附件、圖文并茂的郵件!"; 
    String body = "<h4>內(nèi)含附件、圖文并茂的郵件測(cè)試?。?!</h4> </br>" 
        + "<a href = http://haolloyin.blog.51cto.com/> 螞蟻</a></br>" 
        + "<img src = \"cid:logo_jpg\"></a>"; 
 
    MimeMessage msg = new MimeMessage(session); 
    msg.setFrom(new InternetAddress(from)); 
    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to)); 
    msg.setSubject(subject); 
 
    // 創(chuàng)建郵件的各個(gè) MimeBodyPart 部分 
    MimeBodyPart attachment01 = createAttachment("F:\\java\\Snake.java"); 
    MimeBodyPart attachment02 = createAttachment("F:\\java\\meng.mp3"); 
    MimeBodyPart content = createContent(body, "F:\\java\\logo.jpg"); 
 
    // 將郵件中各個(gè)部分組合到一個(gè)"mixed"型的 MimeMultipart 對(duì)象 
    MimeMultipart allPart = new MimeMultipart("mixed"); 
    allPart.addBodyPart(attachment01); 
    allPart.addBodyPart(attachment02); 
    allPart.addBodyPart(content); 
 
    // 將上面混合型的 MimeMultipart 對(duì)象作為郵件內(nèi)容并保存 
    msg.setContent(allPart); 
    msg.saveChanges(); 
    return msg; 
  } 
 
  // 測(cè)試生成郵件 
  public static void main(String[] args) throws Exception { 
    WithAttachmentMessage mail = new WithAttachmentMessage(); 
    Session session = Session.getDefaultInstance(new Properties()); 
    MimeMessage message = mail.createMessage(session); 
    message.writeTo(new FileOutputStream("withAttachmentMail.eml")); 
  } 
} 

編譯、運(yùn)行生成 withAttachmentMail.eml 文件,雙擊打開(kāi),如下圖:

20151124174905292.png (664×256)

20151124174934256.png (457×468)

看看上面用 Outlook 打開(kāi)生成的文件,在附件欄里面就有一個(gè) .java 源文件和一首 MP3 文件了。
打開(kāi)郵件的原始內(nèi)容:
查看生成的郵件的原始內(nèi)容,點(diǎn)擊“文件”、“屬性”、“郵件來(lái)源”或者使用 EditPlus 、UltraEdit 等文本編輯器直接打開(kāi)也行,下面是原始內(nèi)容:

From: test_hao@163.com 
To: test_hao@sina.cn 
Message-ID: <56667.2.1279677956578.JavaMail.Administrator@WWW-1477FF1578B> 
Subject: =?GBK?B?tLS9qMTauqy4vbz+oaLNvM7EsqLDr7XE08q8/qOh?= 
MIME-Version: 1.0 
Content-Type: multipart/mixed;  
  boundary="----=_Part_1_13249998.1279677956546" 
 
------=_Part_1_13249998.1279677956546 
Content-Type: application/octet-stream; name=Snake.java 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; filename=Snake.java 
 
// 省略被 BASE64 轉(zhuǎn)碼后的 Snake.java 附件內(nèi)容 
 
------=_Part_1_13249998.1279677956546 
Content-Type: application/octet-stream; name=meng.mp3 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; filename=meng.mp3 
 
// 省略被 BASE64 轉(zhuǎn)碼后的 meng.java 附件內(nèi)容 
 
------=_Part_1_13249998.1279677956546 
Content-Type: multipart/related;  
  boundary="----=_Part_0_3373112.1279677956546" 
 
------=_Part_0_3373112.1279677956546 
Content-Type: text/html;charset=gbk 
Content-Transfer-Encoding: quoted-printable 
 
<h4>=C4=DA=BA=AC=B8=BD=BC=FE=A1=A2=CD=BC=CE=C4=B2=A2=C3=AF=B5=C4=D3=CA=BC= 
=FE=B2=E2=CA=D4=A3=A1=A3=A1=A3=A1</h4> </br><a href =3D http://haolloyin.bl= 
og.51cto.com/> =C2=EC=D2=CF</a></br><img src =3D "cid:logo_jpg"></a> 
------=_Part_0_3373112.1279677956546 
Content-Type: image/jpeg 
Content-Transfer-Encoding: base64 
Content-ID: logo_jpg 
 
// 省略被 BASE64 轉(zhuǎn)碼后的郵件正文部分內(nèi)嵌的 .jpg 圖片的內(nèi)容 
 
------=_Part_0_3373112.1279677956546-- 
 
------=_Part_1_13249998.1279677956546-- 

重要部分已經(jīng)用背景顏色指出來(lái)了,有興趣的可以深入了解一下 MIME 協(xié)議對(duì)郵件結(jié)構(gòu)組織的規(guī)范格式。

相關(guān)文章

  • 深入理解Java中的弱引用

    深入理解Java中的弱引用

    這篇文章主要介紹了深入理解Java中的弱引用,本文講解了強(qiáng)引用、弱引用、引用隊(duì)列、四種引用、軟引用、虛引用等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • Spring Cloud Feign實(shí)現(xiàn)文件上傳下載的示例代碼

    Spring Cloud Feign實(shí)現(xiàn)文件上傳下載的示例代碼

    Feign框架對(duì)于文件上傳消息體格式并沒(méi)有做原生支持,需要集成模塊feign-form來(lái)實(shí)現(xiàn),本文就詳細(xì)的介紹一下如何使用,感興趣的可以了解一下
    2022-02-02
  • Java8函數(shù)式接口java.util.function速查大全

    Java8函數(shù)式接口java.util.function速查大全

    因?yàn)镴ava8引入了函數(shù)式接口,在java.util.function包含了幾大類(lèi)函數(shù)式接口聲明,這篇文章主要給大家介紹了關(guān)于Java8函數(shù)式接口java.util.function速查的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • java如何解析/讀取xml文件

    java如何解析/讀取xml文件

    這篇文章主要為大家詳細(xì)介紹了java如何解析/讀取xml文件的方法,感興趣的小伙伴們可以參考一下
    2016-03-03
  • java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例

    java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例

    在項(xiàng)目開(kāi)發(fā)中經(jīng)常用到,比如前端上送文件流(byte[])到后臺(tái)并轉(zhuǎn)成文件,本文主要介紹了java byte與base64的互轉(zhuǎn)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • SpringBoot下載文件遇到文件損壞等問(wèn)題解決方案

    SpringBoot下載文件遇到文件損壞等問(wèn)題解決方案

    調(diào)用接口下載spring?boot工程的resources目錄下的excel模板文件,非常常見(jiàn)的一個(gè)文件下載功能,但是卻容易遇到很多坑,下面總結(jié)記錄下
    2023-10-10
  • Java行為型設(shè)計(jì)模式之策略模式詳解

    Java行為型設(shè)計(jì)模式之策略模式詳解

    策略模式屬于Java-設(shè)計(jì)模式中行為模式之一,該模式定義了一系列算法,并將每個(gè)算法封裝起來(lái),使它們可以相互替換。本文將通過(guò)示例詳細(xì)講解這一模式,需要的可以參考一下
    2022-11-11
  • Java 基于AQS實(shí)現(xiàn)一個(gè)同步器

    Java 基于AQS實(shí)現(xiàn)一個(gè)同步器

    這篇文章主要介紹了如何基于AQS實(shí)現(xiàn)一個(gè)同步器,幫助大家更好的理解和學(xué)習(xí)Java并發(fā),感興趣的朋友可以了解下
    2020-09-09
  • Java的動(dòng)態(tài)代理和靜態(tài)代理及反射常用API詳解

    Java的動(dòng)態(tài)代理和靜態(tài)代理及反射常用API詳解

    這篇文章主要介紹了Java的動(dòng)態(tài)代理和靜態(tài)代理及反射常用API詳解,動(dòng)態(tài)代理是一種在運(yùn)行時(shí)動(dòng)態(tài)生成代理對(duì)象的技術(shù),它是一種設(shè)計(jì)模式,用于在不修改原始對(duì)象的情況下,通過(guò)代理對(duì)象來(lái)間接訪(fǎng)問(wèn)原始對(duì)象,并在訪(fǎng)問(wèn)前后執(zhí)行額外的操作,需要的朋友可以參考下
    2024-01-01
  • Java如何將字符串轉(zhuǎn)為數(shù)字int的三種方式詳析

    Java如何將字符串轉(zhuǎn)為數(shù)字int的三種方式詳析

    這篇文章主要給大家介紹了關(guān)于Java如何將字符串轉(zhuǎn)為數(shù)字int的三種方式,在編程中我們經(jīng)常需要進(jìn)行各種數(shù)據(jù)類(lèi)型之間的轉(zhuǎn)換操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-10-10

最新評(píng)論