utf 8 charset ne fonctionne pas avec javax mail

J'ai utilisé L'API Javax Mail, pour envoyer des e-mails. J'utilise un formulaire de contact pour envoyer les données, qui doivent être envoyées à un e-mail spécifique.

l'e-mail est envoyé sans problème, bien que je sois un gars danois, et j'ai donc besoin de Trois Caractères danois qui sont 'æ', 'ø' et 'å', dans le sujet et le texte de l'e-mail.

j'ai donc vu que je peux utiliser L'encodage de caractères UTF-8, pour fournir ces caractères, mais quand mon e-mail est envoyé Je ne vois que quelques lettres étranges - " ã/", " ã " et "ã¥" - au lieu des lettres danoises - "æ", " ø " et "å".

ma méthode pour envoyer l'email ressemble à ceci

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);
}

s'il vous Plaît aidez-moi savoir comment je peux corriger cette "erreur".

36
demandé sur Rohwedder 2013-02-23 22:28:45

4 réponses

Pour tous les e-mails

Il ya un couple de propriétés du système relatives au mailing, qui peut probablement simplifier votre code. Je parle de cette propriété en fait: "mail.mime.charset".

mail.mime.charset la propriété du système peut être utilisée pour spécifier le charset MIME par défaut à utiliser pour les mots codés et les parties de texte qui ne spécifient pas autrement un jeu de caractères. Normalement, le charset MIME par défaut est dérivé de le charset Java par défaut, comme spécifié dans le file.encoding propriété du système. La plupart des applications n'auront pas besoin de définir explicitement le jeu de caractères MIME par défaut. Dans les cas où le charset MIME par défaut à utiliser pour les messages mail est différent du charset utilisé pour les fichiers stockés sur le système, Cette propriété doit être définie.

Comme vous pouvez le lire ci-dessus, par défaut il n'y a pas de valeur pour le mail.mime.charset et l'encodage du fichier (file.encoding propriété) est utilisé.

Pour un e-mail spécifique

cependant, si vous voulez spécifier un encodage spécifique pour un e-mail spécifique, alors vous devriez probablement utiliser le paramètre 2 setSubject(subject,charset) et setText(text,charset) méthodes.

si cela ne fonctionne pas, alors probablement votre entrée est déjà corrompue avant qu'elle n'atteigne ce point. En d'autres termes, vous avez probablement utilisé le mauvais encodage pour collecter vos données.

les types Mime sont compliqués

setContent(content, "UTF-8") (que d'autres sources affirment) sera tout simplement pas travailler. Il suffit de regarder la signature de cette méthode: setContent(Object content, String mimetype). le type Mime et le jeu de caractères sont deux choses totalement différentes. à mon humble avis, vous devriez vraiment être à l'aide de l'un des setText(...) méthodes avec un paramètre charset.

mais si vous persistez à utiliser un mimetype pour définir le charset setContent(content,mimetype), puis utilisez le bon format. (pas juste "UTF-8", mais quelque chose comme "text/plain; charset=UTF-8"). Mais plus important encore, soyez conscient que chaque type mime a sa propre façon de traiter les jeux de caractères.

  • spécifié dans RFC-2046 le jeu de caractères par défaut pour les text/plainUS-ASCII, mais peut être rejeté avec un paramètre charset supplémentaire.
  • Cependant, RFC-6657 indique clairement que le text/xml le type détermine le jeu de caractères en utilisant le contenu du message. le paramètre charset sera simplement ignoré ici.
  • Et RFC-2854 est précisé que text/html devrait vraiment toujours spécifier un jeu de caractères. Mais si vous ne le faites pas, alors il utilisera ISO-8859-1 (=Latin-1).
62
répondu bvdb 2016-10-26 14:32:39

peut-être devriez-vous fournir aussi UTF-8 ici

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

Vous avez à regarder http://www.coderanch.com/t/274480/java/java/JavaMail-set-content-utf

26
répondu Arsen Alexanyan 2013-02-23 18:33:08

après avoir passé beaucoup de temps sur le débogage, et chercher un indice sur internet, j'ai trouvé une solution à mon problème.

il semble que chaque fois que j'envoyais des données via une requête web, mon application n'encodait pas les caractères avec un encodage UTF-8. Cela signifie que les données qui ont été envoyées à partir de mon formulaire de contact, qui contenait des caractères æ, ø et å, ne pouvaient pas être traitées correctement par le codage de caractères.

la solution semblait mettre en place un Caractère Filtre De Codage, dans mon descripteur de déploiement, qui encoderait toutes les requêtes entrantes du web pour être avec le caractère encodant UTF-8.

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, "/*");
}

ce filtre définit L'encodage à UTF-8 et force l'encodage à toutes les requêtes comming à l'url ' /* '.

6
répondu Rohwedder 2013-03-01 20:19:15

C'est facile, exécutez votre projet avec parameter-Dfile.ecoding=UTF-8! ex: java-Dfile.encoding=UTF-8-jar MyProject.jar

0
répondu user2582242 2013-08-15 10:45:44