最近、PHPのメール機能を使用してUTF-8でエンコードされた中国語メールを送信すると、タイトルが文字化けするという問題に遭遇しました。メールの本文は正しいです。最初はページのエンコードの問題かと思いましたが、ページのエンコード utf-8 には問題がないことがわかり、長い間原因を探した結果、ついに問題が見つかりました。
1. PEARのメールクラスを使用する
PEAR の Mail クラスでは、レターの送信に sendmail または SMTP の使用を選択でき、このようなパッケージ化されたインターフェイスは使いやすく、自分で車輪を再発明する必要はありません。
2.ヘッダーの件名の文字化けについて
iso-8859-1 エンコーディング以外のテキストを件名に直接入れないでください。正しい方法は、件名のテキストを RFC 2047 の仕様に準拠させることです。件名のテキストのエンコードが GB2312 であると仮定します。 、その後、 正しい件名 この形式にする必要があります
$headers['件名'] = '=?GB2312?B?' .base64_encode('?=';
)
UTF-8の場合は、先頭のGB2312をUTF-8に置き換えるだけです。 MTA の差別化は非常に重要であり、ほとんどの国内 MTA は GB2312 エンコーディングをサポートできると考えられるため、タイトルでは GB2312 エンコーディングを使用することをお勧めします。
海外の MSP に送信する場合は、GB2312 エンコードをサポートしていない可能性が高いため、件名に Base64 でエンコードされた UTF-8 テキストを使用することをお勧めします。
3. ヘッダーに必ず content-type を追加してください
電子メール ヘッダーのコンテンツ タイプは Web ページのコンテンツ タイプに似ており、text/plain の形式になります。このオプションは主に電子メールを受信するクライアントにとって意味があり、一部の Web メールでは、ここでの設定に基づいて電子メールの内容がエンコードおよび変換され、正しく表示されます。 gb2312 エンコードを使用して .com.tw の電子メール アドレスに送信すると何が起こるか想像できます。
4. メールの送信に使用するホストを正しく設定します
1) ほとんどの非固定 IP は逆解決できず、一部のスパム対策戦略ではこれを判断基準として使用するため、逆解決を構成する必要があります。
2) MX 解析を設定する必要があります。理由は上記と同じです。
3) リターンパスがバウンスメールを受信できることを確認してください。そうしないと、メール送信サーバーが受信側のブラックリストに登録される可能性があります。
最初に関数base64_encode()を使用します — MIME Base64を使用してデータをエンコードします
タイトル文字列の前にエンコード タイプを追加します。例: =?UTF-8?B?
タイトル文字列の後に追加します: ?=
例:
こうすれば、送信される中国語メールのタイトルが文字化けすることはありません。
実際、問題を徹底的に分析すれば、すべての問題は簡単に解決されます。この記事が皆さんの学習に役立つことを願っています。