Java Mail à l'API, les problèmes de Codage
Je suis en utilisant Java Mail API et je suis en train d'envoyer un e-mail via SMTP de Gmail.
Comment mon programme fonctionne:
java.util.Scanner classe est utilisée pour obtenir la saisie de l'utilisateur - je vous demande de l'utilisateur pour les différents paramètres pour être utilisé dans le mail d'envoi de la classe; ce qui ne les suivants:
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 je utilisez des symboles ASCII/les caractères. Mais à chaque fois que je veux utiliser "spécifiques au pays" personnages - comme [õäöü] - je obtenir des tas d'étranges symboles...
Techniques que j'ai utilisé 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 s'affiche correctement à l'intérieur d'un IDE lorsque le Système..println() est effectuée pour afficher le message à envoyer.
EDIT: e.x. lors de l'envoi du corps du message est [õäöü]
Il est affiché [ä""?] dans Gmail.
EDIT: Quand mailMessage.setText(MimeUtility.encodeText(mail.getMessage(), "UTF-8", "Q"));
est utilisée, la sortie de Gmail est le suivant:
"=?UTF-8?Q?=C3=A4=E2=80=9E=E2=80=9D=EF=BF=BD;=0D=0A?="
Un AUTRE EDIT: d'ailleurs, quand je fais: mailMessage.setText(strVar + "õäöü", "ISO-8859-1");
Il fait ajoute "õäöü" bien dans mon e-mail (mais la première partie[strVar] de la chaîne est encore plein de ?'s et []').
strVar
?, et si vous affectez strVar
immédiatement avant que mailMessate.setText(..)
? Peut-être que le contenu que vous recevez de le scanner n'est pas la même que la chaîne de caractères qui ne fonctionne pas.J'ai changé mon code un peu pour me permettre d'envoyer le HTML, donc ma méthode d'envoi est:
message.setContent("<h5>[õäöü]</h5><h1>" + strVar + "</h1>", "text/html");
Lorsque je reçois un mail HTML est analysée correctement, donc, est "[õäöü]", mais strVar
semble "venir" de manière incorrecte. J'ai une classe Input
et get()
méthode à l'intérieur d'elle: public String get(){ /* Scanner declaration here */ return scanner.nextLine(); }
Et dans la deuxième classe MailSender
j'initialise strVar
comme ça: ` /* déclaration de la classe */ String strVar = input.get(); ` // Désolé, difficile d'écrire du code dans ici 🙂Pourriez-vous vérifier que les caractères dans la chaîne (et comment il se compare à des personnages dans les cas qui ne fonctionne pas)?
Bien sûr, vous pouvez voir le résultat ici: lien la Sortie est un peu bizarre, je lance mon programme dans les deux IDE (Ide, et Netbeans). J'ai utilisé leur propre console pour l'entrée [Scanner(System.en)]. Intellij semble sortie tout correctement, mais Netbeans de manière incorrecte. Première ligne(CMD) sur l'image. C'est en fait un pot fabriqué à partir de Netbeans. Il devient l'objet de la ligne droite (Netbeans n'ai pas) mais le corps est ok (même dans netbeans IDE de la console). "Häid Jõule" signifie Joyeux Noël en estonien btw 🙂
Alors le problème est probablement pas avec JavaMail, mais avec le codage de la consoles, vous ne savez pas comment changer cela.
OriginalL'auteur Furlando | 2012-12-20
Vous devez vous connecter pour publier un commentaire.
On doit donc définir le codage des caractères pour les deux, le corps et l'objet.
Additif en raison de commentaire de @bartac
Pour le correspondant
MimeBodyPart
faire unsetHeader("Content-Type", "text/plain; charset=UTF-8")
.setText
permet également de définir laContent-Type
en-tête (et si vous regardez à travers le code, vous verrez que l'existantContent-Type
etContent-Transfer-Encoding
les en-têtes sont supprimés après le réglage de contenu à l'aide desetText
ousetContent
)merci, je vais enlever le redondante
setHeader("Content-Type", "text/plain; charset=UTF-8")
.message.setText(body, "text/plain; charset=UTF-8")
ou similaire n'ai pas travaillé pour moi dans Windows 10 application de Messagerie par défaut (et parfois dans Outlook) pour certains slaves lettres. Je l'ai résolu en utilisantMimeBodyPart
et réglagesetHeader("Content-Type", "text/plain; charset=UTF-8")
sur elle. Comme pour le sujet,message.setSubject(subject, "UTF-8")
a fonctionné parfaitement pour slave caractères (sans elle, même gmail n'est pas à reconnaître 'è').J'ai ajouté votre solution. Peut-être que la différence entre les riches (avec une partie mime pour le texte brut) et de la plaine des messages.
OriginalL'auteur Joop Eggen
Vous devez utiliser
setText(String texte, String charset)
ousetText(String texte, String charset, Chaîne de sous-type)
pour définir le corps du texte avec un codage spécifique.MimeUtility.encodeText()
n'est pas destiné pour le corps du texte, mais seulement pour le texte codé dans les en-têtes (et uniquement pour les en-têtes set avecsetHeader
ouaddHeader
).mailMessage.setText("input from Scanner here", "ISO-8859-1");
Mais rien n'a changé... Quoi d'autre pourrait être le problème?OriginalL'auteur Mark Rotteveel
Fondamentalement, mon code fonctionne très bien, comme son supposé. C'était le cmd, qui ne pouvait pas gérer des caractères non-ascii. J'ai utilisé un fichier bat pour accéder à un pot. Je pense que je vais juste faire un peu de GUI alors... Merci à tous pour répondre à.
OriginalL'auteur Furlando
La suite fonctionné pour moi:
Où
subject
etbody
sont régulièrement des objets String avec pas de traitement spécial (code et l'interface utilisateur d'utiliser l'UTF-8).OriginalL'auteur Agustí Sánchez
1 - Considérez vous souhaitez envoyer un e-mail avec cette chaîne de caractères dans le corps:
2 - Que le code est exécuté dans la GAE serveur, cette chaîne est interprétée avec la valeur par défaut codage ASCII. Pour envoyer cet e-mail avec le bon de caractères accentués, définir la Chaîne:
Les caractères spéciaux sont définis manuellement avec ses UTF-8 codes. Recherche les codes que vous avez besoin dans le tableau http://www.utf8-chartable.de/
3 - Convertir la chaîne de l'encodage UTF-8. Tous les codes tapé à la machine va maintenant être correctement interprétée:
OriginalL'auteur supertreta
Utiliser le encodeText méthode de MimeUtility:
(Je ne sais pas ce que "B" signifie, garder son calme, et il suffit d'utiliser. En fait, il peut être "B" ou "Q".)
OriginalL'auteur Mark Szabo
OriginalL'auteur Taras Melnyk
Dans le cas si vous utilisez les messages HTML, essayez ceci:
OriginalL'auteur Ruslan Sheremet