web-dev-qa-db-fra.com

API Java Mail - Problèmes d'encodage

J'utilise l'API Java Mail et j'essaie d'envoyer un courrier électronique via SMTP de Gmail. Fonctionnement de mon programme: La classe Java.util.Scanner est utilisée pour obtenir les entrées de l'utilisateur - I ' m demandant à l'utilisateur différents paramètres à utiliser dans la classe d'envoi de courrier; qui fait ce qui suit:

Message mailMessage = new MimeMessage(session);
mailMessage.setFrom(new InternetAddress("[email protected]"));
mailMessage.setRecipients(Message.RecipientType.TO,InternetAddress.parse(mail.getTo()));
mailMessage.setSubject(mail.getSubject());
mailMessage.setText(mail.getMessage());
Transport.send(mailMessage);

Tout fonctionne tant que j'utilise ASCII symboles/caractères. Mais chaque fois que je veux utiliser des caractères "spécifiques à un pays" - comme [õäöü] - je reçois un tas de symboles étranges ...

Techniques que j'ai utilisées jusqu'à présent (qui ne fonctionnent pas pour moi):

setHeader("Content-Type", "text/plain; charset=UTF-8");
setHeader("Content-Encoding","ISO-8859-9");
setContent(message, "text/plain; charset=iso-8859-2");

Remarque: tout est correctement affiché dans un IDE lorsque System.out.println () est exécuté pour afficher le message à envoyer.

EDIT: e.x. lorsque le corps du message envoyé est [õäöü] , il est affiché [ä „”?] dans Gmail.

EDIT: Lorsque mailMessage.setText(MimeUtility.encodeText(mail.getMessage(), "UTF-8", "Q")); est utilisé, la sortie dans Gmail est la suivante: 

"=?UTF-8?Q?=C3=A4=E2=80=9E=E2=80=9D=EF=BF=BD;=0D=0A?="

UN AUTRE ÉDIT: Fait intéressant, quand je le fais: mailMessage.setText(strVar + "õäöü", "ISO-8859-1"); Il ajoute en fait "äöü" dans mon courrier électronique (mais la première partie [strVar] de la chaîne est toujours pleine de? Et de [].).

11
Furlando

Fondamentalement, mon code fonctionne très bien, comme prévu. C'était le cmd, qui ne pouvait pas gérer les lettres non-ASCII. J'ai utilisé un fichier chauve-souris pour accéder à un bocal. Je pense que je vais juste faire une petite interface graphique alors ... Merci à tous d'avoir répondu.

2
Furlando
    MimeMessage message = new MimeMessage(session);
    message.setSubject(subject, "UTF-8");
    message.setText(body, "UTF-8");

Il faut donc définir le codage des caractères pour le corps et le sujet.


Addendum à cause du commentaire de @bartac

Pour la MimeBodyPart correspondante, faites une setHeader("Content-Type", "text/plain; charset=UTF-8").

14
Joop Eggen

Vous devez utiliser setText(String text, String charset) ou setText(String text, String charset, String subtype) pour définir le corps du texte avec un codage spécifique.

MimeUtility.encodeText() n'est pas destiné au corps du texte, mais uniquement au texte encodé dans les en-têtes (et uniquement aux en-têtes définis avec setHeader ou addHeader).

5
Mark Rotteveel

Ce qui suit a fonctionné pour moi:

MimeMessage message = ...
message.setSubject(subject, "UTF-8");
message.setContent(body, "text/plain; charset=UTF-8");

subject et body sont des objets String normaux sans traitement particulier (le code et l'interface utilisateur utilisent UTF-8).

2
Agustí Sánchez

1- Considérez que vous voulez envoyer un email avec cette chaîne dans le corps:

"Olá João!"

2 - Le code étant exécuté sur le serveur GAE, cette chaîne est interprétée avec le codage par défaut ASCII. Pour envoyer cet email avec les caractères accentués corrects, définissez la chaîne comme suit:

String body = "Ol\u00e1 Jo\u00e3o!";

Les caractères spéciaux sont définis manuellement avec ses codes UTF-8. Recherchez les codes dont vous avez besoin dans le tableau http://www.utf8-chartable.de/

3- Convertissez le codage de chaîne en UTF-8. Tous les codes saisis manuellement seront maintenant interprétés correctement: 

Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
String encodedSubject = new String (subject.getBytes("UTF-8"),"UTF-8");
String encodedBody = new String (body.getBytes("UTF-8"),"UTF-8");
message.setSubject(encodedSubject, "UTF-8");
message.setText(encodedBody, "UTF-8");
0
supertreta

Utilisez la méthode encodeText de MimeUtility:

MimeUtility.encodeText(mail_subject, "UTF-8", "B")

(Je ne sais pas ce que signifie "B", restez calme et utilisez-le. En fait, cela peut être "B" ou "Q".)

0
Mark Szabo
JavaMailSenderImpl emailSender = new JavaMailSenderImpl();
mailSender.setHost("...");

MimeMessage message = emailSender.createMimeMessage();
message.setSubject("...", "UTF-8");
message.setText("...", "UTF-8");

MimeMessageHelper helper = new MimeMessageHelper(message, "UTF-8");
helper.setFrom(from);
helper.setTo(to);

emailSender.send(message);
0
Taras Melnyk

Si vous utilisez des messages HTML, essayez ceci:

Message message = new MimeMessage(session);
message.setContent(htmlText, "text/html; charset=UTF-8");
0
Ruslan Sheremet