携帯メールを送信する必要があるのですが、本文が文字化けしてしまいました。
正確には Bse64 エンコードした文字列がそのまま表示されてしまいました。
以下が、その状態のソース部分です。
... // header $send_header = "MIME-Version: 1.0rn" ; //$mail_header .= "Return-Path: {$from}rn" ; $send_header .= "From: {$send_from}rn" ; $send_header .= "Reply-To: {$send_from}rn" ; $send_header .= "X-Mailer: PHP/" . phpversion() , "rn" ; $send_header .= "Content-Type: text/plain; charset={$encode}rn" ; $send_header .= "Content-Transfer-Encoding: base64rn" ; ... // subject $send_subject = "=?{$encode}?B?" . mail_send_convert( $subject, $convert ) . "?=" ; // message $send_message = chunk_split( mail_send_convert( $message, $convert ) ) ; //send return mail( $send_to, $send_subject, $send_message, $send_header ) ;
Thunderbirdでは修正前で問題ありません。
色々調べてもおかしいと思われる点が見つかりません。
ヘッダーの改行もCRLFが正しいようです。
うーん…あ、ヘッダーの最後に余分なCRLFが…
削除してテストしてみると、ちゃんと携帯で本文が見れました。
単純に削除して終了…とすると、ヘッダーを追加・削除すると同じミスをする恐れがあるので、以下のように修正しました。
// header $send_headers = array() ; $send_headers[] = "MIME-Version: 1.0" ; //$mail_headers[] = "Return-Path: {$from}" ; $send_headers[] = "From: {$send_from}" ; $send_headers[] = "Reply-To: {$send_from}" ; $send_headers[] = "X-Mailer: PHP/" . phpversion() ; $send_headers[] = "Content-Type: text/plain; charset={$encode}" ; $send_headers[] = "Content-Transfer-Encoding: base64" ; ... // subject $send_subject = "=?{$encode}?B?" . mail_send_convert( $subject, $convert ) . "?=" ; // message $send_message = chunk_split( mail_send_convert( $message, $convert ) ) ; //send return mail( $send_to, $send_subject, $send_message, implode( "rn", $send_headers ) ) ;
配列と implode() を使って対策をしています。
この方法は、 HTML タグの出力、CSVの出力など、応用範囲が広いので、覚えておくとバグの少ないコードを書くことができます。