非改行スペースのような文字の電子メールの疑問符。これはUnix上でのみ発生し、Windowsでは発生しません

私はコンテンツの種類/エンコーディングに関連する奇妙な問題に直面しています。 以下は私のJavaコードスニペットです。このコードは、アプリケーションサーバーがWindows上で実行されているWindowsマシンと、 SMTP サーバーで正常に動作します電子メールを送信するためのWindows localhostもあります。 Unixサーバに同じコードをデプロイすると、まったく同じコンテンツのために送られた電子メールには、改行されていない空白のような特殊文字の疑問符(???)が入ります。

私はたくさんのグーグルでやりましたが、解決策は見つかりませんでした。この問題を解決するにはどうすればよいですか?私が試みたコンテンツタイプは、 ISO-8859-1UTF-8 および Windows-1252 をクリックします。何も役立ちません。

        MimeMessage message = new MimeMessage(session);
                .............

        Multipart mp = new MimeMultipart();
        MimeBodyPart messageBody = new MimeBodyPart();
        messageBody.setContent(mailMessage, "text/html;charset=Windows-1252");
        messageBody.setHeader("Content-Type", "text/html;charset=Windows-1252");

       //Add body to the multimedia part
        mp.addBodyPart(messageBody);
        message.setContent(mp);

       //Send message
        Transport.send(message);
1
追加された 編集された
ビュー: 1
生成されたメッセージは異なるか、別のメールクライアントを使用してメッセージを表示していますか?私の推測では、あなたのUnix MUAにはUTF8のサポートがないか、間違ったロケール設定でそれを実行しているということです。
追加された 著者 tripleee,
私はあなたがメッセージ(彼らの "ソース"を現代の電子メールの言い回し)と比較すると、彼らはどのように異なるのですか? Outlookが別の方法でレンダリングする場合は、大きな違いがあります。おそらくContent- *ヘッダーにあります。
追加された 著者 tripleee,
@トリプル、私はこれらの電子メールを受信するために私のラップトップ上にあるマイクロソフトの見通しである同じメールクライアントを使用しています。生成されたメッセージも内容が同じです。
追加された 著者 jayP,
@トリプル、違いは、私は得る??それらの文字の場合、私は電子メールのhtmlソースを参照してください。したがって、コンテンツタイプがhtmlのメタヘッダーとして送信されるかどうかは関係ありません。疑問符は常に疑問符です。これは、UNIX側で、電子メールメッセージの内容に疑問符として送信する特殊文字(区切りではない)を作成するものです。
追加された 著者 jayP,

2 答え

どちらの場合も同じメールサーバーを使用していますか?メッセージを表示するのと同じクライアントプログラムですか?

デバッグの場合は、Transport.send呼び出しの直前に次の行を追加します。

message.writeTo(new FileOutputStream("msg.txt"));

msg.txtファイルを調べて、文字が正しくエンコードされているかどうかを確認します。

mailMessage Stringにテキストをどのように作成しますか?正しいUnicode文字で文字列を作成しないと、charsetは正しい文字列にしません。

また、Content-Typeヘッダーを明示的に設定する必要はなく、その行を削除する必要はありません。

そして、setContentの代わりに、以下を使用します。

messageBody.setText(mailMessage, "html", "utf-8");

これにより、Content-Typeヘッダが正しく設定され、パラメータ(例えば、文字セット)が正しく引用されるようになります。

2
追加された
したがって、電子メールのContent-Typeヘッダは、HTMLペイロードのHTTP-Equivsヘッダと一致しませんか?
追加された 著者 tripleee,
だからあなたはあなたのデータベース接続から汚れたテキストを取得していますか?データベースはどこで実行されており、どのようにデータベースに接続していますか?
追加された 著者 tripleee,
msg.txtファイルに疑問符が表示されている場合は、基本的なものが間違っています。これは疑問符が元の文字列にあることを示唆しています。元の文字列にはどのような非ASCIIデータがありますか?元の文字列はどのように作成しましたか?元の文字列だけをファイルに書き込むと、何が得られますか?
追加された 著者 Bill Shannon,
データベースのデータは、(utf-8ではなく)オペレーティングシステムのデフォルトの文字セットを使用している可能性があり、データベースの文字からJava Stringオブジェクトを構築するときにUnicode文字に正しく変換されない可能性があります。そのため、文字列をファイルに書き出すときにメモ帳でその文字列を見ることができます。メモ帳ではデフォルトの文字セットが使用されています。 Java文字列の各文字の整数値を調べて、それらが期待されるUnicode文字、特に改行しない空白文字であることを確認します。
追加された 著者 Bill Shannon,
ありがとう@ BillShannonあなたは私の多くの時間を節約しました。 string.setTextは私のために働いた
追加された 著者 Ajay Kurmi,
私はあなたが示唆したようにtxtファイルを書いた。 <html> <head> <meta http-equiv = "Content-Type" content = "text/html; charset = ISO-8859-1"という疑問符(???) />あなたのsetTextメソッドを試しました。それでも問題は解決されません。同じセットアップ/コードがウィンドウ上で動作するため、メッセージは正しい文字を持っています(すべてがウィンドウ上にあるとき)
追加された 著者 jayP,
上に貼り付けたhtmlコードは無視してください。これはメッセージの一部であり、そこにコンテンツタイプがハードコードされています。
追加された 著者 jayP,
文字は私のデータベースのデータから来ています。そして、データはよく見えます。文字は実際には改行されていないスペースです(つまり、それを呼び出すものです)。私のマシン上のメモ帳でその文字列を開くと、正しく表示されます。
追加された 著者 jayP,

結局のところ、私はそれをやるための粗雑なやり方で行かなければならなかった。私はそのような文字をスペースに置き換えました。

mailMessage.replaceAll("[^\\x20-\\x7e]", " ");

さて、改行されていないスペースのような特殊文字や、通常の範囲外の他の文字はすべてスペースに置き換えられます。この場合の電子メールは、とにかく通常のテキストのためのものです。

2
追加された