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

淺析JavaMail發(fā)送郵件后再通過JavaMail接收格式問題

 更新時間:2019年06月05日 11:34:55   作者:Dream_saddle  
這篇文章主要介紹了JavaMail發(fā)送郵件后再通過JavaMail接收格式問題 ,本文通過代碼實例給大家詳細解說,需要的朋友可以參考下

復(fù)雜郵件發(fā)送問題

關(guān)于 JavaMail 如何發(fā)送郵件這里就不贅述了,網(wǎng)上有很多例子。其中最復(fù)雜的郵件發(fā)送莫過于 html郵件包含內(nèi)嵌圖片以及附件,最近項目中的這項功能我在發(fā)送郵件時就出現(xiàn)了一系列問題。

我在使用 JavaMail 發(fā)送了郵件之后,會再次通過 JavaMail 將其獲取回來進行解析,由于發(fā)送操作不當(dāng),導(dǎo)致了解析就不是那么回事了。

接下來先看看正常的解析過程吧。關(guān)于郵件的解析,網(wǎng)上依然有很多例子。

private static void multipartMailParser(Multipart mail) throws Exception {
  int count = mail.getCount();
  System.out.println("part count: " + count);
  for (int i = 0; i < count; i++) {
    BodyPart bodyPart = mail.getBodyPart(i);
    //cid 解析
    //cid 示例: <4a85b9c9$1$16af704cfc3$Coremail$user_taohan$163.com>
    String[] cids = bodyPart.getHeader("Content-Id");
    System.out.println("=========> cids: " + (cids == null ? "NULL" : cids.length));
    String content = "", cid = "";
    if (cids != null && cids.length > 0) {
      content = cids[0];
      if (content.startsWith("<") && content.endsWith(">")) {
        cid = "cid:" + content.substring(1, content.length() - 1);
      } else {
        cid = "cid:" + content;
      }
    }
    System.out.println(content+"---"+cid);
    System.out.println(bodyPart.getContentType());
    if (bodyPart.isMimeType("text/plain")) {
      System.out.println("純文本郵件: " + bodyPart.getContent());
    } else if (bodyPart.isMimeType("text/html")) {
      System.out.println("html郵件: " + bodyPart.getContent());
    } else if (bodyPart.isMimeType("multipart/*")) {
      Multipart part = (Multipart)bodyPart.getContent();
      multipartMailParser(part);
    } else if (bodyPart.isMimeType("application/octet-stream")) {
      String disposition = bodyPart.getDisposition();
      System.out.println("任意的二進制數(shù)據(jù): " + disposition);
      //這里就是對附件進行解析
      if (disposition.equalsIgnoreCase(BodyPart.ATTACHMENT)) {
        String fileName = bodyPart.getFileName();
        System.out.println("------------------------保存附件 " + fileName);
        InputStream is = bodyPart.getInputStream();
        File file = new File("C:\\Users\\AB\\Desktop\\mail\\"+fileName);
        copy(is, new FileOutputStream(file));
      }
    } else if (bodyPart.isMimeType("image/*") && !("".equals(cid))) {
      //內(nèi)嵌圖片處理
      DataHandler dataHandler = bodyPart.getDataHandler();
      String name = dataHandler.getName();
      System.out.println("內(nèi)嵌圖片 NAME: " + name);
      InputStream is = dataHandler.getInputStream();
      File file = new File("C:\\Users\\AB\\Desktop\\mail\\"+name);
      copy(is, new FileOutputStream(file));
    }
  }
}

private static void copy(InputStream is, OutputStream os) throws IOException {
  byte[] bytes = new byte[1024];
  int len = 0;
  while ((len=is.read(bytes)) != -1 ) {
    os.write(bytes, 0, len);
  }
  if (os != null)
    os.close();
  if (is != null)
    is.close();
}

使用以上方法對郵件進行解析是沒有問題的,內(nèi)嵌圖片、附件都是可以分開解析的。但在我解析通過 JavaMail 發(fā)送的郵件時就出現(xiàn)了問題。

先看看最初是怎么發(fā)送的吧。這里就不貼完整代碼了,我就是按照文章開始鏈接對應(yīng)的文章進行了修改。

//這里只給出附件節(jié)點創(chuàng)建方法吧
//給出參數(shù)accessory(附件信息)格式為: zxd.jpg-C:/Users/AB/Desktop/zxd.jpg,lyf.jpg-C:/Users/AB/Desktop/lyf.jpg,htmlFile-C:/Users/AB/Desktop/file.html,golang-C:/Users/AB/Desktop/Demo.go
private List<MimeBodyPart> mailAttachmentParts(String accessory) throws MessagingException, UnsupportedEncodingException {
  //附件節(jié)點集合
  List<MimeBodyPart> attachments = new ArrayList<>();
  MimeBodyPart attachment;
  DataHandler dh;
  String[] accs = accessory.split(",");
  for (final String acc : accs) {
    String[] ac = acc.split("-");
    //按照網(wǎng)上文章的例子,這里只需要進行如下設(shè)置即可
    attachment = new MimeBodyPart();
    dh = new DataHandler(new FileDataSource(ac[1]));
    attachment.setDataHandler(dh);
    attachments.add(attachment);
  }
  return attachments;
}

發(fā)送后,查看去郵件服務(wù)器中查看,郵件是正常的。但是我再通過 JavaMail 獲取就出現(xiàn)問題了。輸出如下:(//…​為我給出的注釋)

part count: 5
=========> cids: NULL
---
multipart/related;
  boundary="----=_Part_2_1562389956.1559641692502"
part count: 2
=========> cids: NULL
---
text/html; charset=UTF-8
//郵件內(nèi)容正常獲取
html郵件: <html><body><h1>這是郵件發(fā)送測試十二</h1><b>這依然是劉亦菲</b><br><br><br><img src='cid:liuyifei' /></body></html>

//內(nèi)嵌圖片也正常獲取
=========> cids: 1
liuyifei---cid:liuyifei
image/jpeg; name=lyf2.jpg
內(nèi)嵌圖片 NAME: lyf2.jpg
=========> cids: NULL
---
image/jpeg; name=zxd.jpg  //附件圖片獲取失敗, 可以看見前面為 image/jpeg,也就是說 JavaMail 并沒有將其作為附件進行處理
=========> cids: NULL
---
image/jpeg; name=lyf.jpg  //附件圖片獲取失敗
=========> cids: NULL
---
//最可笑的是居然將我的 file.html 文件當(dāng)做了 text/html 來進行了處理, 沒有將 html 文件保存到本地,而是直接輸出了其中的內(nèi)容
//我在手機郵件app中查看這封郵件的時候, 我的郵件內(nèi)容并不是上面打印的內(nèi)容, 而是這個 html 文件中的內(nèi)容
text/html; charset=us-ascii; name=file.html
html郵件: <!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>file upload</title>
</head>
<body>
  <div>
    <form action="http://localhost:8080/api/mail/record/accessory/upload" method="POST" enctype="multipart/form-data">
      <input type="file" name="file">
      <input type="submit" value="Submit">
    </form>
  </div>
</body>
</html>
//但奇怪的是 Demo.go 這個文件又被正常的當(dāng)做了附件處理
//到這里就大概知道其中的原因了
//上面的 圖片和html 文件都是比較特殊的, 但是 Demo.go 就不一樣了
=========> cids: NULL
---
application/octet-stream; name=Demo.go
任意的二進制數(shù)據(jù): attachment
------------------------保存附件 Demo.go

于是,我將需要發(fā)送的郵件保存至本地, message.writeTo(new FileOutputStream("D/mail.eml")) 即可;

打開查看其中的內(nèi)容發(fā)現(xiàn)

附件都有如下內(nèi)容:

Content-Type: image/jpeg; name=lyf.jpg
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=lyf.jpg
—————————————————————
Content-Type: application/octet-stream; name=Demo.go
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename=Demo.go

而對比上面獲取郵件的輸出內(nèi)容,只有 Demo.go 這一個文件輸出了 application/octet-stream 字樣, 所以問題就已經(jīng)變得很明顯了。


只需要在創(chuàng)建附件節(jié)點時,為附件節(jié)點設(shè)置以下幾樣?xùn)|西即可

attachment.setFileName(MimeUtility.encodeText(dh.getName())); //附件名稱
attachment.setDisposition(BodyPart.ATTACHMENT); //設(shè)置 disposition 為 attachment (附件標(biāo)識)
attachment.setHeader("content-disposition", "attachment; filename="+dh.getName()); //設(shè)置以下兩個 header
attachment.setHeader("content-type", "application/octet-stream; name="+dh.getName());

再看獲取郵件輸出:

part count: 5
=========> cids: NULL
---multipart/related;
  boundary="----=_Part_2_1714832523.1559700934372"
part count: 2
=========> cids: NULL
---
text/html; charset=UTF-8
html郵件: <html><body><h1>這是郵件發(fā)送測試十四</h1><b>這依然是劉亦菲</b><br><br><br><img src='cid:liuyifei' /></body></html>
=========> cids: 1
liuyifei---cid:liuyifei
image/jpeg; name=lyf2.jpg
內(nèi)嵌圖片 NAME: lyf2.jpg
=========> cids: NULL
---
application/octet-stream; name=zxd.jpg
任意的二進制數(shù)據(jù): attachment
------------------------保存附件 zxd.jpg
=========> cids: NULL
---
application/octet-stream; name=lyf.jpg
任意的二進制數(shù)據(jù): attachment
------------------------保存附件 lyf.jpg
=========> cids: NULL
---
application/octet-stream; name=file.html
任意的二進制數(shù)據(jù): attachment
------------------------保存附件 file.html
=========> cids: NULL
---
application/octet-stream; name=Demo.go
任意的二進制數(shù)據(jù): attachment
------------------------保存附件 Demo.go

這下就正常了,其實解決辦法就是添加上面幾樣配置即可。

總結(jié)

以上所述是小編給大家介紹的JavaMail發(fā)送郵件后再通過JavaMail接收格式問題,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • Spring?Data?Jpa?中原生查詢?REGEXP?的使用詳解

    Spring?Data?Jpa?中原生查詢?REGEXP?的使用詳解

    這篇文章主要介紹了Spring?Data?Jpa?中原生查詢?REGEXP?的使用詳解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • SpringBoot中動態(tài)數(shù)據(jù)源配置與使用詳解

    SpringBoot中動態(tài)數(shù)據(jù)源配置與使用詳解

    在現(xiàn)代應(yīng)用中,處理多數(shù)據(jù)源是常見的需求,在 Spring Boot 中,這樣的需求可以通過動態(tài)數(shù)據(jù)源來輕松實現(xiàn),本篇博客將詳細介紹如何在 Spring Boot 中配置和使用動態(tài)數(shù)據(jù)源,并演示如何切換到指定的數(shù)據(jù)源,需要的朋友可以參考下
    2024-10-10
  • Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例

    Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例

    這篇文章主要介紹了Java使用自定義注解+反射實現(xiàn)字典轉(zhuǎn)換代碼實例,注解是一種能被添加到j(luò)ava代碼中的元數(shù)據(jù),類、方法、變量、參數(shù)和包都可以用注解來修飾,注解對于它所修飾的代碼并沒有直接的影響,需要的朋友可以參考下
    2023-09-09
  • Spring+SpringMVC+MyBatis整合詳細教程(SSM)

    Spring+SpringMVC+MyBatis整合詳細教程(SSM)

    Spring是一個開源框架,Spring是于2003 年興起的一個輕量級的Java 開發(fā)框架。這篇文章主要介紹了Spring+SpringMVC+MyBatis整合詳細教程(SSM),需要的朋友可以參考下
    2017-10-10
  • SpringBoot配置Spring Native的詳細步驟

    SpringBoot配置Spring Native的詳細步驟

    配置 Spring Native 以減少 Spring Boot 應(yīng)用的啟動時間,涉及幾個關(guān)鍵步驟,包括設(shè)置相應(yīng)的依賴、配置文件以及構(gòu)建過程,本文給大家就介紹了詳細的步驟和配置示例,需要的朋友可以參考下
    2024-11-11
  • 關(guān)于Java垃圾回收開銷降低的幾條建議

    關(guān)于Java垃圾回收開銷降低的幾條建議

    垃圾回收(Garbage Collection)是Java虛擬機(JVM)垃圾回收器提供的一種用于在空閑時間不定時回收無任何對象引用的對象占據(jù)的內(nèi)存空間的一種機制,下面這篇文章主要介紹了關(guān)于Java垃圾回收開銷降低的幾條建議,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • java使用多線程讀取超大文件

    java使用多線程讀取超大文件

    這篇文章主要為大家詳細介紹了java使用多線程讀取超大文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • 如何在Java中判斷兩個Long類型是否相等

    如何在Java中判斷兩個Long類型是否相等

    這篇文章主要介紹了如何在Java中判斷兩個Long類型是否相等,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的?參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Spring?MVC和springboot靜態(tài)資源處理問題

    Spring?MVC和springboot靜態(tài)資源處理問題

    這篇文章主要介紹了Spring?MVC和springboot靜態(tài)資源處理問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • idea中使用git插件回滾代碼的流程步驟

    idea中使用git插件回滾代碼的流程步驟

    使用idea開發(fā)java代碼時,如果想回滾git提交的代碼, 需要操作三步,本篇步驟操作前,前提是你的電腦已經(jīng)安裝了git插件,并且你的idea也集成了git插件,下面是詳細步驟,需要的朋友可以參考下
    2025-04-04

最新評論

双鸭山市| 德江县| 泗阳县| 金沙县| 丽江市| 赤水市| 日照市| 甘孜| 比如县| 饶河县| 西峡县| 张北县| 丹寨县| 江安县| 赞皇县| 苍南县| 临泉县| 德格县| 旬邑县| 龙南县| 庆云县| 钟祥市| 吉安市| 长宁区| 耿马| 门头沟区| 辽源市| 五大连池市| 晴隆县| 保靖县| 宁城县| 达州市| 普兰店市| 土默特左旗| 寿阳县| 遂溪县| 东丽区| 湖州市| 田林县| 准格尔旗| 邵东县|