2017-05-31 65 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