2013-08-24 2 views
1

У меня возникла проблема при разборе электронной почты с mime4j. В электронном письме есть приложение, и я использую MimeStreamParser для его анализа. Парсер не вызывает метод startMultipart вообще. Вместо этого он вызывает метод body только один раз, а BodyDescriptor - «text/plain».парсинг электронной почты с mime4j

Я не знаю корень этой проблемы, формат электронной почты или мою программу?

Вот моя тестовая программа:

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStream; 

import org.apache.james.mime4j.*; 
import org.apache.james.mime4j.dom.BinaryBody; 
import org.apache.james.mime4j.dom.Body; 
import org.apache.james.mime4j.dom.Entity; 
import org.apache.james.mime4j.dom.Header; 
import org.apache.james.mime4j.dom.Message; 
import org.apache.james.mime4j.dom.MessageBuilder; 
import org.apache.james.mime4j.dom.Multipart; 
import org.apache.james.mime4j.dom.TextBody; 
import org.apache.james.mime4j.dom.address.Mailbox; 
import org.apache.james.mime4j.dom.address.MailboxList; 
import org.apache.james.mime4j.dom.field.AddressListField; 
import org.apache.james.mime4j.dom.field.ContentTypeField; 
import org.apache.james.mime4j.dom.field.DateTimeField; 
import org.apache.james.mime4j.dom.field.UnstructuredField; 
import org.apache.james.mime4j.field.address.AddressFormatter; 
import org.apache.james.mime4j.message.BodyPart; 
import org.apache.james.mime4j.message.MessageImpl; 
import org.apache.james.mime4j.message.DefaultMessageBuilder; 
import org.apache.james.mime4j.message.SimpleContentHandler; 
import org.apache.james.mime4j.parser.ContentHandler; 
import org.apache.james.mime4j.parser.MimeStreamParser; 
import org.apache.james.mime4j.stream.BodyDescriptor; 
import org.apache.james.mime4j.stream.Field; 
import org.apache.james.mime4j.stream.MimeConfig; 

public class TestClass extends SimpleContentHandler{ 

    public static void main(String[] args) throws MimeException, IOException { 
     ContentHandler handler = new TestClass(); 
      MimeConfig config = new MimeConfig(); 
      MimeStreamParser parser = new MimeStreamParser(config); 
      parser.setContentHandler(handler); 
      InputStream instream = new FileInputStream("mail/testuser1"); 
      try { 
       parser.parse(instream); 
      } finally { 
       instream.close(); 
      } 
    } 

    @Override 
    public void headers(Header arg0) { 
     // TODO Auto-generated method stub 
     System.out.println("headers args: "+arg0); 
    } 

    @Override 
    public void body(BodyDescriptor bd, InputStream is) { 
     // TODO Auto-generated method stub 
     System.out.println("body descriptor: "+bd); 
    } 

    public void startMessage(){ 

     System.out.println("startMessage"); 
    } 


    public void endMessage(){ 

     System.out.println("endMessage"); 
    } 


    public void startBodyPart(){ 

     System.out.println("startBodyPart"); 
    } 


    public void endBodyPart() { 

     System.out.println("endBodyPart"); 
    } 





    public void preamble(InputStream is){ 

     System.out.println("preamble"); 
    } 


    public void epilogue(InputStream is) { 

     System.out.println("epilogue"); 
    } 


    public void startMultipart(BodyDescriptor bd){ 

     System.out.println("startMultipart"); 
    } 


    public void endMultipart() { 

     System.out.println("endMultipart"); 
    } 


    public void raw(InputStream is) { 

     System.out.println("raw"); 
    } 


} 

Вот часть моего почтового файла:

From MAILER_DAEMON Wed Aug 21 19:24:53 2013 
Date: Wed, 21 Aug 2013 19:24:53 +0800 
From: Mail System Internal Data <[email protected]> 
Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA 
Message-ID: <[email protected]> 
X-IMAP: 1377072167 0000000003 
Status: RO 

This text is part of the internal format of your mail folder, and is not 
a real message. It is created automatically by the mail system software. 
If deleted, important folder data will be lost, and it will be re-created 
with the data reset to initial values. 

From [email protected] Sat Aug 24 10:53:42 2013 
Return-Path: <[email protected]> 
X-Original-To: [email protected] 
Delivered-To: [email protected] 
Received: from shupc (unknown [192.168.75.130]) 
by mail.abc.com (Postfix) with SMTP id C0F5B1EFBC3 
for <[email protected]>; Sat, 24 Aug 2013 10:53:42 +0800 (CST) 
Message-ID: <[email protected]> 
From: "john" <[email protected]> 
To: "smith" <[email protected]> 
Subject: aaa 
Date: Sat, 24 Aug 2013 10:53:42 +0800 
MIME-Version: 1.0 
Content-Type: multipart/mixed; 
boundary="----=_NextPart_000_000B_01CEA0B8.32903020" 
X-Priority: 3 
X-MSMail-Priority: Normal 
X-Mailer: Microsoft Outlook Express 6.00.2900.5512 
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.5512 
X-UID: 3             
Status: O 
Content-Length: 386430 

