携帯メールで文字化け

携帯メールを送信する必要があるのですが、本文が文字化けしてしまいました。
正確には 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の出力など、応用範囲が広いので、覚えておくとバグの少ないコードを書くことができます。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください