メールの送信に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);
}
この「エラー」を修正する方法を見つけてください。
いくつかの メーリングに関連するシステムプロパティ があり、おそらくコードを簡素化できます。私は実際にこの特定のプロパティについて話している:"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)
メソッドを使用する必要があります。
それでもうまくいかない場合は、おそらくこの時点に到達する前に入力が既に破損しています。つまり、おそらく間違ったエンコーディングを使用してデータを収集したのでしょう。
[他の情報源が主張するように] 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タイプには文字セットを処理する独自の方法があることに注意してください。
ここにUTF-8も提供する必要があるかもしれません
mimeMessage.setContent(message, "text/plain; charset=UTF-8");
http://www.coderanch.com/t/274480/Java/java/JavaMail-set-content-utf をご覧ください
デバッグに多くの時間を費やし、インターネットで手がかりを探した後、問題の解決策を見つけました。
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 '/ *'で始まるすべての要求にエンコードを強制します。
パラメーター-Dfile.encoding = UTF-8を指定してプロジェクトを実行するのは簡単です!例:Java -Dfile.encoding = UTF-8 -jar MyProject.jar