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

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

ただいまの
回答率

89.64%

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

受付中

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,733

hirolog

score 28

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)の問題...でしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

ご返信頂いた方々、ありがとうございます。
解決に直接関係したわけではないですが、なんか応援されているような気がして、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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/26 14: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

    キャンセル

0

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/26 14:23

    ご返信ありがとうございます。

    そう、それを疑いますよね、AWSを使っている場合。
    メール送信は "アウトバウンド" の方だと思うのですが、標準のままポートは全て空いております。
    (インバウンドはもちろん制限かけてます)

    念のため、インバウンドもアウトバウンドも、あえてポートを具体的に指定して開放して試してみました。が、状況変わらずです x_x

    キャンセル

  • 2016/02/26 14:27 編集

    Linuxのiptablesもあいてます?

    パケットキャプチャで見たら早いかもしれないですね。

    キャンセル

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

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる