2015-03-02 60 views
1

我有一個電子郵件線程,我需要解析。我正在使用JavaMail API來讀取電子郵件的內容。這是到目前爲止我的代碼JavaMail:如何閱讀電子郵件線程

public static void main(String[] args) throws MessagingException, IOException { 

      InputStream in = new FileInputStream(new File("C:/Users/atomar/Desktop/Projects/CRM/mysamples/test.txt")); 

      BufferedReader bin = new BufferedReader(new InputStreamReader(in)); 
      String content = collect(bin); 
      Session s = Session.getDefaultInstance(new Properties()); 
      InputStream is = new ByteArrayInputStream(content.getBytes()); 

      MimeMessage message = new MimeMessage(s, is); 

      DataSource ds = new FileDataSource(new File("C:/Users/atomar/Desktop/Projects/CRM/mysamples/test.txt")); 

      MimeMultipart mp = new MimeMultipart(ds); 
      System.out.println(mp.getCount()); 

      MimeBodyPart bp1 = (MimeBodyPart) mp.getBodyPart(0); 

      System.out.println(bp1.getContent().toString()); 

      for(Enumeration<Header> e = bp1.getAllHeaders(); e.hasMoreElements();) 
      { 
       Header hd = e.nextElement(); 

       System.out.println(hd.getName()); 
       System.out.println(hd.getValue()); 
      } 


} 

public static String collect(BufferedReader in) throws IOException { 
    String line; 
    StringBuffer sb = new StringBuffer(); 
    while ((line = in.readLine()) != null) { 
     sb.append(line); 
     sb.append("\n"); 
    } 
    return sb.toString(); 
    } 

這裏是電子郵件消息:

From: Dxx, Sxxx (CWM-NR) 
Sent: Monday,March 02, 2015 6:18 AM 
To: ons; +CMV; Sart, Rhi; +cWK- 

Application-Monitoring-team; +R00; +Dps Group; +C-TCS- 

OPS 
Subject: RE: FATAL: /home/coprod/shells/cron/loades FAILED FOR 

BUSINESS DATE 2015xxxx 


Team, 

Informed Igor, and he will look into the issue. 


Thanks & Regards, 
Das 
-----Original Message----- 
From: Ns [mailto:[email protected]] 
Sent: 2015, March, 02 6:00 AM 
To: +CPS-DEV; Sat, Ru; +-HAWcm-iGAK; 

+R00; +Dops Group; +CCS-OPS 
Subject: FATAL: /home/coprod/shells/cron/lot_trades FAILED FOR BUSINESS 

DATE 2015xxxx 

Bus Date : 2015xxxx 
Log File : /ho/backofce/ls/lod_narades.20152 
Error  : Input file </e/boe/adles/NAS27.txt> does not 

exist. 

Log excerpt: 


================================================================================== 

=================================== 
    START  : Mon Mar 2 06:00:08 EST 2015    SCRIPT NAME IS : 

/he/crod/se/cron/lorades 
    USER NAME IS : gntyu    HOST NAME IS : ny8678i01 
    DB_SERVER IS : PROD_SERVER   ARG LIST: 

=> 06:00:08 : Using input file: /me/boshe/aes/NA27.txt 


---------------------------------  

首先,這是閱讀這條消息的正確方法是什麼?所以,現在,我的

System.out.println(mp.getCount()); 

給我一個計數1.我認爲它應該是2,因爲這裏有兩條消息。有趣的是,如果我嘗試獲取標題和內容,我會得到第二封消息的所有內容!

另外,如果我閱讀使用

MimeMessage message = new MimeMessage(s, is); 

該文件,然後試圖遍歷標題和內容,我得到的所有東西的第一條消息中!任何想法如何解決這個問題?

感謝

回答

2

你已經浪費了很多的努力讀文件,將其轉換爲字符串,然後將其轉換回字節,因此該構造的MimeMessage可以使用它。只需將該文件直接提供給MimeMessage構造函數即可。也許使用javax.mail.util.SharedFileInputStream

我不知道你爲什麼要從相同的文件數據構造一個MimeMultipart;這完全沒有必要和錯誤。

請注意,您擁有的示例消息沒有Content-Type標頭,因此JavaMail將假定它只是一個帶有文本/普通MIME類型的單個部分消息,這似乎就是它的原因。 「原始消息」分隔符下面的內容像附件或轉發消息一樣查看人類,但它不反映在消息的MIME結構中。就MIME(和JavaMail)而言,它只是消息單一主體文本的一部分。

您可能會發現msgshow.java sample program有幫助,特別是它的「-m」選項,它允許它從文件中讀取MIME消息,解析它並顯示其結構或內容。

+0

正確,現在我明白了。 MimeMultiPart消息僅在電子郵件中有任何附件(零件)時纔有效。 「原始消息」分隔符下面的內容是第一封電子郵件,頂部的電子郵件是第二封電子郵件。我想要將這兩封電子郵件的內容放在不同的對象中。這可能使用JavaMail API嗎? – AbtPst 2015-03-02 21:11:42

+1

不,不是直接。 MimeMessage構造函數期望輸入包含單個消息。在這種情況下,根據郵件上的(缺少)MIME頭文件,它可以。這只是一個消息,其中某人已經完成了等同於複製和粘貼原始消息的答覆。你可以嘗試解析消息的內容,並猜測是否有人這樣做,但是你陷入了一堆並不總是奏效的啓發式方法。這不是真正的「兩條MIME消息」,更像是「一條消息帶有某種看起來像另一條消息的內容」。 – 2015-03-03 00:28:32

0

感謝大家的幫助。我想有沒有簡單的方法來隔離電子郵件線程中的單個電子郵件。我將不得不提出一些模式匹配技術來確定一個電子郵件的結束位置和另一個電子郵件的開始位置。

謝謝