This is a multi-part message in MIME format. 

------=_NextPart_000_000B_01CEA0B8.32903020 
Content-Type: multipart/alternative; 
boundary="----=_NextPart_001_000C_01CEA0B8.32903020" 


------=_NextPart_001_000C_01CEA0B8.32903020 
Content-Type: text/plain; 
charset="gb2312" 
Content-Transfer-Encoding: base64 

dGVzdCBhYSBiYiBjYw== 

------=_NextPart_001_000C_01CEA0B8.32903020 
Content-Type: text/html; 
    charset="gb2312" 
Content-Transfer-Encoding: base64 

PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwv 
L0VOIj4NCjxIVE1MPjxIRUFEPg0KPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVu 
dD0idGV4dC9odG1sOyBjaGFyc2V0PWdiMjMxMiI+DQo8TUVUQSBjb250ZW50PSJNU0hUTUwgNi4w 
MC4yOTAwLjU1MTIiIG5hbWU9R0VORVJBVE9SPg0KPFNUWUxFPjwvU1RZTEU+DQo8L0hFQUQ+DQo8 
Qk9EWSBiZ0NvbG9yPSNmZmZmZmY+DQo8RElWPjxGT05UIHNpemU9Mj50ZXN0IGFhIGJiIGNjPC9G 
T05UPjwvRElWPjwvQk9EWT48L0hUTUw+DQo= 

------=_NextPart_001_000C_01CEA0B8.32903020-- 

------=_NextPart_000_000B_01CEA0B8.32903020 
Content-Type: application/octet-stream; 
    name="10112716229607.doc" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; 
    filename="10112716229607.doc" 

0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAAFAAAAKAIAAAAAAAAA 
EAAAKgIAAAEAAAD+////AAAAACMCAAAkAgAAJQIAACYCAAAnAgAA//////////////////////// 
//////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////// 
///////////////////////////////////////////////////////////////////////////s 
pcEAcWAJBAAA8FK/AAAAAAAAEAAAAAAABgAArJ0CAA4AYmpianFQcVAAAAAAAAAAAAAAAAAAAAAA 
AAAECBYAOBIDABM6AQATOgEA1gwBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA 
AAAAAAD//w8AAAAAAAAAAAD//w 

ответ

1

Проблема с образца электронной почты, который не MULTIPART. Он содержит в виде встроенного текста многостраничную электронную почту.

Удалите первые заголовки («ОТ MAILER»), а затем убедитесь, что все строки, следующие после Content-Type, имеют отступы (например, кодировку и границу) по крайней мере одним символом пробела, как того требует спецификация (RFC822 или более поздняя версия) или удалить строку. Смотрите пример:

Изменение от:

Content-Type: multipart/mixed; 
boundary="----=_NextPart_000_000B_01CEA0B8.32903020" 

либо:

Content-Type: multipart/mixed; 
    boundary="----=_NextPart_000_000B_01CEA0B8.32903020" 

или:

Content-Type: multipart/mixed; boundary="----=_NextPart_000_000B_01CEA0B8.32903020" 

В качестве альтернативы, попробуйте другое сообщение.

-1

Используйте следующие библиотеки на основе mime4j: email-mime-parser

Предоставленный образец кода Заботится почтовый разборе и в результате «электронная почта» объект обеспечивает удобный метод для решения вашей проблемы:

ContentHandler contentHandler = new CustomContentHandler(); 

MimeConfig mime4jParserConfig = new MimeConfig(); 
BodyDescriptorBuilder bodyDescriptorBuilder = new DefaultBodyDescriptorBuilder(); 
MimeStreamParser mime4jParser = new MimeStreamParser(mime4jParserConfig,DecodeMonitor.SILENT,bodyDescriptorBuilder); 
mime4jParser.setContentDecoding(true); 
mime4jParser.setContentHandler(contentHandler); 


InputStream mailIn = 'Provide email mime stream here'; 
mime4jParser.parse(mailIn); 

Email email = ((CustomContentHandler) contentHandler).getEmail(); 
+1

Хотя это теоретически может ответить на вопрос, [было бы желательно] (// meta.stackoverflow.com/q/8259) включить сюда основные части ответа и предоставить ссылку для справки. –