2017-03-01 6 views
1

以下のコードを使用して、異なるドメイン間で複数のユーザーにメールを送信しています。javamail APIを使用して送信されたhtmlメール本文は、Outlookで文字化けして表示される

 String emailBody = "<html>Some html text goes here</html>" 
    String from = "[email protected]" 
    String bcc = "[email protected]" 
    String subject = "Some subject..." 
    List attachments = "Some image attachments ..." 
    MimeMessage message = new MimeMessage(session); 
    message.setHeader("Content-Type", "text/html; charset=UTF-16") 
    message.setHeader("Accept-Language", "en-US") 
    message.setHeader("Content-Language", "en-US") 

    message.setFrom(new InternetAddress(from)); 
    message.setRecipients(Message.RecipientType.BCC,InternetAddress.parse(bcc)); 
    message.setSubject(subject); 

    // creates message part 
    MimeBodyPart messageBodyPart = new MimeBodyPart(); 
    messageBodyPart.setContent(emailBody, "text/html; charset=UTF-16"); 

    // creates multi-part 
    Multipart multipart = new MimeMultipart(); 
    multipart.addBodyPart(messageBodyPart); 

    addAttachmentsToMultiPart(multipart,attachments) 

    message.setContent(multipart); 

    Transport.send(message); 

メールの本文はすべて英語です。しかし、ほとんどのドメインのユーザーはそれを漢字で受信しています。私は身体のHTMLソースを見たとき、部分的に文字化けしていることがわかりました。オリジナルのhtmlテキストの一部は、インタクトであり、特定の順序のないテキスト間のいくつかのジャンク文字です。このメールは、このパス "Tomcatアプリケーション - >会社メールサーバー - > outlook.office365.comサーバー - >ターゲットメールサーバー - >エンドユーザーOutlookクライアント"を経由します。

いくつかの調査の末、この問題が文字エンコーディングに起因する可能性があることがわかりました。テストのために、私はgamil.comにこのメールを送ろうとしました。メール本文はGmailに正しく表示されますが、ヘッダー部分にヘッダがあり、本体部分全体がbase64でエンコードされていることがわかります。

Content-Type: text/html; charset="UTF-16" 
Content-Transfer-Encoding: base64 

私はヘッダーに設定されている、どこでメール本文がエンコードされつつあるか、「コンテンツ転送エンコード」を確認していません。しかし、エンドユーザーのメールプロパティには同様のヘッダーが表示されません。私は明示的に "base64"、 "quoted-printable"(そして他のタイプ)に "Content-Transfer-Encoding"を設定しようとしましたが、常に無視され、gmailは常にbase64としてそれを受け取ります。この設定はエンドユーザメールに影響を与えません。彼らはいつも同じゴミを受け取る。

誰もがあなたが試みることができる唯一の違い、私は問題とどのようにそれを

答えて

0

私は多くの研究と実験の後に解決しました。基本的に2つの問題がありました

  1. MimeMessageレベルではなく個々のMimeBodyPartレベルで文字セットを設定しないでください。

  2. UTF-16をUTF-8に変更しました。一部のメールクライアント/サーバーはUTF-16を正しく処理できないか、UTF-16を処理するように設定されていません。

1

を解決するために、私たちはあなたが書いたものに非常に類似しているコードを持って何ができるかを理解するのに役立ちます。私たちは

  • 余談としてtext/html; charset=utf-8

、我々が使用する - 私たちは、わずかに異なるボディのコンテンツタイプを使用し

  • は、メッセージ内の任意のヘッダーを設定しないでくださいcom.google.common.net.MediaTypeを使用して、メディアタイプを電子メール送信クラスに渡します。したがって、MediaType.toString()を使用してコンテンツタイプを取得できます。

  • 関連する問題