Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

EC-CUBE から SendGrid を利用する

More than 3 years have passed since last update.

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', 'smtp.sendgrid.net');
define('SMTP_PORT', '587');
define('SMTP_USER', 'sendgrid のユーザーID');
define('SMTP_PASSWORD', 'sendgrid のパスワード');

インストール前の状態でしたら、インストーラの オプション設定 にて設定可能です。

スクリーンショット 2014-10-06 22.47.07.png

2.11.x 以前のバージョン

  1. 管理画面→システム設定→パラメータ管理を以下のように設定します
    • MAIL_BACKEND - 'smtp'
    • SMTP_PORT - 587
    • SMTP_HOST - 'smtp.sendgrid.net'
  2. 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']  = 'sendgrid のユーザーID';
                $arrParams['password']  = 'sendgrid のパスワード';
                break;
        }
        return $arrParams;
    }

参考サイト

開封確認の設定

開封確認など、 SendGrid の機能をフルに利用するには、data/class/SC_SendMail.php を修正する必要があります。
この設定は 2.13.x 系のものとなりますが、旧バージョンでも行数が異なる程度で、おおむね同様です。

260行目付近、269行目付近の ISO-2022-JPUTF-8 に置換します。

例)
$arrHeader['Content-Type'] = 'text/html; charset="ISO-2022-JP"';
↓
$arrHeader['Content-Type'] = 'text/html; charset="UTF-8"';

120行目付近、128行目付近、172行目付近の JISUTF-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 バンドルファイルを使用するよう設定してください(推奨)。
nanasess
Emacs のアイコンを作った人です
https://skirnir.co.jp
ec-cube
日本No.1ECオープンソースのEC-CUBEのコミッターやユーザーのコミュニティです。
https://www.ec-cube.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away