JavaMail:如何阅读电子邮件线程

JavaMail : How to read an email thread

我有一个电子邮件线程需要解析。我正在使用 JavaMail API 来阅读电子邮件的内容。到目前为止,这是我的代码

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:opscron@xxxxx.com] 
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,因为这里有两条消息。有趣的是,如果我尝试获取 headers 和内容,我会获取第二条消息的所有内容!

此外,如果我使用

读取文件
MimeMessage message = new MimeMessage(s, is);

然后尝试遍历 headers 和内容,我在第一条消息中得到了所有内容!有什么解决办法吗?

谢谢

你浪费了很多精力读入文件,将其转换为字符串,然后将其转换回字节,以便 MimeMessage 构造函数可以使用它。只需将文件直接提供给 MimeMessage 构造函数即可。也许使用 javax.mail.util.SharedFileInputStream.

我不知道你为什么要从相同的文件数据构造一个 MimeMultipart;那是完全没有必要和错误的。

请注意,您的示例邮件没有 Content-Type header,因此 JavaMail 将假设它只是一个具有 text/plain MIME 类型的单部分邮件,这似乎是它是什么。 "Original Message" 分隔符下面的内容看起来像附件或转发的邮件,但它不会反映在邮件的 MIME 结构中。就 MIME(和 JavaMail)而言,它只是消息的单个 body 文本的一部分。

您可能会发现 msgshow.java sample program 很有帮助,尤其是它的“-m”选项允许它从文件中读取 MIME 消息、解析它并显示其结构或内容。

感谢大家的宝贵意见。我想没有简单的方法可以将单个电子邮件与电子邮件线程隔离开来。我将不得不想出一些模式匹配技术来找出一封电子邮件的结尾和另一封电子邮件的开头。

谢谢