2017-05-31 61 views
1

我正在使用JavaMail API分析电子邮件标题。 在电子邮件文件大小以KB为单位的正常情况下,它不会在JVM中占用太多内存。但是,如果带有附件的大型电子邮件文件(35MB +),则会在JVM中占用大量空间。修改电子邮件标题而不加载内存中的电子邮件内容

是否有任何可能的方式来修改电子邮件标题,而无需在momory中加载电子邮件内容?

我做这样的事情:

Properties props = System.getProperties(); 
Session mailSession = Session.getDefaultInstance(props, null); 
InputStream source = new FileInputStream(emlFile); 
MimeMessage message = new MimeMessage(mailSession, source); 

message.addHeader("X-Header","HeaderValue1"); 
message.addHeader("Y-Header", "HeaderValue2"); 
message.saveChanges(); 
Enumeration headerschange = message.getAllHeaders(); 

StringBuilder headerString = new StringBuilder(); 
while (headerschange.hasMoreElements()) { 
     Header h = (Header) headerschange.nextElement(); 
     headerString = headerString.append(h.getName() + ": " + h.getValue() + "\n"); 
} 
System.out.println("headerString::::::::::::::::::::"+headerString.toString()); 
+1

请告诉我们你做了什么w.r.t.码。 –

+0

@KrishnaKuntala,请找到编辑的问题。 – Jay

回答

0

邮件作为EML文件存储为文本文件。 一个典型的EML看起来是这样的:

X-Mozilla-Status: 0001 
X-Mozilla-Status2: 00000000 
Received: from tomts25-srv.bellnexxia.net 
     (tomts25.bellnexxia.net [209.226.175.188]) 
    by tactika.com (8.9.3/8.9.3) with ESMTP id NAA07621 
    for <[email protected]>; Sun, 1 Feb 2004 13:25:33 -0500 (EST) 
Date: Sun, 01 Feb 2004 13:31:40 -0500 
From: real gagnon <[email protected]> 
Reply-To: [email protected] 
User-Agent: Mozilla/5.0 
    (Windows; U; Windows NT 5.1; en-US; rv:1.4) 
    Gecko/20030624 Netscape/7.1 (ax) 
X-Accept-Language: en-us, en 
MIME-Version: 1.0 
To: [email protected] 
Subject: Example for HowTo 
Content-Type: text/plain; charset=us-ascii; format=flowed 
Content-Transfer-Encoding: 7bit 
X-UIDL: oP#!!c]^!!1;[email protected]"! 


This is an example 

所以,你可以读文件,直到发现了两条新线。

try { 
      BufferedReader reader = new BufferedReader(new FileReader(new File("C:\\test\\test.eml"))); 

      StringBuilder headerString = new StringBuilder(); 
      String line; 
      int newLines = 0; 
      while((line = reader.readLine()) != null) { 
       if(line.equals("\n")) { 
        newLines++; 
        if (newLines == 2) { 
         //Body starts here 
         break; 
        } 
       } else { 
        headerString.append(line).append("\n"); 
       } 
      } 
      System.out.println("headerString::::::::::::::::::::"+headerString.toString()); 
      reader.close(); 
     } catch(IOException e) { 
      e.printStackTrace(); 
     } 

您在这里找到确切的规格

http://www.ietf.org/rfc/rfc0822.txt

+0

感谢您的帮助。但我的要求稍有不同。我需要将**所有标题**和**新/修改标题**一起传递给字符串格式的进一步处理。 – Jay

+0

我没有看到任何不同。这是一个文件或一个字符串来处理。您可以使用BufferedWriter将修改后的文件写入新文件,也可以使用内存中的标头修改字符串。 – Matthias