【问题标题】:JavaMail : How to read an email threadJavaMail:如何阅读电子邮件线程
【发布时间】:2015-03-02 19:48:51
【问题描述】:

我有一个需要解析的电子邮件线程。我正在使用 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);

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

谢谢

【问题讨论】:

    标签: java email jakarta-mail


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 正确,现在我明白了。仅当电子邮件具有任何附件(部分)时,才会显示 MimeMultiPart 消息。 “原始消息”分隔符下方的内容是第一封电子邮件,顶部的电子邮件是第二封电子邮件。我想在不同的对象中获取这两封电子邮件的内容。使用 JavaMail API 可以吗?
    • 不,不直接。 MimeMessage 构造函数期望输入包含单个消息。在这种情况下,根据消息上的(缺少)MIME 标头,它确实如此。这只是一条消息,其中有人做了相当于复制并粘贴原始消息到其回复底部的操作。您可以尝试解析消息的内容并猜测是否有人这样做,但您会遇到一堆并不总是有效的启发式方法。这并不是真正的“两条 MIME 消息”,它更像是“一条消息,其中包含一些看起来像另一条消息的内容”。
    【解决方案2】:

    感谢大家的帮助。我想没有简单的方法可以将单个电子邮件与电子邮件线程隔离开来。我必须想出一些模式匹配技术来确定一封电子邮件在哪里结束,另一封从哪里开始。

    谢谢

    【讨论】:

      猜你喜欢
      • 2022-08-23
      • 2012-12-28
      • 1970-01-01
      • 2016-02-20
      • 2019-02-23
      • 2015-07-30
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多