2009-05-09
concrete5メールの文字化け:その2
concrete5, 日本語, CMS, オープンソース, Tips, 個人的メモ, PHP, MySQL, mail
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");の方を推奨する。」と言われたのでそっちに変えました。
- 51 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4SUNA_jaJP316JP316&q=eccube+テンプレート+フリー+2.3.4
- 48 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=rcn&q=flash+ショッピング+オープンソース&btnG=検索&lr=lang_ja
- 20 http://www.google.co.jp/search?hl=ja&q=concrete5+テーマ&lr=
- 19 http://concrete5.xross-cube.com/rss_reader
- 19 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=KbV&q=EC-CUBE+カスタマイズ&revid=629657011&ei=5rYFSoHDDZeIkAXfyKHWBw&sa=X&oi=revisions_inline&resnum=0&ct=top-revisio
- 18 http://www.google.co.jp/search?hl=ja&client=firefox-a&channel=s&rls=org.mozilla:ja:official&q=concrete5+カスタマイズ&btnG=検索&lr=
- 16 http://search.yahoo.co.jp/search?p=ecキューブ&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=0&oq=ecきゅ
- 15 http://www.google.co.jp/search?hl=ja&safe=off&client=firefox-a&rls=org.mozilla:ja:official&num=100&newwindow=1&q=ec+cube+商品一覧 商品カテゴリを消す&btn
- 13 http://74.125.153.132/search?q=cache:KL0u1cRXXcsJ:d.hatena.ne.jp/xross-cube/20090509/1241855673+EC+CUBE+アップグレード&cd=12&hl=ja&ct=clnk&gl=jp&lr=lang_ja&client=firefox-a
- 13 http://concrete5.xross-cube.com/news/concrete5_ver_5_3_1ja



