質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

10210閲覧

laravel5のMail::sendでRFC違反のメールアドレスでもメール送信する方法を教えてください

mizugaumai

総合スコア11

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2016/02/26 06:55

編集2016/02/29 09:10

###前提・実現したいこと
題名の通り、Mail::sendで以下のようなRFC違反のメールアドレスでもメール送信出来る方法が知りたいです。

~~~~~~~~
Abc.@example.com(“.”をローカル部の末尾に使用している)
Abc..123@example.com(“.”が連続している)
~~~~~~~~

方法としましては、Swift_Mailerの
vendor/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php
のメールアドレスチェックでチェックエラーだと例外が投げられる部分をコメントアウトする方法があるのですが、この方法は使いたくないです。
それ以外の方法でメール送信する方法はないでしょうか?
どなたかご教示頂けましたら、幸いですmm
よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sonor_3rd

2016/02/26 08:09 編集

メール処理については詳しくないのですが、もう少し補足があった方が良いかと思われます。下記2点ほど質問させてください。 なぜエラーチェックをコメントアウトする方法を嫌うのか? エラーにしたくないアドレスのパターンはあるのか?
sonor_3rd

2016/02/26 08:11 編集

言葉表現を訂正(追記:投稿ミスです 失礼しました)
mizugaumai

2016/02/26 08:44 編集

コメントありがとうございます。 以下文中にて、コメントします。 >なぜエラーチェックをコメントアウトする方法を嫌うのか? ごめんなさい。 ちょっと理由を整理します。 >エラーにしたくないアドレスのパターンはあるのか? アットマークの前にドットがあるメールアドレスをエラーにしたくないのです。 例)hoge.@hoge.com
sonor_3rd

2016/02/26 09:47

つまり、RFC違反のチェックを行う箇所を修正すれば良いということですね。 その条件だけを抜き出すことはできますか?
mizugaumai

2016/02/29 00:45

遅くなりまして、申し訳ございませmm 条件だけ抜き出しますと、 vendor/swiftmailer/lib/classes/Swift/Mime/Headers/MailboxHeader.php の ------------ if (!preg_match('/^'.$this->getGrammar()->getDefinition('addr-spec').'$/D', $address)) {    : ------------ の所かと思います。
guest

回答3

0

ベストアンサー

SwiftMailer本体に手を加えたくなければ、SwiftMailerも依存関係の解決にLaravelに似たコンテナの仕組みを持ってますので、RFCの文法チェックのクラスを入れ替えることが出来ます。たとえば\App\MyMimeGrammarクラスに入れ替えたければこんな感じ:

PHP

1 \Swift_DependencyContainer::getInstance() 2 ->register('mime.grammar') 3 ->asSharedInstanceOf(\App\MyMimeGrammar::class);

Swift_Mime_Grammarクラスを継承して必要なところだけ置き換えみたいな形でできるとかっこいいのですが、文法チェック用の正規表現の配列がprivateになっていて手の出しようがないのでまるごとコピーしてクラス名まわりを置き換えて使い、正規表現のlocal-partに関する部分を改造するのが楽だと思います。

PHP

1namespace App; 2class MyMimeGrammar extends \Swift_Mime_Grammar 3{ 4 以下略 5

正規表現の修正については、local-partの中の問題の部分はdot-atomですがこれは他のところでも使われているのでこれを新たに作った別のものに置き換えるのがいいでしょう。「.」が末尾にくるパターンは昔ケータイメールが「.」をどこにでも許していた名残ですが、末尾だけでなく途中で連続するパターンなどもありますので救おうとしたらこのくらいまで緩めざるを得ないかと思います。(PerlですがEmail::Address::Looseを参考にしました)

PHP

1self::$_grammar['loose-dot-atom-text'] = '(?:'.self::$_grammar['atext'].'|\.)+'; 2self::$_grammar['loose-dot-atom'] = '(?:'.self::$_grammar['CFWS'].'?'. 3 self::$_grammar['loose-dot-atom-text'].'+'.self::$_grammar['CFWS'].'?)'; 4self::$_grammar['local-part'] = '(?:'.self::$_grammar['loose-dot-atom'].'|'. 5 self::$_grammar['quoted-string'].')';

投稿2016/02/29 03:04

crhg

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mizugaumai

2016/02/29 06:39

こちらの方法で実現できそうです。 大変助かりました!! ありがとうございました!
guest

0

案1:メールドレスを quoted-string形式で書いてもらう

まず、正攻法として、メールアドレスを quoted-string形式で、書いてもらうことはできないんでしょうか?
この形式なら RFC違反ではないので、何も手を加えずに チェックが通ると思います。
※「"user-name."@example.com」のような local part を "" で、囲んだ形式です。

案2:SwiftMailer を改造する方法

SwiftMailer には、メールアドレス形式チェックを 変更や無効するオプションはないようですので、ソースコードを変更して、質問で書かれているチェックを呼び出している部分をコメントにして無効にするかチェックルールを変更するしかないようです。

無効にしたくないということなので、チェックルールを変える訳ですが...

Grammar.php ( https://github.com/swiftmailer/swiftmailer/blob/5.x/lib/classes/Swift/Mime/Grammar.php ) で、チェックルールを定義しています。
ここに local part が、「.」 で終わるような形式を、追加定義する必要がありますが、いい案を思いつきませんでした。

暫定的な対応であれば、使用可能文字を定義している部分

self::$_grammar['atext'] = '[a-zA-Z0-9!#\$%&\'\*\+\-\/=\$1\^_`\{\}\|~]';

の行に 「.」を追加することで、チェックは通るようですが、副作用の検証はできていません。

すぐに思いつく副作用としては、「.@example.com」「...@example.com」「.user@example.com」とかが、有効になってしまいます。

投稿2016/02/26 23:50

編集2016/02/27 02:34
CHERRY

総合スコア25171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mizugaumai

2016/02/29 00:49

コメントありがとうございます! こちら参考にさせて頂きますmm
guest

0

この欄一回書いてしまって、削除が出来ないので、コメントだけ残します。

投稿2016/02/29 06:53

mizugaumai

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問