【環境について】
ホスト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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。