2017-12-17 3 views
2

Ich verwende die Java-Mail-API, um die Bounce-Back-E-Mails von Amazon SES in meiner Google Mail-ID zu lesen.Wie lese ich E-Mail-Details mit der Java-Mail-API zurück?

So erhalte ich eine Bounce-E-Mail von Amazon SES.

<email content start> 

An error occurred while trying to deliver the mail to the following recipients: 
[email protected] 
Action: failed 
Final-Recipient: rfc822; [email protected] 
Diagnostic-Code: smtp; 550 5.1.1 user unknown 
Status: 5.1.1 



---------- Forwarded message ---------- 
From: [email protected] 
To: [email protected] 
Cc: 
Bcc: 
Date: Sun, 17 Dec 2017 15:27:30 +0000 
Subject: [email protected] 
[email protected] 

<email content end> 

Meine Frage verwendet Java-E-Mail-API. Ich bin in der Lage, den Inhalt zu lesen, zu:

An error occurred while trying to deliver the mail to the following recipients: 
[email protected] 

Aber ich bin nicht in der Lage den folgenden Inhalt mit Hilfe von Java-E-Mail-api

Action: failed 
Final-Recipient: rfc822; [email protected] 
Diagnostic-Code: smtp; 550 5.1.1 user unknown 
Status: 5.1.1 

lesen Wie kann ich den oben genannten Inhalt in der Lese Email?

+0

Bounce-Nachrichten werden in [RFC 6533] (https://tools.ietf.org/html/rfc6533) definiert sind, aber nicht alle Server folgen alle Regeln. Sehen Sie sich die MIME-Struktur der Bounce-Nachricht an und versuchen Sie, den "Anhang" zu finden, der die tatsächliche Delivery Status Notfication (DSN) darstellt. Seien Sie darauf vorbereitet, dies für verschiedene Arten von Mail-Servern und Konfigurationen zu tun. – Robert

+0

Siehe auch das [com.sun.mail.dsn-Paket] (https://javaee.github.io/javamail/docs/api/com/sun/mail/dsn/package-summary.html). –

Antwort

1

Die Diagnosecode-Informationen sind Teil des Nachrichteninhalts und können mit dem folgenden Code gelesen werden.

MimeMessage payload = (MimeMessage) message.getPayload(); 
    Multipart mp = (Multipart) payload.getContent(); 
    for (int i = 0; i < mp.getCount(); i++) { 
         BodyPart bodyPart = mp.getBodyPart(i); 
         StringWriter writer = new StringWriter(); 
         IOUtils.copy(bodyPart.getInputStream(), writer); 
         System.out.println("Content inputstream: " + writer.toString()); 


    } 
0

Die Informationen, die Sie suchen (Aktion Final-Empfänger, Diagnose-Code-Status) in den Header der Nachricht festgelegt sind, können Sie es mit

Bedenkt man, dass msg das Nachrichtenobjekt ist:

... 
    final String[] diagnostics = msg.getHeader("Diagnostic-Code"); 

    for (String dx_code : diagnostics) { 
    System.out.print(dx_code); 
    } 
    ... 

der zweite Wert (im Beispiel diagnostics[1]) den Fehlercode enthalten, der, wenn er anzeigt, 550 ein harter Schlag ist (beispielsweise die E-Mail-Adresse nicht existiert), oder eine weiche Prell 450 (zum Beispiel der Posteingang ist voll)

+0

Hallo Danke für den Vorschlag Ich habe Ihre Lösung versucht, aber es funktioniert nicht. Anstelle des Headers fand ich, dass die Diagnosecode-Information im bodypartinhalt war. –