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

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

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

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

Q&A

1回答

1287閲覧

Laravel6.20.27 Gmail Timed Out

k0302

総合スコア0

Laravel 5

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

0グッド

0クリップ

投稿2021/07/06 15:49

【環境について】
ホストOS:CentOS7.9
Laravel: dockerにて稼働

ホストOSでnginxを稼働させ、dokcer上のapacheへ転送しています。
nginx(ホストOS上)→apache(docker上)→Laravel(docker上)

【内容】
Laravel6.20.27にてPOST送信されたファイルや内容をGメールにて送信するシステムを作成しました。
しかし、問題なく正常に動くパターンと動かないパターンがある事に気づきました。
正常終了していない場合は"Connection to tcp://smtp.gmail.com:587 Timed Out"とログに出力されます。

正常終了した場合と正常終了しなかった場合を見比べてみると添付されたファイルサイズが大きい場合に上記ログが出力されている様に感じます。

Gmailの最大添付サイズが25MBとの事だったので、
POST送信されたファイルサイズの合計が15MBを超えた場合は、分割してメールを送信する様にしてみたのですが解消されません。
TimedOutでメール送信できないことを回避したいと考えています。

いろいろ検索し、試してみましたが解決できません。
分かる方、ご教授いただけますと幸いです。

備考
このシステムは1日あたり、約300件ほどのアクセスがあり、アクセスが重複した場合に処理しきれないのでは無いかとも
考えているのですが、わかりません。

コントローラのソース

