0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

EC-CUBE2系で SendGrid を使用して RFC 違反のメールアドレスで送信する

Posted at

@docomo.ne.jp, @softbank.ne.jp, @ezweb.ne.jp といった、携帯キャリアのメールアドレスを利用するユーザーの中には、歴史的な理由から、 以下のようなRFC違反のメールアドレスを利用しているユーザーがいます。

  • 先頭がドット .abcde@example.com
  • 連続したドットが含まれている ab..cde@example.com
  • アットマークの前がドット abcde.@example.com

現在は、こういったメールアドレスを新たに作成することはできませんが、2009年3月以前には作成できており、当時作成したユーザーは現在においても、こういったメールアドレスを使用することができます。
RFC違反のメールアドレスだと、迷惑メールが届きにくいという背景もあり、まだ多くのユーザーが存在します。

これらのメールアドレスの構文は RFC5321RFC5322 に違反しており、Gmail をはじめ、多くのメールサーバーでは送受信することができません。

EC-CUBE3系及び、4系でも送信することはできません。

しかし、30代以上で、携帯キャリアのメールアドレスを多用する客層をもつ店舗では、未だにこのようなメールアドレスのユーザーが多く、対応せざるえないのが現状です。

携帯キャリアメールの到達率の良さから、 SendGrid を使用する場合が多いのですが、 RFC違反のメールアドレス宛には、そのままでは送信できません。
SendGrid で RFC 違反のメールを使用する場合は、 localpart(@の前) を "" で囲う 必要があります。

具体的には、 data/class/SC_SendMail.phpsetTo() を以下のように修正することで、 送信する瞬間に "" で囲って送信することができるようになります。

    // 宛先の設定
    public function setTo($to, $to_name = '')
    {
        // ↓追加ここから ------------------------------
        $wsp           = '[\x20\x09]';
        $vchar         = '[\x21-\x7e]';
        $quoted_pair   = "\\\\(?:$vchar|$wsp)";
        $qtext         = '[\x21\x23-\x5b\x5d-\x7e]';
        $qcontent      = "(?:$qtext|$quoted_pair)";
        $quoted_string = "\"$qcontent*\"";
        $atext         = '[a-zA-Z0-9!#$%&\'*+\-\/\=?^_`{|}~]';
        $dot_atom      = "$atext+(?:[.]$atext+)*";
        $local_part    = "(?:$dot_atom|$quoted_string)";
        $domain        = $dot_atom;
        $addr_spec     = "{$local_part}[@]$domain";

        $dot_atom_loose   = "$atext+(?:[.]|$atext)*";
        $local_part_loose = "(?:$dot_atom_loose|$quoted_string)";
        $addr_spec_loose  = "{$local_part_loose}[@]$domain";

        $regexp = "/\A{$addr_spec}\z/";
        if (!preg_match($regexp, $to)) {
            $to = preg_replace('/^(.*)@(.*)$/', '"$1"@$2', $to);
        }
        // ↑追加ここまで ------------------------------
        if ($to != '') {
            $this->to = $this->getNameAddress($to_name, $to);
            $this->setRecip('To', $to);
        }
    }

以下はパッチです(開発者向け)


diff --git a/data/class/SC_SendMail.php b/data/class/SC_SendMail.php
index 53b24281e..4c74759cd 100644
--- a/data/class/SC_SendMail.php
+++ b/data/class/SC_SendMail.php
@@ -74,6 +74,26 @@ class SC_SendMail
     // 宛先の設定
     public function setTo($to, $to_name = '')
     {
+        $wsp           = '[\x20\x09]';
+        $vchar         = '[\x21-\x7e]';
+        $quoted_pair   = "\\\\(?:$vchar|$wsp)";
+        $qtext         = '[\x21\x23-\x5b\x5d-\x7e]';
+        $qcontent      = "(?:$qtext|$quoted_pair)";
+        $quoted_string = "\"$qcontent*\"";
+        $atext         = '[a-zA-Z0-9!#$%&\'*+\-\/\=?^_`{|}~]';
+        $dot_atom      = "$atext+(?:[.]$atext+)*";
+        $local_part    = "(?:$dot_atom|$quoted_string)";
+        $domain        = $dot_atom;
+        $addr_spec     = "{$local_part}[@]$domain";
+
+        $dot_atom_loose   = "$atext+(?:[.]|$atext)*";
+        $local_part_loose = "(?:$dot_atom_loose|$quoted_string)";
+        $addr_spec_loose  = "{$local_part_loose}[@]$domain";
+
+        $regexp = "/\A{$addr_spec}\z/";
+        if (!preg_match($regexp, $to)) {
+            $to = preg_replace('/^(.*)@(.*)$/', '"$1"@$2', $to);
+        }
         if ($to != '') {
             $this->to = $this->getNameAddress($to_name, $to);
             $this->setRecip('To', $to);

SendGrid 以外にも、 @より前の部分を "" で囲うことにより、送信できるサーバーもあると思います。
もし RFC 違反のメールアドレスが送信できないトラブルが発生した場合はお試しください。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?