EC-CUBE から SendGrid を利用する
EC-CUBE からメールを送信する際、通常は EC-CUBE をホスティングしているサーバーを利用します。
しかし、メールの到達・開封確認ができなかったり、大量のメール送信に向いていなかったりします。
クラウドメールサービスである SendGrid を利用すれば、これらの問題を解決することが可能です。
SendGrid の機能をフルに利用するためには、少しだけ手を加えてあげる必要があります。
アカウントの開設
日本公式サイト から申込可能です。
SMTP の設定
3.0 以降のバージョン
SendGrid プラグイン が利用できます。
2.12.x 以降のバージョン
data/config/config.php を以下のように設定します。
define('MAIL_BACKEND', 'smtp');
define('SMTP_HOST', 'ssl://smtp.sendgrid.net');
define('SMTP_PORT', '465');
define('SMTP_USER', 'apikey');
define('SMTP_PASSWORD', '<sendgrid のAPI KEY>');
インストール前の状態でしたら、インストーラの オプション設定 にて設定可能です。
2.11.x 以前のバージョン
- 管理画面→システム設定→パラメータ管理を以下のように設定します
- MAIL_BACKEND - 'smtp'
- SMTP_PORT - 465
- SMTP_HOST - 'ssl://smtp.sendgrid.net'
- data/class_extends/SC_SendMail_Ex.php に以下を追記します。(40行目付近)
function getBackendParams($backend) {
$arrParams = parent::getBackendParams($backend);
switch ($backend) {
case "mail":
case "sendmail":
break;
case "smtp":
default:
$arrParams['auth'] = true;
$arrParams['username'] = 'apikey';
$arrParams['password'] = '<sendgrid のAPI KEY>';
break;
}
return $arrParams;
}
参考サイト
開封確認の設定
開封確認など、 SendGrid の機能をフルに利用するには、data/class/SC_SendMail.php を修正する必要があります。
この設定は 2.13.x 系のものとなりますが、旧バージョンでも行数が異なる程度で、おおむね同様です。
260行目付近、269行目付近の ISO-2022-JP を UTF-8 に置換します。
例)
$arrHeader['Content-Type'] = 'text/html; charset="ISO-2022-JP"';
↓
$arrHeader['Content-Type'] = 'text/html; charset="UTF-8"';
120行目付近、128行目付近、172行目付近の JIS を UTF-8 に置換します
例)
$this->subject = mb_encode_mimeheader($subject, 'JIS', 'B', "\n");
↓
$this->subject = mb_encode_mimeheader($subject, 'UTF-8', 'B', "\n");
129行目付近を以下のように変更します。
$this->body = str_replace(array("\r\n", "\r"), "\n", $this->body);
↓
$this->body = str_replace(array("\n", "\r"), "\r\n", $this->body);
2.13.x 向けのパッチ(参考)
--- SC_SendMail.php.orig 2013-08-24 23:33:52.000000000 +0900
+++ SC_SendMail.php 2014-10-05 20:36:56.312059682 +0900
@@ -117,7 +117,7 @@
// 件名の設定
public function setSubject($subject)
{
- $this->subject = mb_encode_mimeheader($subject, 'JIS', 'B', "\n");
+ $this->subject = mb_encode_mimeheader($subject, 'UTF-8', 'B', "\n");
$this->subject = str_replace(array("\r\n", "\r"), "\n", $this->subject);
}
@@ -125,8 +125,8 @@
public function setBody($body)
{
// iso-2022-jpだと特殊文字が?で送信されるのでJISを使用する
- $this->body = mb_convert_encoding($body, 'JIS', CHAR_CODE);
- $this->body = str_replace(array("\r\n", "\r"), "\n", $this->body);
+ $this->body = mb_convert_encoding($body, 'UTF-8', CHAR_CODE);
+ $this->body = str_replace(array("\n", "\r"), "\r\n", $this->body);
}
/**
@@ -169,7 +169,7 @@
if ($name != '') {
// 制御文字を変換する。
$_name = $name;
- $_name = mb_encode_mimeheader($_name, 'JIS', 'B', "\n");
+ $_name = mb_encode_mimeheader($_name, 'UTF-8', 'B', "\n");
$_name = str_replace('"', '\"', $_name);
$name_address = sprintf('"%s" <%s>', $_name, $mail_address);
} else {
@@ -257,7 +257,7 @@
public function getTEXTHeader()
{
$arrHeader = $this->getBaseHeader();
- $arrHeader['Content-Type'] = 'text/plain; charset="ISO-2022-JP"';
+ $arrHeader['Content-Type'] = 'text/plain; charset="UTF-8"';
return $arrHeader;
}
@@ -266,7 +266,7 @@
public function getHTMLHeader()
{
$arrHeader = $this->getBaseHeader();
- $arrHeader['Content-Type'] = 'text/html; charset="ISO-2022-JP"';
+ $arrHeader['Content-Type'] = 'text/html; charset="UTF-8"';
return $arrHeader;
}
謝辞
設定について @nakansuke さんにサポートいただきました。
その他
- 2.4系など、旧バージョンでの設定方法がわからない、うまくいかない場合など、コメント覧にてお知らせください
- PHP5.6以降のバージョンを使用する場合、PHP 5.6.x における OpenSSL 関連の変更 に該当し、メール送信できない場合があります。 こちら を参考に、ピア検証を無効化するか、最新の CA バンドルファイルを使用するよう設定してください(推奨)。