web-dev-qa-db-ja.com

Java Mail API-エンコードの問題

Java Mail APIを使用していて、GmailのSMTPを介してメールを送信しようとしています。プログラムの仕組み:Java.util.Scannerクラスを使用してユーザー入力を取得しています-私はメール送信クラスで使用されるさまざまなパラメーターをユーザーに要求します。これにより、次のことが行われます。

_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);
_

ASCII symbols/charsを使用している限り、すべてが機能します。しかし、[üäöü]のような「国固有の」文字を使用したいときはいつでも、奇妙に見える記号がたくさん表示されます...

これまでに使用したテクニック(私には役に立たない):

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

注:System.out.println()を実行して送信するメッセージを表示すると、IDE内にすべてが正しく表示されます。

編集:e.x.送信されたメッセージの本文は[õäöü]です。Gmailでは[ä„ "?]と表示されます。

編集:mailMessage.setText(MimeUtility.encodeText(mail.getMessage(), "UTF-8", "Q"));を使用すると、Gmailでの出力は次のようになります。

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

別の編集:興味深いことに、私が行う場合:mailMessage.setText(strVar + "õäöü", "ISO-8859-1");実際にメールに「õäöü」がうまく追加されます(ただし、文字列の最初の部分[strVar]は?と[]でいっぱいです) 。

11
Furlando

基本的に、私のコードは想定どおりに正常に動作します。 ASCII以外の文字を処理できないのはcmdでした。 jarファイルにアクセスするには、batファイルを使用しました。ちょっとGUIを作成するつもりだと思います...回答ありがとうございます。

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

したがって、本文と件名の両方に文字エンコードを設定する必要があります。


@ bartacのコメントによる補遺

対応するMimeBodyPartについては、setHeader("Content-Type", "text/plain; charset=UTF-8")を実行します。

14
Joop Eggen

setText(String text, String charset) または setText(String text, String charset, String subtype) を使用して、テキスト本文に特定のエンコーディングを設定する必要があります。

MimeUtility.encodeText()は本文テキストではなく、ヘッダー内のエンコードされたテキスト(およびsetHeaderまたはaddHeaderで設定されたヘッダーのみ)を対象としています。

5
Mark Rotteveel

以下は私のために働きました:

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

ここで、subjectおよびbodyは、特別な処理を行わない通常のStringオブジェクトです(コードおよびユーザーインターフェイスはUTF-8を使用します)。

2

1-本文にこの文字列を含むメールを送信したいとします:

"Olá João!"

2-GAEサーバーでコードが実行されているため、この文字列はデフォルトのASCIIエンコーディングで解釈されます。このアクセント付き文字でこのメールを送信するには、文字列を次のように定義します。

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

特殊文字は、UTF-8コードを使用して手動で定義されます。必要なコードを表で検索してください http://www.utf8-chartable.de/

3-文字列エンコーディングをUTF-8に変換します。手動で入力したすべてのコードが正しく解釈されるようになりました。

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");
1
supertreta

次の文字セットが私に働きます:charset=ISO-8859-1、例:

mail.setContent(testMail.getTexto(), "text/plain; charset=ISO-8859-1");
0

MimeUtilityのencodeTextメソッドを使用します。

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

(「B」の意味がわからないので、落ち着いて使ってください。実際は「B」または「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

HTMLメッセージを使用する場合は、次のことを試してください。

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