EC-CUBE から SendGrid を利用する

EC-CUBE から SendGrid を利用する
=================================

EC-CUBE からメールを送信する際、通常は EC-CUBE をホスティングしているサーバーを利用します。
しかし、メールの到達・開封確認ができなかったり、大量のメール送信に向いていなかったりします。
クラウドメールサービスである [SendGrid](https://sendgrid.kke.co.jp) を利用すれば、これらの問題を解決することが可能です。
SendGrid の機能をフルに利用するためには、少しだけ手を加えてあげる必要があります。

アカウントの開設
----------------

[日本公式サイト](https://sendgrid.kke.co.jp>) から申込可能です。

SMTP の設定
------------

### 3.0 以降のバージョン

[SendGrid プラグイン](http://www.ec-cube.net/products/detail.php?product_id=1043) が利用できます。

### 2.12.x 以降のバージョン ###

data/config/config.php を以下のように設定します。

```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>');

```

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

![スクリーンショット 2014-10-06 22.47.07.png](https://qiita-image-store.s3.amazonaws.com/0/40662/c6f4d9f9-7e49-d6f9-9425-36d5a7e208c1.png)

### 2.11.x 以前のバージョン ###

 1. 管理画面→システム設定→パラメータ管理を以下のように設定します
    - MAIL_BACKEND - **'smtp'**
    - SMTP_PORT - **465**
    - SMTP_HOST - **'ssl://smtp.sendgrid.net'**
 2. data/class_extends/SC_SendMail_Ex.php に以下を追記します。(40行目付近)

```php
    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;
    }
```

#### 参考サイト

 - <http://seasoft.jp1.cx/ec/tips/smtpauth>

開封確認の設定
--------------

開封確認など、 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 向けのパッチ(参考)

```diff
--- 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 関連の変更](http://php.net/manual/ja/migration56.openssl.php)** に該当し、メール送信できない場合があります。 [こちら](http://dolphin.hatenablog.jp/entry/2014/10/28/171209) を参考に、ピア検証を無効化するか、最新の CA バンドルファイルを使用するよう設定してください(推奨)。