CakePHP3でShellでメール送信できなかった話

2019/12/17 2019/12/18 #PHP #CakePHP3 #シェル #メール #Gmail #relay

CakePHP3でShellでメール送信するときに気をつけること

こんにちは。Nonです。
今回は僕がCakePHP3でメール送信する際にハマったときのことを書こうと思います。

ちょっと重ための処理をシェルで実行した後、メール送信する処理を作った話。

ハマる前に少しだけ前提知識を書くと、ちょっと重ための処理が合ったのですが、これをユーザーに待たせるのは避けたく、バックグラウンド(シェル)で実行して、その完了通知をメールで通知しようという処理があったのです。

そのときに、メールが送信できない現象が発生しました。

Gsuiteのrelayを使用していますので、他の人はこの現象発生しないかも?

結論

config/app.phpEmail設定にclientは指定しておいたほうが吉。

'EmailTransport' => [
    'default' => [
        'className' => 'Smtp',
        // The following keys are used in SMTP transports
        'host' => 'smtp-relay.gmail.com',
        'port' => 587,
        'timeout' => 30,
        // ここNULLは避ける↓
        // 'client' => null,
        // ここドメインを指定↓
        'client' => 'example.com'
        'tls' => true,
    ],
],

何故か?

/vendor/cakephp/cakephp/src/Mailer/Transport/SmtpTransport.php

protected function _connect()
{
    $this->_generateSocket();
    if (!$this->_socket->connect()) {
        throw new SocketException('Unable to connect to SMTP server.');
    }
    $this->_smtpSend(null, '220');

    $config = $this->_config;

    if (isset($config['client'])) {
        $host = $config['client'];
    } elseif ($httpHost = env('HTTP_HOST')) {
        // ここ$config['client']がNULLだったら設定されたドメイン
        list($host) = explode(':', $httpHost);
    } else {
        $host = 'localhost';
    }
    ...
}

clientが存在しなければ環境変数HTTP_HOSTclient、それ以外ならlocalhostとして設定され、接続されます。

このときの環境変数HTTP_HOSTですが、諸事情により自分で設定した違うドメイン(購入していないローカルPCだけのドメイン)でした。

さらに本番環境でShellを実行すると、環境変数が強制的にLocalになってしまう始末。。。(皆さんはちゃんとプログラムで制御してください。)

まぁlocalhost.test.comで接続なんて許されませんよねw
それに仮にlocalhostで接続したとして、Gmailがlocalhostでの接続を許してくれるのでしょうか?
これは検証する必要があるかもしれません。

最後に

今回は短めでしたが、CakePHP3のソースを追わないとわからない内容だったと思います。
皆さんの力になれれば嬉しいです。

ところで

'client' => 'example.com'

で設定してもうまくいくのでしょうか?私の修正後のコードはセキュリティの観点からお見せすることはできませんが、購入したサーバーに接続できるhostでした。
仮にここにlocalhost.test.comを入れた送信できないのでしょうかね?(まぁできないと思う。)

最近ちょっとした処理でフレームワークの処理を追うことになったので、こういったニッチな解決法を発見したら、今後も記事にしていきたいと思います。

その時はよしなに。

.

のん

所属 : 株式会社スマレジ 開発部

YouTube : のんラボ

Twitter : @nonz250

Github : nonz250

Qiita : @nonz250

My Qiita posts My Qiita contributions My Qiita followers

主にPHPを使用し、サーバーサイドを担当。最近はフロントにも興味津々。

なにかを作ったりいじったりするのが好きで、個人開発なども行っている。

趣味はバイクアイコン画像は大抵愛車の「Z250」である。友達にアイコン描いてもらえて嬉しい。

PHP / Laravel / CakePHP2 / CakePHP3 / Vue / Nuxt / C# / etc...

Tags

#のんラボ #Laravel #Vue #個人開発 #ブログ #プログラミング #javascript #Html5 #WEBサービス #Twitter #今年の抱負メーカー #勉強方法 #PWA #モバイルアプリ #Android #ツーリング #バイクに乗るエンジニア #Z250 #秋吉台 #能登半島 #バイク #冒険 #東尋坊 #Squid #リバースプロキシ #hosts #axios #cropper #AdSense #Bootstrap #MySQL #高速化 #トドTask #Telescope #デバッグ #composer #テスト #セキュリティ #POSレジ #スマレジ #本部機能 #バリデーション #入力チェック #Mac #Chrome #テスト駆動開発 #開発手法 #UI #デザイン #WEBサイト #機能美 #PHP #Laravel 6 #コメント #バージョンアップ #vue-cli #localhost #BIツール #売上分析 #TANAX #MFK250 #ツアーシェルケース2 #RESTful #API #REST API #実務的 #PHP Tech Tutor #Smaregi Tech Talk #勉強会 # ブログ #CakePHP3 #CSRF #VSCode #開発環境 #CakePHP3.0 #さくらのレンタルサーバー #モジュールモード #シェル #メール #Gmail #relay #OGP #エラーページ #抱負 #家庭教師 #ドメイン駆動設計 #DDD #読書会 #那智の滝 #伊勢志摩 #伊勢志摩スカイライン #フロント #三方五湖 #レインボーライン #ボーイスカウト・ルール #プログラマが知るべき97のこと #リファクタリング #ユビキタス言語 #車輪の再発明 #マイクロサービス #デプロイ #QA #laravel-mix #Tips #storybook #@storybook/addon-actions #昇降デスク #コードレス #書斎 #オフィス #リモートワーク #働き方 #エラーハンドリング #スマレジ4 #pixel 5 #レビュー #スマレコ #TDD #RSS #404 #高山ダム #ラーツー #React #Nuxt #node_modules #エラー #インポート #設定方法 #環境構築 #Docker #フォレストパーク神野山 #学生向け #PR #採用