public function exec(Request $req) { // bladeに渡す値 設定 $data = [ "req" => $req, ]; // デフォルト戻り値設定 $json = [ 'ErrorCode' => 0, 'Message' => "処理を正常終了しました。" ]; // 各支店メールアドレスリスト設定 $siten_mails = $this->GetMailList(); // メール情報 $staff_name = $req->keys()[2]; $staff_name = $req->$staff_name; $mail = [ 'blade_name' => 'mail.default', 'from' => 'XXXXXXXX@gmail.com', 'to' => [], 'cc' => [], 'bcc' => [], 'subject' => 'TEST', 'attachments' => [], ]; // 支店のメールアドレスを設定 $siten_check_flag = false; if(preg_match('/1/', $this->DEBUGMODE_FLG)) { array_push($mail['to'], ['email' => 'XXXX@gmail.com']); array_push($mail['cc'], ['email' => 'XXXX@gmail.com']); $siten_check_flag = true; } else { foreach(array_keys($siten_mails) as $siten_name) { // 支店名一致 if( !strcmp($req->siten, $siten_name) ) { $siten_check_flag = true; // 一致した支店のTO配列を取得 foreach($siten_mails[$siten_name]["to"] as $to) { array_push($mail['to'], $to); } // 一致した支店のCC配列を取得 foreach($siten_mails[$siten_name]["cc"] as $cc) { array_push($mail['cc'], $cc); } // 一致した支店のBCC配列を取得 foreach($siten_mails[$siten_name]["bcc"] as $bcc) { array_push($mail['bcc'], $bcc); } } } } // ファイルをメールに添付 $FileSize = 0; $FileSizeMax = 15000000; foreach($req->allFiles() as $file) { // ファイル保存 $file_path = $file->storeAs('uploads', $file->hashName()); // ログ出力 (ファイル情報) Log::info("ファイル情報", [ "POST_ID" => $post_id, "OriginalName" => $file->getClientOriginalName(), "HashName" => $file->hashName(), "FileSize" => $file->getSize() ]); // ファイル添付 $FileSize += $file->getSize(); if($FileSizeMax <= $FileSize) { // メール送信 try { Mail::send(new sendmail($mail, $req)); // ログ出力 Log::info("メール送信成功", [ "POST_ID" => $post_id, "MAIL" => $mail, ]); } catch(\Exception $e) { // ファイル削除 $this->DeleteFile($req, $pdfname, $post_id); // ログ出力 Log::error("メール送信失敗", [ "POST_ID" => $post_id, "Error" => $e->getMessage() ]); // 戻り値返却 $json["ErrorCode"] = -3; $json["Message"] = "メールの送信に失敗しました"; return $json; } // 添付ファイル配列を空にする $mail['attachments'] = array(); // 合計ファイルサイズを0に戻す $FileSize = 0; } // 配列にファイルPUSH array_push( $mail['attachments'], [ storage_path('app/uploads/') . $file->hashName(), $file->getClientOriginalName() ] ); } // メール送信 try { Mail::send(new sendmail($mail, $req)); // ログ出力 Log::info("メール送信成功", [ "POST_ID" => $post_id, "MAIL" => $mail, ]); } catch(\Exception $e) { // ファイル削除 $this->DeleteFile($req, $pdfname, $post_id); // ログ出力 Log::error("メール送信失敗", [ "POST_ID" => $post_id, "Error" => $e->getMessage() ]); // 戻り値返却 $json["ErrorCode"] = -3; $json["Message"] = "メールの送信に失敗しました"; return $json; } // ファイル削除 $this->DeleteFile($req, $pdfname, $post_id); return json_encode($json); }

mail.php

<?php return [ 'driver' => env('MAIL_DRIVER', 'smtp'), 'host' => env('MAIL_HOST', 'smtp.mailgun.org'), 'port' => env('MAIL_PORT', 587), 'from' => [ 'address' => env('MAIL_FROM_ADDRESS', 'XXXX@gmail.com'), 'name' => env('MAIL_FROM_NAME', 'HOGE'), ], 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'sendmail' => '/usr/sbin/sendmail -bs', 'markdown' => [ 'theme' => 'default', 'paths' => [ resource_path('views/vendor/mail'), ], ], 'log_channel' => env('MAIL_LOG_CHANNEL'), ];

.env

APP_NAME=Laravel APP_ENV=production APP_KEY=base64:XXXXXXXXX APP_DEBUG=false APP_URL=http://localhost LOG_CHANNEL=stack DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=laravel_db DB_USERNAME=laravel_user DB_PASSWORD=laravel_pass BROADCAST_DRIVER=log CACHE_DRIVER=file QUEUE_CONNECTION=sync SESSION_DRIVER=file SESSION_LIFETIME=300 REDIS_HOST=127.0.0.1 REDIS_PASSWORD=null REDIS_PORT=6379 MAIL_DRIVER=smtp MAIL_HOST=smtp.gmail.com MAIL_PORT=587 MAIL_USERNAME=XXXX@gmail.com MAIL_PASSWORD=XXXXXXX MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=XXXX@gmail.com MAIL_FROM_NAME="${APP_NAME}" AWS_ACCESS_KEY_ID= AWS_SECRET_ACCESS_KEY= AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= PUSHER_APP_ID= PUSHER_APP_KEY= PUSHER_APP_SECRET= PUSHER_APP_CLUSTER=mt1 MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}" MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

docker-compose.yml

version: '3' services: phpmyadmin: image: phpmyadmin/phpmyadmin:latest container_name: phpmyadmin environment: - PMA_ARBITRARY=1 - PMA_HOSTS=db - PMA_USER=laravel_user - PMA_PASSWORD=laravel_pass ports: - 8888:80 app: ports: - "3000:80" build: ./app container_name: laravel_app volumes: - ./src:/var/www/html db: image: mysql:5.7 container_name: laravel_db environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: laravel_db MYSQL_USER: laravel_user MYSQL_PASSWORD: laravel_pass TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci volumes: - ./db/data:/var/lib/mysql - ./db/my.cnf:/etc/mysql/conf.d/my.cnf ports: - 3306:3306

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

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

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

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

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

guest

回答1

0

正常終了していない場合は"Connection to tcp://smtp.gmail.com:587 Timed Out"とログに出力されます。

こちらの原因は開示されたソースコードだけではちょっと分からないのですが、

このシステムは1日あたり、約300件ほどのアクセスがあり、アクセスが重複した場合に処理しきれないのでは無いかとも

考えているのですが、わかりません。

メール送信のような重い処理は非同期処理にしてQueueに入れて1件ずつ処理するといいかもしれません。これでTimed Outが直るかどうかは分かりませんが・・・

参考)
https://readouble.com/laravel/6.x/ja/queues.html

投稿2021/07/06 16:46

AbeTakashi

総合スコア4853

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問