EC-CUBEのカスタマイズ、ネットショップ制作メモ

主にEC-CUBEを利用したネットショップの制作、カスタマイズや独自機能の開発について

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