62

メールの送信にはJavaMailAPIを使用しました。連絡先フォーミュラを使用して入力を送信しています。入力は特定の電子メールに送信する必要があります。

私はデンマーク人ですが、メールは問題なく送信されます。そのため、件名とメールテキストに「æ」、「ø」、「å」の3つのデンマーク文字が必要です。

したがって、UTF-8文字エンコードを使用してこれらの文字を提供できることを確認しましたが、メールを送信すると、「ã¦」、「ã¸」、「ã¥」の代わりに奇妙な文字しか表示されません。デンマーク語の文字-「æ」、「ø」、「å」。

メールを送信する私の方法は次のようになっています。

public void sendEmail(String name, String fromEmail, String subject, String message) throws AddressException, MessagingException, UnsupportedEncodingException, SendFailedException
{
    //Set Mail properties
    Properties props = System.getProperties();
    props.setProperty("mail.smtp.starttls.enable", "true");
    props.setProperty("mail.smtp.host", "smtp.gmail.com");
    props.setProperty("mail.smtp.socketFactory.port", "465");
    props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.setProperty("mail.smtp.auth", "true");
    props.setProperty("mail.smtp.port", "465");
    Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("my_username", "my_password");
        }
    });

    //Create the email with variable input
    MimeMessage mimeMessage = new MimeMessage(session);
    mimeMessage.setHeader("Content-Type", "text/plain; charset=UTF-8");
    mimeMessage.setFrom(new InternetAddress(fromEmail, name));
    mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("my_email"));
    mimeMessage.setSubject(subject, "utf-8");
    mimeMessage.setContent(message, "text/plain");

    //Send the email
    Transport.send(mimeMessage);
}

この「エラー」を修正する方法を見つけるのを手伝ってください。

4

7 に答える 7

98

すべての電子メール用

メーリングに関連するいくつかのシステムプロパティがあり、おそらくコードを単純化することができます。私は実際にこの特定のプロパティについて話している:"mail.mime.charset"

mail.mime.charsetSystemプロパティを使用して、文字セットを指定しないエンコードされた単語やテキスト部分に使用するデフォルトのMIME文字セットを指定できます。file.encoding通常、デフォルトのMIME文字セットは、 Systemプロパティで指定されているデフォルトのJava文字セットから派生します。ほとんどのアプリケーションでは、デフォルトのMIME文字セットを明示的に設定する必要はありません。メールメッセージに使用されるデフォルトのMIME文字セットが、システムに保存されているファイルに使用される文字セットと異なる場合は、このプロパティを設定する必要があります。

上記で読むことができるように、デフォルトでは、の値はなくmail.mime.charset、ファイルエンコーディング(file.encodingプロパティ)が使用されます。

特定の電子メールの場合

ただし、特定の電子メールに特定のエンコーディングを指定する場合は、おそらく2つのパラメータsetSubject(subject,charset)setText(text,charset)メソッドを使用する必要があります。

それが機能しない場合は、おそらく、このポイントに到達する前に入力がすでに破損しています。つまり、データの収集に間違ったエンコーディングを使用した可能性があります

MIMEタイプは複雑です

setContent(content, "UTF-8")他の情報源が主張するように)は機能しません。このメソッドのシグネチャを見てください:setContent(Object content, String mimetype)MIMEタイプと文字セットは2つのまったく異なるものです。イムホ、あなたは本当にsetText(...)charsetパラメータを持つメソッドの1つを使用しているはずです。

ただし、mimetypeを使用して文字セットを設定し続ける場合setContent(content,mimetype)は、正しい形式を使用してください。(だけ"UTF-8"でなく、のようなもの"text/plain; charset=UTF-8")。ただし、さらに重要なことは、すべてのmimeタイプには独自の文字セットの処理方法があることに注意してください。

  • RFC-2046で指定されているように、のデフォルトの文字セットはですtext/plainUS-ASCII、追加の文字セットパラメータで無効にすることができます。
  • ただし、RFC-6657text/xmlでは、タイプがメッセージの内容を使用して文字セットを決定することを明確にしています。ここでは、charsetパラメータは無視されます。
  • そしてRFC-2854text/htmlには、実際には常に文字セットを指定する必要があると記載されています。ただし、そうでない場合は、ISO-8859-1(= Latin-1)を使用します。
于 2014-12-10T15:33:19.613 に答える
51

たぶん、ここでUTF-8も提供する必要があります

mimeMessage.setContent(message, "text/plain; charset=UTF-8");

