2014-11-29 14 views
5

Ho scaricato mime4j 0.8.0 snapshot da subversion e lo ho creato con maven. I relativi vasi generati possono essere trovati here.Mime4j: DefaultMessageBuilder non riesce ad analizzare il contenuto mbox

Ora provo a analizzare a toy mbox file dal test mime4j.

Io uso questo sample code. Brevemente:

final File mbox = new File("c:\\mbox.rlug"); 
int count = 0; 
for (CharBufferWrapper message : MboxIterator.fromFile(mbox).charset(ENCODER.charset()).build()) { 
    System.out.println(messageSummary(message.asInputStream(ENCODER.charset()))); 
    count++; 
} 
System.out.println("Found " + count + " messages"); 

+

private static String messageSummary(InputStream messageBytes) throws IOException, MimeException { 
    MessageBuilder builder = new DefaultMessageBuilder(); 
    Message message = builder.parseMessage(messageBytes); 
    return String.format("\nMessage %s \n" + 
      "Sent by:\t%s\n" + 
      "To:\t%s\n", 
      message.getSubject(), 
      message.getSender(), 
      message.getTo()); 
} 

L'uscita è:

Messaggio nullo Inviato da: null A: null

Messaggio nullo Trasmesso: null A: null

Messaggio null Inviato da: null A: null

Messaggio nullo Inviato da: NULL per: null

Messaggio nullo Inviato da: null A: nulli

Trovato 5 messaggi

ci sono infatti 5 messaggi, ma perché sono tutti i campi nullo?

+0

Potrebbe basta stampare il messaggio grezzo nel circuito, al fine di vedere se è correttamente costruito? 'System.out.println (messaggio);' – ToYonos

risposta

2

ho trovato il problema.

DefaultMessageBuilder non riesce ad analizzare i file mbox che hanno il separatore di riga \r\n. Quando li si sostituisce con il separatore di riga UNIX \n, l'analisi funziona.

Questo è un problema critico, poiché i file mbox scaricati da Gmail utilizzano \r\n.

+0

Si potrebbe voler postare una richiesta di modifica per il progetto di apache james. La mia esperienza con la comunità è buona. –

1

Ho scaricato i file jar, il codice di esempio che hai indicato e il file mbox di esempio che hai indicato, compilato l'esempio (senza modifiche) e l'ho eseguito sul file mbox di esempio.

Ha funzionato come previsto (i campi contengono i dati previsti, non i valori null). Questo è stato su un Mac con Java 1.6_0_65, e anche con 1.8.0_11

uscita è stato il seguente:

$ java -cp:. Apache-mime4j-core-0.8.0-SNAPSHOT. jar: apache-mime4j-dom-0.8.0-SNAPSHOT.jar: apache-mime4j-mbox-iterator-0.8.0-SNAPSHOT.jar IterateOverMbox mbox.rlug.txt

Messaggio Din windows ma pot, din LINUX NU ma pot conecta (la ZAPP) Inviato da: [email protected] A: [[email protected]]

Messaggio Re: floppy di avvio RH 8.0 Inviato da: [email protected] A: [[email protected]]

Messaggio Qmail mysql utenti virtuali + ssl + autenticazione SMTP + pop3 inviate da: [email protected] A: [rlug @ lug.ro]

messaggio Re: Din finestre ma pentola, din LINUX NU ma pot Conecta (la ZAPP) Inviato da: [email protected] A: [[email protected]]

Messaggio LSTP risolto. Inviato da: [email protected] A: [rlug @ lug.ro]

Trovato 5 messaggi Fatto in: 108 Milis

+0

Non funziona su due macchine Windows. Proverò anche l'altro sistema operativo – zvisofer

+0

provato con java 1.6.0, inutilmente .. – zvisofer

3

in base alla risposta @zvisofer, ho trovato il guilty piece of code in BufferedLineReaderInputStream:

@Override 
public int readLine(final ByteArrayBuffer dst) 
     throws MaxLineLimitException, IOException { 
    if (dst == null) { 
     throw new IllegalArgumentException("Buffer may not be null"); 
    } 
    if (!readAllowed()) return -1; 

    int total = 0; 
    boolean found = false; 
    int bytesRead = 0; 
    while (!found) { 
     if (!hasBufferedData()) { 
      bytesRead = fillBuffer(); 
      if (bytesRead == -1) { 
       break; 
      } 
     } 
     int i = indexOf((byte)'\n'); 
     int chunk; 
     if (i != -1) { 
      found = true; 
      chunk = i + 1 - pos(); 
     } else { 
      chunk = length(); 
     } 
     if (chunk > 0) { 
      dst.append(buf(), pos(), chunk); 
      skip(chunk); 
      total += chunk; 
     } 
     if (this.maxLineLen > 0 && dst.length() >= this.maxLineLen) { 
      throw new MaxLineLimitException("Maximum line length limit exceeded"); 
     } 
    } 
    if (total == 0 && bytesRead == -1) { 
     return -1; 
    } else { 
     return total; 
    } 
} 

La cosa migliore da fare sarebbe quella di segnalare il bug, ma qui è una correzione, un po 'sporco, ma che sta funzionando benissimo

creare la classe org.apache.james.mime4j.io.BufferedLineReaderInputStream nel progetto

Sostituire il metodo public int readLine(final ByteArrayBuffer dst) da questo:

@Override 
public int readLine(final ByteArrayBuffer dst) 
     throws MaxLineLimitException, IOException { 
    if (dst == null) { 
     throw new IllegalArgumentException("Buffer may not be null"); 
    } 
    if (!readAllowed()) return -1; 

    int total = 0; 
    boolean found = false; 
    int bytesRead = 0; 
    while (!found) { 
     if (!hasBufferedData()) { 
      bytesRead = fillBuffer(); 
      if (bytesRead == -1) { 
       break; 
      } 
     } 

     int chunk; 
     int i = indexOf((byte)'\r'); 
     if (i != -1) { 
      found = true; 
      chunk = i + 2 - pos(); 
     } else { 
      i = indexOf((byte)'\n'); 
      if (i != -1) { 
       found = true; 
       chunk = i + 1 - pos(); 
      } else { 
       chunk = length(); 
      } 
     } 
     if (chunk > 0) { 
      dst.append(buf(), pos(), chunk); 
      skip(chunk); 
      total += chunk; 
     } 
     if (this.maxLineLen > 0 && dst.length() >= this.maxLineLen) { 
      throw new MaxLineLimitException("Maximum line length limit exceeded"); 
     } 
    } 
    if (total == 0 && bytesRead == -1) { 
     return -1; 
    } else { 
     return total; 
    } 
} 

godere sia UNIX e DOS i file :)

+0

Questo codice causa il fallimento di 5 test di compilazione (uno di questi è un errore). Immagino che fallirà se hai '\ r' non seguito da '\ n' – zvisofer

+0

Sì, la mia correzione può essere migliorata credo, gestendo il caso quando \ r è solo – ToYonos

+0

usando: 'byte [] microsoftSucks = { (byte) '\ r', (byte) '\ n'}; ' ' int i = indexOf (microsoftSucks); ' Risolve 3 test ma due falliscono ancora – zvisofer

Problemi correlati