it-swarm.com.de

utf 8 charset funktioniert nicht mit javax mail

Ich habe Javax Mail API zum Versenden von E-Mails verwendet. Ich verwende ein Kontaktformular, um die Eingabe zu senden, die an eine bestimmte E-Mail gesendet werden muss.

Die E-Mail wird ohne Probleme gesendet, obwohl ich ein dänischer Typ bin. Daher brauche ich drei dänische Zeichen, die im Betreff und im E-Mail-Text 'æ', 'ø' und 'å' stehen.

Ich habe also gesehen, dass ich UTF-8-Zeichenkodierung verwenden kann, um diese Zeichen bereitzustellen, aber wenn meine E-Mail gesendet wird, sehe ich nur einige sonderbare Buchstaben - "ã¦", "ã¸" und "ã ¥" - anstelle der dänische Buchstaben - "æ", "ø" und "å".

Meine Methode zum Senden der E-Mail sieht folgendermaßen aus

public void sendEmail(String name, String fromEmail, String subject, String message) throws AddressException, MessagingException, UnsupportedEncodingException, SendFailedException
{
    //Set Mail properties
    Properties props = System.getProperties();
    props.setProperty("mail.smtp.starttls.enable", "true");
    props.setProperty("mail.smtp.Host", "smtp.gmail.com");
    props.setProperty("mail.smtp.socketFactory.port", "465");
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.setProperty("mail.smtp.auth", "true");
    props.setProperty("mail.smtp.port", "465");
    Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("my_username", "my_password");
        }
    });

    //Create the email with variable input
    MimeMessage mimeMessage = new MimeMessage(session);
    mimeMessage.setHeader("Content-Type", "text/plain; charset=UTF-8");
    mimeMessage.setFrom(new InternetAddress(fromEmail, name));
    mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("my_email"));
    mimeMessage.setSubject(subject, "utf-8");
    mimeMessage.setContent(message, "text/plain");

    //Send the email
    Transport.send(mimeMessage);
}

Bitte helfen Sie mir herauszufinden, wie ich diesen "Fehler" korrigieren kann.

41
Rohwedder

Für alle E-Mails

Es gibt einige Systemeigenschaften im Zusammenhang mit Mailing , die Ihren Code wahrscheinlich vereinfachen können. Ich spreche eigentlich von dieser Eigenschaft: "mail.mime.charset".

Die Systemeigenschaft mail.mime.charset kann verwendet werden zur Angabe des Standard-MIME-Zeichensatzes zur Verwendung für kodierte Wörter und Textteile, die sonst keinen Zeichensatz angeben. Normalerweise wird der Standard-MIME-Zeichensatz vom Standard-Java-Zeichensatz abgeleitet, wie in der file.encoding System-Eigenschaft angegeben. Die meisten Anwendungen müssen den MIME-Zeichensatz nicht explizit festlegen. Wenn der Standard-MIME-Zeichensatz, der für E-Mail-Nachrichten verwendet wird, sich von dem Zeichensatz unterscheidet, der für auf dem System gespeicherte Dateien verwendet wird, sollte diese Eigenschaft festgelegt werden. 

Wie Sie oben lesen können, gibt es standardmäßig keinen Wert für mail.mime.charset und die Dateikodierung (file.encoding-Eigenschaft) wird verwendet.

Für eine bestimmte E-Mail

Wenn Sie jedoch eine bestimmte Codierung für eine bestimmte E-Mail angeben möchten, sollten Sie wahrscheinlich die 2-Parameter setSubject(subject,charset) und setText(text,charset) verwenden.

Wenn dies nicht funktioniert, ist Ihre Eingabe wahrscheinlich bereits beschädigt, bevor sie diesen Punkt erreicht hat. Mit anderen Worten, Sie haben wahrscheinlich die falsche Kodierung verwendet, um Ihre Daten zu erfassen.

Mime-Typen sind kompliziert

Die setContent(content, "UTF-8") (wie andere Quellen behaupten) wird einfach nicht funktionieren. Sehen Sie sich die Signatur dieser Methode an: setContent(Object content, String mimetype). MIME-Typ und Zeichensatz sind zwei völlig verschiedene Dinge. Imho, Sie sollten wirklich eine der setText(...)-Methoden mit einem Zeichensatz-Parameter verwenden. 

Wenn Sie jedoch weiterhin einen Mimetyp zum Festlegen des Zeichensatzes setContent(content,mimetype) verwenden, verwenden Sie das richtige Format. (nicht nur "UTF-8", sondern etwas wie "text/plain; charset=UTF-8"). Noch wichtiger ist jedoch Beachten Sie, dass jeder Mime-Typ seine eigene Art hat, mit Zeichensätzen umzugehen.

  • Wie in RFC-2046 angegeben, ist der Standardzeichensatz für text/plainUS-ASCII, kann jedoch mit einem zusätzlichen Zeichensatzparameter außer Kraft gesetzt werden. 
  • In RFC-6657 wird jedoch klar, dass der Typ text/xml den Zeichensatz anhand des Inhalts der Nachricht bestimmt. Der Zeichensatz-Parameter wird hier einfach ignoriert.
  • In RFC-2854 wird angegeben, dass text/html eigentlich immer einen Zeichensatz angeben sollte. Andernfalls wird ISO-8859-1 (= Latin-1) verwendet.
66
bvdb

Vielleicht solltest du hier auch UTF-8 angeben

mimeMessage.setContent(message, "text/plain; charset=UTF-8");

Sie müssen http://www.coderanch.com/t/274480/Java/java/JavaMail-set-content-utf betrachten.

29
Arsen Alexanyan

Nachdem ich viel Zeit mit Debuggen verbracht und nach einem Hinweis im Internet gesucht habe, habe ich eine Lösung für mein Problem gefunden.

Es scheint, als würde meine Anwendung die Zeichen nicht mit UTF-8-Kodierung verschlüsseln, wenn ich Daten über eine Webanforderung sendete. Dies bedeutet, dass die Daten, die von meinem Kontaktformular gesendet wurden und die Zeichen æ, ø und å enthielten, durch die Zeichencodierung nicht korrekt verarbeitet werden konnten.

Die Lösung schien einen Character Encoding Filter in meinem Deployment Descriptor einzurichten, der alle eingehenden Anforderungen aus dem Web mit der Zeichencodierung UTF-8 codieren würde.

private void registerCharacterEncodingFilter(ServletContext servletContext) {
    CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
    encodingFilter.setEncoding("UTF-8");
    encodingFilter.setForceEncoding(true);
    FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("characterEncodingFilter", encodingFilter);
    characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
}

Dieser Filter legt die Kodierung auf UTF-8 fest und erzwingt die Kodierung für alle Anforderungen, die unter der URL '/ *' eingehen.

6
Rohwedder

Es ist einfach, Ihr Projekt mit dem Parameter -Dfile.encoding = UTF8! Ex: Java -Dfile.encoding = UTF-8 -jar MyProject.jar auszuführen

0
user2582242