web-dev-qa-db-ja.com

utf 8文字セットはjavaxメールでは機能しません

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

メールは問題なく送信されますが、私はデンマーク人なので、件名とメールテキストに「æ」、「ø」、「å」の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);
}

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

44
Rohwedder

すべてのメール

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

mail.mime.charsetシステムプロパティを使用して、デフォルトのMIME charsetを指定して、エンコードされた単語およびテキスト部分に使用できます。それ以外の場合は、文字セットを指定しないでください。通常、デフォルトのMIME文字セットは、デフォルトのJava文字セット、file.encodingシステムプロパティで指定された文字セットから派生します。ほとんどのアプリケーションでは、デフォルトの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(...)メソッドの1つを使用する必要があります。

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

  • RFC-2046 で指定されているように、text/plainのデフォルトの文字セットはUS-ASCIIですが、追加の文字セットパラメータで無効にすることができます。
  • ただし、 RFC-6657 では、text/xmlタイプがメッセージのコンテンツを使用して文字セットを決定することを明確にしています。 ここでcharsetパラメータは無視されます。
  • そして、 RFC-2854 には、text/htmlが実際に常に文字セットを指定する必要があると記載されています。ただし、そうしないと、ISO-8859-1(= Latin-1)が使用されます。
72
bvdb

ここにUTF-8も提供する必要があるかもしれません

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

http://www.coderanch.com/t/274480/Java/java/JavaMail-set-content-utf をご覧ください

32
Arsen Alexanyan

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

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

ソリューションは、デプロイメント記述子にCharacter Encoding Filterを設定しているように見えました。これは、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 '/ *'で始まるすべての要求にエンコードを強制します。

7
Rohwedder

パラメーター-Dfile.encoding = UTF-8を指定してプロジェクトを実行するのは簡単です!例:Java -Dfile.encoding = UTF-8 -jar MyProject.jar

1
user2582242