2017-05-31 4 views
1

J'utilise JavaMail API pour analyser les en-têtes des e-mails. Dans un scénario normal avec une taille de fichier de courrier électronique en Ko, il ne consommera pas beaucoup de mémoire dans la JVM. Mais, dans le cas d'un gros fichier e-mail (35 Mo +) avec pièces jointes, il utilise un espace énorme dans la JVM.Modifier les en-têtes des e-mails sans charger le contenu des e-mails en mémoire

Existe-t-il un moyen possible de modifier l'en-tête de l'e-mail sans charger le contenu de l'e-mail dans momory?

que je fais quelque chose comme ceci:

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

S'il vous plaît nous montrer ce que vous avez fait w.r.t. code. –

+0

@KrishnaKuntala, s'il vous plaît trouver question éditée. – Jay

Répondre

0

Mails comme EML Les fichiers sont stockés sous forme de fichiers texte. Un EML typique ressemble à ceci:

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 

vous pouvez donc lire le fichier jusqu'à ce que deux nouvelles lignes trouvées.

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(); 
     } 

Vous trouverez la spécification ici

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

+0

Merci pour l'aide. Mais mon exigence est légèrement différente. Je dois passer ** tous les en-têtes ** et ** les en-têtes nouveaux/modifiés ** pour un traitement ultérieur en format chaîne. – Jay

+0

Je n'ai pas vu de différence. C'est un fichier ou une chaîne à gérer. Vous pouvez écrire le fichier modifié avec BufferedWriter dans un nouveau fichier ou vous pouvez modifier la chaîne avec les en-têtes en mémoire. – Matthias