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

26
demandé sur Javi 2011-02-04 15:14:18

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.

42
répondu dkarp 2011-02-04 15:33:31

Vous pouvez utiliser, cela fonctionne

msg.setSubject(MimeUtility.encodeText("string", "UTF-8", "Q"));
6
répondu Edy Aguirre 2013-10-18 20:36:51

Peut-être que vous pouvez essayer: msg.setSubject(subject, "UTF8");

4
répondu ksimon 2011-02-04 12:26:57

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é.

0
répondu Alexey 2016-12-02 16:12:19