http://www.coderanch.com/t/274480/java/java/JavaMail-set-content-utfを確認する必要があります

于 2013-02-23T18:33:08.033 に答える
8

デバッグに多くの時間を費やし、インターネットで手がかりを探した後、私は自分の問題の解決策を見つけました。

Webリクエストを介してデータを送信するたびに、アプリケーションがUTF-8エンコードで文字をエンコードしなかったようです。つまり、連絡フォームから送信された、æ、ø、åの文字を含むデータは、文字エンコードでは正しく処理できませんでした。

このソリューションは、Deployment Descriptorで文字エンコードフィルターを設定しているように見えました。これは、Webからのすべての着信要求を文字エンコードUTF-8でエンコードします。

private void registerCharacterEncodingFilter(ServletContext servletContext) {
    CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
    encodingFilter.setEncoding("UTF-8");
    encodingFilter.setForceEncoding(true);
    FilterRegistration.Dynamic characterEncodingFilter = servletContext.addFilter("characterEncodingFilter", encodingFilter);
    characterEncodingFilter.addMappingForUrlPatterns(null, false, "/*");
}

このフィルターは、エンコードをUTF-8に設定し、URL'/*'で送信されるすべての要求にエンコードを強制します。

于 2013-03-01T20:19:15.933 に答える
2

簡単です。パラメータ-Dfile.encoding=UTF-8を使用してプロジェクトを実行します。例:java -Dfile.encoding = UTF-8 -jar MyProject.jar

//タイプミスを修正

于 2013-08-15T10:45:44.430 に答える
1

文字列をsendメソッドに送信する前に、文字列をUTF-8に変換する必要があります

「request」パラメータを受け取っている場合は、「setCharacterEncoding」を使用できます。

request.setCharacterEncoding("utf-8");
String subject = request.getParameter("subject");
String content = request.getParameter("content");
...
MimeMessage mineMessage = new MimeMessage(session);
        mineMessage.setFrom(new InternetAddress(myAccountEmail));
        mineMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recepient));
        mineMessage.setSubject(subject, "UTF-8");
        mineMessage.setContent(content, "text/plain;charset=UTF-8");

それ以外の場合は、次の方法で文字列をUTF-8形式に変換します。

String subject = new String(subject.getBytes(Charset.forName("ISO-8859-1")), Charset.forName("UTF-8"));
String content = new String(content.getBytes(Charset.forName("ISO-8859-1")), Charset.forName("UTF-8"));
...
MimeMessage mineMessage = new MimeMessage(session);
    mineMessage.setFrom(new InternetAddress(myAccountEmail));
    mineMessage.setRecipient(Message.RecipientType.TO, new InternetAddress(recepient));
    mineMessage.setSubject(subject, "UTF-8");
    mineMessage.setContent(content, "plain/plain;charset=UTF-8");

これはスペイン語での結果です。

于 2021-07-12T22:00:15.630 に答える
0

私はこの質問に遅れていることを知っていますが、私はちょうど今同様の問題を抱えていました。

ソースエンコーディングもチェックする価値があるかもしれません!私はテストクラスを使用していましたが、ハードコードされた件名/テキストにいくつかの特殊文字が含まれているため、電子メールの送信時に文字化けし続けました。該当する場合は文字セットUTF-8を設定しましたが(mimeMessage.setSubject(subject、charset)、mimeMessage.setContent(content、 "text / plain; charset = UTF-8"))。

次に、このクラスのソースエンコーディングがwindows-1252であることに気付きました。私の理解では、Javaファイルがコンパイルされると、すべてのソーステキストがUTF-8に変換されます。ただし、この場合、このプロジェクトのmaven pom.xmlには、project.build.sourceEncodingプロパティがありませんでした。したがって、何も指定されていないため、コンパイル中に(デフォルトで)どのエンコーディングmavenを使用していたかは実際にはわかりません。

ここではソースエンコーディングを変更できませんでしたが、特殊文字をUnicodeコードリテラルに変更すると(たとえば、「ü」から「\ u00fc」)、すべてが正常に機能しました。

于 2021-03-19T16:25:02.093 に答える
-1
mimeMessage.setContent(mail.getBody(), "text/html; charset=UTF-8");

多分iamが間違っていますが、これは私にとってはうまくいきます。:)すべてのööö、äää、üüüの文字が私の見通しに正しく表示されます。

Outlookのスクリーンショット

于 2021-12-17T12:52:56.487 に答える