【CakePHP2】RFC準拠違反のメールアドレス宛にメール送信する方法
2016/09/13
CakePHP2(Ver2.3.10)のCakeEmailを利用しているメールフォームで携帯アドレス宛(RFC準拠違反の、ezweb.ne.jp宛)に送信する際に500エラー(Internal Server Error)が出るとの申告を受けました。
RFC準拠違反のメールアドレスとはいえ、500エラーが出るのは拙かろうということで、メールを送信するよう変更した備忘録です。
CakeEmailでRFC準拠違反のメールアドレス宛に送信する
CakePHP2(Ver2.3.10)のCakeEmailを利用してメールフォームを作成しているのですが、ある日、携帯アドレス宛にメール送信する際に500エラーが出るとの申告を受けました。
よくよく聞いてみると、送信先のメールアドレスというのが、RFC準拠違反の、ezweb.ne.jp宛。
CakePHP2.3を調査すると、どうやらCakeEmailではメールアドレスをセットした際にバリデーションチェック(Validation::email())を行い、RFC非準拠のアドレス宛へは送信せず「SocketException」が返る仕様の様子。
エラーログにも確かに「SocketException」が記録されていました。
ちなみにRFC準拠違反のメールアドレスとはドットが連続したり、ドットで終わったりするメールアドレスのこと。少なくとも ezweb.ne.jp と docomo.ne.jp には準拠違反のメールアドレスが取得できたという過去がある以上、それらのアドレス宛にも送信できないとマズイので、とりあえず、Validation::email()の正規表現を緩いものに変えてしまうということに行き着きました。
Validation::email()は2.3.10では、
1 |
cakephp/lib/Cake/Utility/Validation.php |
に定義されていることがわかったので、そのファイルを、
1 |
cakephp/app/Utility/Validation.php |
にコピーします。(Utilityディレクトリは新規作成)
コピーしたValidation.phpを開き、430行目付近の正規表現を編集
1 2 3 |
$regex = '/^[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&\'*+\/=?^_`{|}~-]+)*@' . self::$_pattern['hostname'] . '$/i'; ↓↓↓ $regex = '/^[\.a-z0-9!#$%&\'*+\/=?^_`{|}~-]+@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]{2,6}$/i'; |
とりあえず、緩くしてみました。
次に、メール送信しているファイルの頭に
App::uses('Validation', 'Utility');
を定義します。
toogieのプログラムはメール送信は全てAppController中に定義しているアクションを利用しているため、AppControllerに定義しています。
CakeEmailと並べたら以下のようになりました。
1 2 3 4 5 6 7 8 9 |
App::uses('Controller', 'Controller'); App::uses('Validation', 'Utility'); App::uses('CakeEmail', 'Network/Email'); class AppController extends Controller { ?中略? } |
これでとりあえずは問題なく動作しました。
参考にしましたサイト様
http://php-tips.com/php/cakephp-php/2013/07/avoid-cakeemail-email-address-validatio
上記サイト様によると、CakePHP2.4.0からは、メールアドレス検証用の正規表現を任意のものに変更できる仕様になるようです。
2.4.0にアップデートしても良かったのですが、手持ちの知識で何とかしてみるのも、たまには良いでしょうって事で。