DockerでWordPress開発環境/MSMTPでGmail経由メール送信

Dockerでのメール送信に送信専用MTA「sSMTP」を使用していましたがBuildすると

Package ssmtp is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

と使用できなくなったので代わりに「MSMTP」を使用してメール送信します。

ディレクトリ構成

[プロジェクト]
┠ html
┃  ┗ text-mail.html
┠ mysql (起動時に自動生成されます
┠ docker-compose.yml
┠ Dockerfile
┠ msmtprc
┗ php.ini

docker-compose.yml

Dockerのコンテナ定義ファイルdocker-compose.ymlを作ります。
MySQLとWordPressそしてphpmyadminで構成します。

version: '3'
services:
  mysql:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: pass
    volumes:
      - ./mysql:/var/lib/mysql

  wp:
    build: .
    environment:
      WORDPRESS_DB_PASSWORD: pass
      WORDPRESS_DB_USER: root
      WORDPRESS_DB_HOST: mysql:3306
      WORDPRESS_DB_NAME: wp
    ports:
      - "80:80"
    links:
      - mysql
    volumes:
      - ./html:/var/www/html

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=pass
    links:
      - mysql
    ports:
      - '8080:80'
    volumes:
      - /sessions

WordPressコンテナwpはカスタマイズしてbuildするとしてカレントディレクトリにDockerfileを置くので「build: .」とします。

Dockerfile

WordPressコンテナwpをカスタマイズするためDockerfileを作ります。

FROM wordpress

RUN apt-get update

# MSMTPとvimをインストール
RUN apt-get install -y msmtp msmtp-mta vim

# MSMTPの設定ファイルを読ませる
COPY ./msmtprc /etc/msmtprc
# パーミッション設定
RUN chown www-data:www-data /etc/msmtprc
RUN chmod 600 /etc/msmtprc

# php.iniを読み込ませる
COPY ./php.ini /usr/local/etc/php

※msmtpの実行パスは/usr/bin/msmtpだがmsmtp-mtaをインストールすることでsendmailのエイリアスが作成され実行パスをsendmailに合わせてくれるらしい。
※パーミッション設定でオーナーをapache実行ユーザのwww-dataにしないとブラウザからのメール送信ができません。

php.ini

コンテナ標準のphp.iniに変更を加えます。

[Date]
date.timezone = "Asia/Tokyo"

[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

[Mail]
sendmail_path = "/usr/sbin/sendmail -t"

※msmtp-mtaをインストールしない場合は以下に変更すればできると思われる。

[Mail]
sendmail_path = "/usr/bin/msmtp -t"

メール送信テストファイルも用意しておきます

html/test-mail.txt

To:xxxxxxxx@gmail.com
From:xxxxxxxx@gmail.com
Subject: Test

This is a test mail.

msmtprc

MSMTPの設定ファイルmsmtprcも読み込ませます。

# Set default values for all following accounts.
defaults
auth on
tls on
tls_starttls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
tls_certcheck off		# TLS no check※
aliases /etc/aliases
logfile /var/log/msmtp.log

# Gmail
account gmail
host smtp.gmail.com
port 587
from xxxxxxxx@gmail.com
user xxxxxxxx@gmail.com
password xxxxxxxx

# set a default account
account default : gmail

※TLS認証チェックをONにしておくと

sendmail: TLS certificate verification failed: The certificate is NOT trusted. The certificate issuer is unknown.
sendmail: could not send mail (account default from /etc/msmtprc)

となり信用できないと怒られたので tls_certcheck off としました。

起動

PS C:\lamp\wp> docker-compose up -d --build

※初回はbuildオプションをつけて。
次回からは

PS C:\lamp\wp> docker-compose up -d

※php.iniやmsmtprcなど外部から読み込ませるファイルを変更した場合はbuildが必要です。

メール送信テスト

wpコンテナに入ってsendmailを実行します。

PS C:\lamp\wp> docker-compose exec wp bash
root@e374d1e82b46:/var/www/html# /usr/sbin/sendmail -t < test-mail.txt

※msmtp-mtaをインストールしない場合は「/usr/sbin/sendmail」を「/usr/bin/msmtp」に変更すれば送信できると思われる。

WordPressインストール

http://localhost にアクセスしてWordPressをインストールしましょう。

終了

Dockerの全コンテナ停止します。

PS C:\lamp\wp> docker-compose down