DockerとPHPとMailHogとiPhoneで、遊ぼう!

投稿者:

はじめに

うーむ。いつ書いたか忘れたような純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

  1. iPhoneとMacBookを同じWi-Fi環境に繋ぐ
  2. MacBookのIPを調べる
  3. iPhoneからMacBookのIP:ポートにアクセス

よし容易く見えた。これで野球見て終わるくらいまでバリデート画面を放置。

結果

… safariのフォームを埋めるだけ埋めて、野球どころかたっぷり一晩寝かせてからsubmitしたんだけど、ちゃんとメール発信できたよ
(´・ω・`)

送信済みページをリロードとかリダイレクトしているのではないか

↑ これは先方で修正してくれた

これの先方での修正前に、リロードしてしまったのが関の山ではなかろうか…

最後に

やだ、前のポスト、1年以上前…!
何、鯖代を無駄にしてんの私w

これ結局動いたんだけど、多分何かしら陳腐化してるなぁ(思い出したからまとめる)
ついでにECRを使ってたからAWSのみかじめが上がった筈なんだけど、確定申告の時に忘れてたっぽいw

参考資料

https://www.akindo2000.net/blog/website/docker_php/

https://qiita.com/ran/items/0dede7d3f28601b2ad96

https://qiita.com/ko-zi/items/11337ad8e44e5561010d

https://qiita.com/TeppeiMimachi/items/8f19e111cd1766a7d084

コメントを残す