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");の方を推奨する。」と言われたのでそっちに変えました。