it-swarm.com.de

So senden Sie HTML-E-Mails von Java an Outlook

Ich versuche, eine E-Mail im HTML-Format mit JavaMail zu senden, aber in Outlook wird sie immer nur als Text-E-Mail angezeigt.

Hier ist mein Code:

try 
{
    Properties props = System.getProperties();
    props.put("mail.smtp.Host", mailserver);
    props.put("mail.smtp.from", fromEmail);
    props.put("mail.smtp.auth", authentication);
    props.put("mail.smtp.port", port);
    Session session = Session.getDefaultInstance(props, null);      

    // -- Create a new message --
    MimeMessage message = new MimeMessage(session);

    // -- Set the FROM and TO fields --
    message.setFrom(new InternetAddress(fromEmail, displayName));
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to, false));

    MimeMultipart content = new MimeMultipart();
    MimeBodyPart text = new MimeBodyPart();
    MimeBodyPart html = new MimeBodyPart();

    text.setText(textBody);
    text.setHeader("MIME-Version" , "1.0" );
    text.setHeader("Content-Type" , text.getContentType() );

    html.setContent(htmlBody, "text/html");
    html.setHeader("MIME-Version" , "1.0" );
    html.setHeader("Content-Type" , html.getContentType() );

    content.addBodyPart(text);
    content.addBodyPart(html);

    message.setContent( content );
    message.setHeader("MIME-Version" , "1.0" );
    message.setHeader("Content-Type" , content.getContentType() );
    message.setHeader("X-Mailer", "My own custom mailer");

    // -- Set the subject --
    message.setSubject(subject);

    // -- Set some other header information --
    message.setSentDate(new Date());

    // INFO: only SMTP protocol is supported for now...
    Transport transport = session.getTransport("smtp");
    transport.connect(mailserver, username, password);
    message.saveChanges();

    // -- Send the message --
    transport.sendMessage(message, message.getAllRecipients());
    transport.close();

    return true;

} catch (Exception e) {
    LOGGER.error(e.getMessage(), e);
    throw e;
}       

Irgendwelche Ideen, warum die HTML-Version der E-Mail nicht in Outlook angezeigt wird?

18

Nach vielen Nachforschungen konnte ich einige bedeutende Fortschritte erzielen.

Erstens empfehle ich, anstatt JavaMail direkt zu verwenden, die Jakarta Commons Email Bibliothek zu verwenden. Dies vereinfacht das Thema sehr!

Der Code lautet jetzt:

HtmlEmail email = new HtmlEmail();

email.setHostName(mailserver);
email.setAuthentication(username, password);
email.setSmtpPort(port);
email.setFrom(fromEmail);
email.addTo(to);
email.setSubject(subject);

email.setTextMsg(textBody);
email.setHtmlMsg(htmlBody);

email.setDebug(true);

email.send();

Sprechen Sie über einfach.

Es gibt jedoch noch ein Problem. Die HTML-Version der E-Mail funktioniert hervorragend in Google Mail, Hotmail usw. Sie wird jedoch in Outlook nicht korrekt angezeigt. Es will immer die Textversion anzeigen und ich weiß nicht warum. Ich vermute, es ist eine Einstellung in Outlook, aber ich kann es nicht finden ...

16

Zusätzlich zum Entfernen des html.setHeader("Content-Type", html.getContentType())-Aufrufs, wie bereits vorgeschlagen, würde ich die Zeile ersetzen:

MimeMultipart content = new MimeMultipart();

…mit:

MimeMultipart content = new MimeMultiPart("alternative");

… Und die Linie entfernen:

message.setHeader("Content-Type" , content.getContentType() );

Der standardmäßige MimeMultiPart-Konstruktor kann Probleme mit einem Inhaltstyp "mehrteilig/gemischt" verursachen.

Bei der Verwendung von Multipart/Alternative werden die Alternativen nach der Treue zum Original sortiert, wobei die beste Wiedergabe zuletzt erfolgt. Clients bieten Benutzern jedoch normalerweise die Möglichkeit, einfachen Text anzuzeigen, auch wenn HTML vorhanden ist. Sind Sie sicher, dass diese Option in Outlook nicht aktiviert ist? Wie behandeln andere Benutzeragenten wie Thunderbird oder GMail Ihre Nachrichten?

Stellen Sie außerdem sicher, dass der HTML-Code korrekt formatiert ist. Ich würde den HTML-Inhalt mit dem W3-Validierungsdienst validieren und ihn möglicherweise in einer Datei speichern und ihn auch mit verschiedenen Versionen von IE anzeigen. Möglicherweise liegt dort ein Fehler vor, der dazu führt, dass Outlook auf einfachen Text zurückgreift.

5
erickson
html.setContent(htmlBody, "text/html");
html.setHeader("MIME-Version" , "1.0" );
html.setHeader("Content-Type" , html.getContentType() );

setContent und setHeader("Content-Type", String) machen dasselbe - gibt html.getContentType() möglicherweise etwas anderes als text/html zurück?

Das Erweitern basiert auf dem Kommentar und der Antwort von @PhilLho & @ erickson (meine Güte, ich muss langsam tippen). Verwenden Sie:

MimeMultipart content = new MimeMultipart("alternative")
3
Ken Gentle

Ändern Sie dies in:

message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=\"iso-8859-1\"");

Das Inhaltszeichen muss eingestellt werden, ich verstehe nicht, warum der Inhalt selbst. Sollte eher sein:

message.setContent(sBuffer.toString(), "text/html;charset=iso-8859-1");
3
user225486

Ich habe folgenden Code benutzt:

mimeBodyPart1.setDataHandler(new DataHandler(new ByteArrayDataSource(messageBody, "text/html; charset=utf-8")));
multiPart.addBodyPart(mimeBodyPart1);
message.setContent(multiPart, "text/html; charset=utf-8");

Jetzt wird Outlook im Format html angezeigt.

3
AVA

Sie sollten sich die Quelle der empfangenen Nachricht ansehen: Ist der Inhaltstyp der Nachricht mehrteilig/alternativ?

1
PhiLho
message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=iso-8859-1");

Sollte Ihr Problem lösen (entfernte \" Zeichen).

1
Kuldeep

workaroung-Lösung gelöst Outlook 2003: Diese Nachricht verwendet einen Zeichensatz, der vom Internetdienst nicht unterstützt wird. wird nicht richtig angezeigt.

Es könnte an der Kodierung liegen. Die meisten HTML-Seiten verwenden ISO-8859-1, nicht CP-1252

Ihr Code lautet beispielsweise:

message.setContent(sBuffer.toString(), "text/html");

Ändern Sie dies in:

message.setContent(new String(sBuffer.toString().getBytes(), "iso-8859-1"), "text/html; charset=\"iso-8859-1\"");

Dies löst eine neue aktivierte Ausnahme aus: Java.io.UnsupportedEncodingException. Sie müssen also deklarieren, dass sie ausgelöst werden soll, oder sie abfangen. iso-8859-1 wird unterstützt, daher wird die Ausnahme niemals geworfen, es sei denn, etwas in Ihrer rt.jar ist beschädigt.

Grüße, Javeed [email protected]

0