繁体   English   中英

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,因为这里有两个消息。 有趣的是,如果我尝试获取标题和内容,则会获得第二条消息的所有内容!

另外,如果我使用

MimeMessage message = new MimeMessage(s, is);

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

谢谢

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

我不知道为什么要从相同的文件数据构造MimeMultipart; 那完全是不必要的,也是错误的。

请注意,您的示例消息没有Content-Type头,因此JavaMail将假定它只是具有文本/纯MIME类型的单部分消息,这似乎就是事实。 “原始邮件”分隔符下方的内容看起来像是附件或转发的邮件,但对于邮件来说,它并没有反映在邮件的MIME结构中。 就MIME(和JavaMail)而言,它只是消息单一正文文本的一部分。

您可能会发现msgshow.java示例程序很有用,尤其是其“ -m”选项,该选项使它可以从文件中读取MIME消息,进行解析并显示其结构或内容。

感谢大家的有用评论。 我想没有简单的方法可以将单个电子邮件与电子邮件线程隔离。 我将不得不想出一些模式匹配技术来弄清楚一封电子邮件的结尾和另一封电子邮件的开始。

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM