最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2015年11月24日 17:51:16   作者:haolloyin  
這篇文章主要介紹了Java程序中使用JavaMail發(fā)送帶圖片和附件的郵件,JavaMail是專門用來處理郵件的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 類和 DataHandler 類來獲得給定路徑的資源文件,JAF 框架中的這兩個(gè)類共同協(xié)作可以獲知文件所屬的 MIME 類型,它們會(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() 方法來關(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 文件,雙擊打開,如下圖:

20151124174905292.png (664×256)

20151124174934256.png (457×468)

看看上面用 Outlook 打開生成的文件,在附件欄里面就有一個(gè) .java 源文件和一首 MP3 文件了。
打開郵件的原始內(nèi)容:
查看生成的郵件的原始內(nèi)容,點(diǎn)擊“文件”、“屬性”、“郵件來源”或者使用 EditPlus 、UltraEdit 等文本編輯器直接打開也行,下面是原始內(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)用背景顏色指出來了,有興趣的可以深入了解一下 MIME 協(xié)議對(duì)郵件結(jié)構(gòu)組織的規(guī)范格式。

相關(guān)文章

  • idea打開項(xiàng)目沒有項(xiàng)目目錄問題及解決

    idea打開項(xiàng)目沒有項(xiàng)目目錄問題及解決

    這篇文章主要介紹了idea打開項(xiàng)目沒有項(xiàng)目目錄問題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • SpringBoot如何手寫一個(gè)starter并使用這個(gè)starter詳解

    SpringBoot如何手寫一個(gè)starter并使用這個(gè)starter詳解

    starter是SpringBoot中的一個(gè)新發(fā)明,它有效的降低了項(xiàng)目開發(fā)過程的復(fù)雜程度,對(duì)于簡(jiǎn)化開發(fā)操作有著非常好的效果,下面這篇文章主要給大家介紹了關(guān)于SpringBoot如何手寫一個(gè)starter并使用這個(gè)starter的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法

    SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法

    微服務(wù)架構(gòu)中多數(shù)據(jù)源切換是個(gè)常見的需求,Spring Boot 提供了強(qiáng)大的支持來簡(jiǎn)化這一過程.本文給大家介紹了SpringBoot中Druid連接池與多數(shù)據(jù)源切換的方法,需要的朋友可以參考下
    2024-11-11
  • Java的枚舉,注解和反射(一)

    Java的枚舉,注解和反射(一)

    今天小編就為大家分享一篇關(guān)于Java枚舉,注解與反射原理說明,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2021-07-07
  • 如何給HttpServletRequest增加消息頭

    如何給HttpServletRequest增加消息頭

    這篇文章主要介紹了如何給HttpServletRequest增加消息頭的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • application.yml和bootstrap.yml不生效的3種解決方案

    application.yml和bootstrap.yml不生效的3種解決方案

    SpringBoot默認(rèn)支持?properties(.properties) 和 YAML(.yml .yaml ) 配置文件,本文主要介紹了application.yml和bootstrap.yml不生效的3種解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • SpringBoot聲明式事務(wù)的簡(jiǎn)單運(yùn)用說明

    SpringBoot聲明式事務(wù)的簡(jiǎn)單運(yùn)用說明

    這篇文章主要介紹了SpringBoot聲明式事務(wù)的簡(jiǎn)單運(yùn)用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java中ArrayList同步的2種方法分享

    Java中ArrayList同步的2種方法分享

    這篇文章主要分享了Java中ArrayList同步的2種方法,Collections.synchronizedList()的方法,這個(gè)方法要進(jìn)行串行訪問以及使用CopyOnWriteArrayList,下面分享內(nèi)容需要的小伙伴可以參考一下
    2022-03-03
  • Spring Boot 啟動(dòng)端口如何啟動(dòng)

    Spring Boot 啟動(dòng)端口如何啟動(dòng)

    這篇文章主要介紹了Spring Boot 啟動(dòng)端口如何啟動(dòng)的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • Mybatis如何獲取最新插入數(shù)據(jù)的id

    Mybatis如何獲取最新插入數(shù)據(jù)的id

    這篇文章主要介紹了Mybatis如何獲取最新插入數(shù)據(jù)的id,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評(píng)論

嘉荫县| 修水县| 英吉沙县| 五常市| 额济纳旗| 河西区| 盐池县| 东乡县| 克拉玛依市| 柞水县| 江油市| 荃湾区| 江西省| 合川市| 德令哈市| 齐齐哈尔市| 三门县| 寿光市| 高州市| 阳江市| 定南县| 隆回县| 博爱县| 桂阳县| 洪泽县| 怀来县| 万山特区| 玉门市| 昌吉市| 夹江县| 昆山市| 奇台县| 政和县| 广平县| 江西省| 高台县| 繁昌县| 九寨沟县| 建德市| 南川市| 合山市|