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".
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 lefile.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/plain
US-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 utiliseraISO-8859-1
(=Latin-1
).
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
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 ' /* '.
C'est facile, exécutez votre projet avec parameter-Dfile.ecoding=UTF-8! ex: java-Dfile.encoding=UTF-8-jar MyProject.jar