Problème avec l'encodage du sujet lors de l'envoi d'un e-mail
J'envoie un e-mail et je le reçois correctement mais l'encodage du sujet n'est pas correct. J'envoie "invitación" mais je reçois " invitaci?et". Le contenu du message est correct.
Le contenu du message provient d'une transformation d'un modèle de vélocité alors que le sujet est défini dans une variable de chaîne.
J'ai googlé et j'ai vu que certaines personnes disent que MimeUtility.encodeText () pourrait résoudre le problème, mais je n'ai pas eu de succès avec il.
Comment puis-je résoudre le problème? C'est le code que j'ai jusqu'ici.
String subject = "Invitación";
String msgBody = VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, "/vmTemplates/template.vm", "UTF-8", model);
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
try {
String encodingOptions = "text/html; charset=UTF-8";
Message msg = new MimeMessage(session);
msg.setHeader("Content-Type", encodingOptions);
msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));
msg.setSubject(subject);
msg.setContent(msgBody, encodingOptions);
Transport.send(msg);
} catch (AddressException e) {
...
} catch (MessagingException e) {
...
}
Merci
4 réponses
JavaMail a peut-être un peu trop d'abstraction, et vous en êtes victime ici. Lorsque vous utilisez
Message msg = new MimeMessage(session);
Vouscréez un objet MimeMessage
mais le traitez comme un objet Message
. Message
a seulement une méthode setSubject(String subject)
, qui utilise le jeu de caractères par défaut de la plate-forme pour encoder le sujet. Si la plate-forme par défaut ne peut pas l'encoder, vous obtenez ?
caractères dans l'en-tête résultant. MimeMessage
, cependant, a une méthode setSubject(String subject, String charset)
qui vous permettra de spécifier le jeu de caractères que vous souhaitez utiliser pour coder le sujet. Alors changez simplement votre code à
MimeMessage msg = new MimeMessage(session);
msg.setHeader("Content-Type", encodingOptions);
msg.setFrom(new javax.mail.internet.InternetAddress(emailFrom));
msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailTo));
msg.setSubject(subject, "UTF-8");
Et ça devrait marcher.
Vous pouvez utiliser, cela fonctionne
msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q"));
Peut-être que vous pouvez essayer: msg.setSubject(subject, "UTF8");
Dans mon cas, la seule chose qui a fonctionné est de changer les paramètres régionaux du système en celui qui prend en charge le jeu de caractères souhaité. Avant cela, j'ai essayé de nombreuses façons différentes, y compris la réponse acceptée de ce fil, mais aucun d'entre eux n'a aidé.