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

时间:2015-03-02 19:48:52

标签: java email javamail

我有一个需要解析的电子邮件主题。我正在使用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,因为这里有两条消息。有趣的是,如果我尝试获取标题和内容,我会收到第二条消息的所有内容!。

另外,如果我使用

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

然后尝试迭代标题和内容,我得到第一条消息中的所有内容!任何想法如何解决这个问题?

由于

2 个答案:

答案 0 :(得分:2)

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

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

请注意,您拥有的示例消息没有Content-Type标头,因此JavaMail将假设它只是具有text / plain MIME类型的单个部分消息,这似乎就是它的样子。 &#34;原始消息&#34;以下的内容分隔符向人类看起来像附件或转发的消息,但它没有反映在消息的MIME结构中。就MIME(和JavaMail)而言,它只是消息单体文本的一部分。

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

答案 1 :(得分:0)

感谢大家的有益评论。我想没有简单的方法可以从电子邮件线程中隔离单个电子邮件。我将不得不想出一些模式匹配技术来确定一封电子邮件的结束和另一封电子邮件的开始。

由于