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

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

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

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Laravel 5

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

Q&A

3回答

4142閲覧

[Laravel5] AWS(EC2)上でMailのsend処理が止まってしまう

hirolog

総合スコア32

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Laravel 5

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

0グッド

1クリップ

投稿2016/02/26 03:21

Laravel提供の Vagrant環境Homestead で作成したアプリケーションを、AWS EC2にて本番稼働する際、メールの送信のみがうまく動かず、解決できずにおります。

[主な環境]
  • Laravel 5.2
  • Amazon Linux on EC2
  • Nginx 1.8
  • PHP 7.0.3
  • PHP fpm

その他、sendmail等は Amazon Linux に最初から入っているもの。
sendmailのサービスが起動してるのは確認済。

[Laravel上での問題]

Mail::rawでは送信されますが、Mail::send、Mail::queue、Mail::laterのいずれもブラウザの画面は真っ白になります。
(sendとqueueやlaterメソッドの違いはわかっております、試しにやってみてもダメだったということで)
これらの実行文をコメントアウトすると次に進んでいるので、send、queue、later内で止まっていると思われます。

Mail::rawを使うとメールが送信され、正常終了しています。
また、php artisan tinkerにて

>>> Mail::raw('Test', function($message) { $message->to('メアド')->subject('test'); });

で試すと 1 が返ってきて実際に送信されることを確認できました。

Laravelのログ、NginxやPHPのエラーログには何も出力されておりません。

.env では MAIL_DRIVER=smtp のままで、外部の SMTPサーバ(gmail) を使っています。
SMTPの設定は、smtp.gmail.com、465ポート、SSLなどを指定し、AWS以外の開発環境ではメール送信できております。

[ご相談]

本番環境にデバッグ用の改変をグリグリと入れてしまうのにやや抵抗があるので、直接の解決にならなくとも、ヒントを探せればと思っています。

rawメソッドで送れて、sendメソッドで止まっているのですが、MTA(sendmail)の問題...でしょうか?

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

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

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

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

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

guest

回答3

0

ご返信頂いた方々、ありがとうございます。
解決に直接関係したわけではないですが、なんか応援されているような気がして、1つ1つを地味に探ってみました。

根本解決ではないのですが、メソッドに bcc を加えると本番環境(EC2)だけ処理さていないことがわかりました。

動かない
Mail::send(['text' => 'viewファイル名'], ['body' => $email['body']], function ($m) use ($email) { $m->to($email['address'], $email['name']) ->bcc($email['bcc'], $email['bccname']) ->subject($email['subject']); });
動いた
Mail::send(['text' => 'viewファイル名'], ['body' => $email['body']], function ($m) use ($email) { $m->to($email['address'], $email['name']) ->subject($email['subject']); });

bccには正常に値が入っているように見え、開発と本番との違いがわからず、なぜエラー(?)となるのかわかりませんが、場所は特定できたのと、最悪はbccを入れなければ動くようなので、こちらの質問は解決として処理します。

解決できず、不自由が出た際には、Laravelのメールで bcc が入れられないといった別トピックとして切り出します。
御覧頂いた方々、ありがとうございますm(_ _)m

投稿2016/02/26 06:35

hirolog

総合スコア32

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

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

0

セキュリティグループの設定で、
465ポートの送信を許容していないとかはないですか?

追記
プログラム上問題ないのであれば、環境問題と思います。
ネットワーク関連の問題ではないでしょうか?

投稿2016/02/26 05:19

編集2016/02/26 05:21
hato_pato

総合スコア215

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

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

hirolog

2016/02/26 05:23

ご返信ありがとうございます。 そう、それを疑いますよね、AWSを使っている場合。 メール送信は "アウトバウンド" の方だと思うのですが、標準のままポートは全て空いております。 (インバウンドはもちろん制限かけてます) 念のため、インバウンドもアウトバウンドも、あえてポートを具体的に指定して開放して試してみました。が、状況変わらずです x_x
hato_pato

2016/02/26 05:27 編集

Linuxのiptablesもあいてます? パケットキャプチャで見たら早いかもしれないですね。
guest

0

一点もしかしたらと思ったので一応。
Mail::sendの第1引数はviewファイル,第2引数はそのviewに渡すデータですがその点は問題無いですか?

投稿2016/02/26 04:57

fagai

総合スコア2158

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

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

hirolog

2016/02/26 05:07

ご返信ありがとうございます。 が…残念ながら、sendの書式は問題ないと思います。 開発環境では動いておりましたし、書式が違うとエラーを吐き出すので、今回のようにどこかで止まって無反応にはならないようです。 (念のためですが、laterを呼ぶときはダミーで秒数も入れてます) Mailer.phpを見てみると ``` public function raw($text, $callback) { return $this->send(['raw' => $text], [], $callback); } ``` ``` public function send($view, array $data, $callback) { $this->forceReconnection(); list($view, $plain, $raw) = $this->parseView($view); $data['message'] = $message = $this->createMessage(); $this->addContent($message, $view, $plain, $raw, $data); $this->callMessageBuilder($callback, $message); if (isset($this->to['address'])) { $message->to($this->to['address'], $this->to['name'], true); } $message = $message->getSwiftMessage(); return $this->sendSwiftMessage($message); } ``` となっているようなので、SwiftMessageの処理で止まってるのかと勝手に推測してるのですが。。。未だ解決に至らずです(T_T
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問