concrete5メールの文字化け:その2
concrete5デモサイトの Ver.5.3.1jaにアップグレードしたのですが、またまたフォームの通知メールが文字化け?していたので修正。
今回は以前とは違って、コードを削ります。
concrete5の5.3.1jaは、mb_send_mail()が使える時はmb_send_mail()を利用してメールを送信します。
このmb_send_mail()はmb_language()の設定値を利用して適切にメールをエンコードしてくれるのですが、concrete5の5.3.1jaではメールヘッダーでエンコードをアプリのエンコード(UTF-8)に指定しちゃってました。
僕の環境の場合、mb_language()の値は"ja"だったので、PHPはUTF-8でエンコードされたデータを7bitで送っていた為、日本語部分が化けていた様です。
対処法
/concrete/helpers/mail.phpの123行目付近をコメントアウト
public function sendMail() { $from = $this->generateEmailStrings($this->from); $to = $this->generateEmailStrings($this->to); if (ENABLE_EMAILS) { $header = "-Version: 1.0\r\n"; //$header .= "Content-type: text/plain; charset=" . APP_CHARSET . "\r\n";←ここコメントアウト if ($from == '') { $from = 'concrete5@' . str_replace(array('http://', 'https://'), '', BASE_URL); } $header .= "From: {$from}"; $subject = $this->subject; if (function_exists('mb_encode_mimeheade')) { $subject = mb_encode_mimeheader($subject, APP_CHARSET); } if (function_exists('mb_send_mail')) { mb_send_mail($to, $subject, $this->body,$header); } else { mail($to, $subject, $this->body, $header); } } // add email to log if (ENABLE_LOG_EMAILS) { $l = new Log(LOG_TYPE_EMAILS, true, true); if (ENABLE_EMAILS) { $l->write('**' . t('EMAILS ARE ENABLED. THIS EMAIL WAS SENT TO mail()') . '**'); } else { $l->write('**' . t('EMAILS ARE DISABLED. THIS EMAIL WAS LOGGED BUT NOT SENT') . '**'); } $l->write(t('Template Used') . ': ' . $this->template); $l->write(t('To') . ': ' . $to); $l->write(t('From') . ': ' . $from); $l->write(t('Subject') . ': ' . $this->subject); $l->write(t('Body') . ': ' . $this->body); $l->close(); } }
どこかでmb_language("ja");が設定されているのか、僕の環境では正常にメールが送信される様になりました。
心配な方は、上記の修正+mb_send_mail()がコールされる直前くらいにmb_language("ja");を追記すると大丈夫だと思います。
今回のconcrete5ではこの修正を行うと僕の環境ではiso2022-jpでエンコードされてメールが届きました。
※UTF-8で送る場合は、mb_language("uni")をmb_send_mail()の前に書くか、
$header .= "Content-type: text/plain; charset=" . APP_CHARSET . "\r\n";
をコメントアウトせずに
$header .= "Content-type: text/plain; charset=" . APP_CHARSET . "\r\n"; $header .= "Content-Transfer-Encoding: BASE64\r\n";
とします。
2009-05-11追記
公式日本語版をメンテされている方から「mb_language("neutral");の方を推奨する。」と言われたのでそっちに変えました。