12

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

Message mailMessage = new MimeMessage(session);
mailMessage.setFrom(new InternetAddress("example@example.com"));
mailMessage.setRecipients(Message.RecipientType.TO,InternetAddress.parse(mail.getTo()));
mailMessage.setSubject(mail.getSubject());
mailMessage.setText(mail.getMessage());
Transport.send(mailMessage);

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

私がこれまでに使用したテクニック(私にはうまくいきません):

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内にすべてが正しく表示されます。

編集:送信されたメッセージ本文が[õäöü]の場合の例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]はまだ?と[]でいっぱいです)。

4

8 に答える 8

14
    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").

于 2012-12-20T22:36:30.743 に答える
5

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

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

于 2012-12-20T22:25:18.760 に答える
2

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

于 2012-12-23T11:17:48.860 に答える
2

以下は私のために働いた:

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

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

于 2016-04-12T11:06:01.060 に答える
1

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");
于 2015-02-23T17:58:32.170 に答える