はじめに
うーむ。いつ書いたか忘れたような純PHPのソースコードの修正依頼が舞い込んだぞ。
しかもなんか急に不具合が出るようになったそうな。ふぅむ…
状況を解析
やってることは至って単純で、フォームメールをバリデートしながら特定のメルアドに送るのみ。
データベースへの書き出しも行わない。
動作環境はX-Server(つまりサーバで動いてるPHPは最新)
先方がSPFレコードとか理解があり、設定済み
但し、突如本文が空のメールがいつもではなく、まだらに届くようになったらしい。
加えて本文が空な場合は、3秒後に追って空メールが届くらしい。怖いよ。
X-Serverのコンパネの情報をもらっていないので、ローカルのdockerで環境を再現。
環境再現
要件としては、以下のとおり
- PHP
- mailhog
せっかちなのでファイル構成から大公開。黒く伏せたところはいただいたファイル。
めいめいのファイルの中身は以下のとおり。
version: '3' services: php: image: php:7.2-apache build: context: ./ dockerfile: php/docker/Dockerfile volumes: - .:/var/www/html ports: - 8000:80 container_name: php7.2-trial2 mailhog: image: mailhog/mailhog ports: - 8025:8025
FROM php:7.2-apache WORKDIR /var/www/html RUN curl -sSL https://github.com/mailhog/mhsendmail/releases/download/v0.2.0/mhsendmail_linux_amd64 -o mhsendmail \ && chmod +x mhsendmail \ && mv mhsendmail /usr/local/bin/mhsendmail COPY ./php/docker/php.ini /usr/local/etc/php/
[mail function] ; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). ; http://php.net/sendmail-path ; sendmail_path = /usr/sbin/sendmail -t -i ; 以下に書き換え sendmail_path = "/usr/local/bin/mhsendmail --smtp-addr=mailhog:1025"
まず以上の構成でファイルを用意して、
$ docker-compose up -d
そ〜れそれ実行。
http://localhost:8000/ forbidden
…うん、index.htmlもindex.phpもいないからね(´・ω・`)
気を取り直して、メールの発信確認を行うよ
https://qiita.com/ko-zi/items/11337ad8e44e5561010d
http://localhost:8025/# で受信確認。
再現はできた。
但しこの段階では再現はしないし、何にもわからずじまい(´・ω・`)
原因の考察
以下の原因が考えられた。
- バリデートおよび入力内容確認にワンクッション置いているので、そこで渡すpost変数名を間違えている
↑ これだとメール本文がまだらに入らない理由がわからない - ガベージコレクションではなかろうか
↑ フォーム内容は実にコンパクト。そうそう起こるかな? - 送信済みページをリロードとかリダイレクトしているのではないか
↑ これは先方で修正してくれた
…わからん…
先方の環境で試させてもらっても、再現しない…
と思ってると先方が何か思い出した模様
スマホのブラウザでバリデートまで表示したところで、長時間放置して後に送信ボタンを押したのではないか
あースマホで寝落ち…朝起きたら育成途中(ウマ娘)…あるある…。
その線で再現を試みる。やはりDockerで。
スマホからDockerにアクセスしてみる
手順的にはこちらに従う。
https://qiita.com/TeppeiMimachi/items/8f19e111cd1766a7d084
- iPhoneとMacBookを同じWi-Fi環境に繋ぐ
- MacBookのIPを調べる
- iPhoneからMacBookのIP:ポートにアクセス
よし容易く見えた。これで野球見て終わるくらいまでバリデート画面を放置。
結果
… safariのフォームを埋めるだけ埋めて、野球どころかたっぷり一晩寝かせてからsubmitしたんだけど、ちゃんとメール発信できたよ
(´・ω・`)
送信済みページをリロードとかリダイレクトしているのではないか
↑ これは先方で修正してくれた
これの先方での修正前に、リロードしてしまったのが関の山ではなかろうか…
最後に
やだ、前のポスト、1年以上前…!
何、鯖代を無駄にしてんの私w
これ結局動いたんだけど、多分何かしら陳腐化してるなぁ(思い出したからまとめる)
ついでにECRを使ってたからAWSのみかじめが上がった筈なんだけど、確定申告の時に忘れてたっぽいw
参考資料
https://www.akindo2000.net/blog/website/docker_php/
https://qiita.com/ran/items/0dede7d3f28601b2ad96