送信だけできればいいので送信専用のMTA「sSMTP」を使用します。
2019.09 sSMTPは使用できなくなったことがわかりました。代わりにMSMTPを使用した記事「DockerでWordPress開発環境/MSMTPでGmail経由メール送信」をご参照ください。
[プロジェクト] ┣ conf/ ┃ ┣ php/ ┃ ┃ ┗ php.ini ┃ ┗ ssmtp/ ┃ ┗ ssmtp.conf ┣ html/ ┃ ┗ text-mail.html ┣ docker-compose.yml ┗ Dockerfile
docker-compose.yml
version: '3'
services:
mysql:
image: mysql:5.7
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: mypass
volumes:
- ./mysql:/var/lib/mysql
command: --innodb-use-native-aio=0 // 2019.09 この行は不要になっています
web:
build: .
ports:
- "80:80"
volumes:
- ./html:/var/www/html
depends_on:
- mysql
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=mypass
links:
- mysql
ports:
- 8080:80
volumes:
- /sessions
// php.iniにメール設定追加
conf/php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"
[Mail]
sendmail_path = "/usr/sbin/sendmail -t"
// ssmtp.confにGmailの情報を設定
conf/ssmtp.conf
root=*****@gmail.com
mailhub=smtp.gmail.com:587
rewriteDomain=gmail.com
hostname=test.localhost
AuthUser=*****@gmail.com
AuthPass=*****
AuthMethod=LOGIN
UseSTARTTLS=YES
FromLineOverride=YES
※改行文字は「LF」のみ!
sendmail: Server didn’t like our AUTH LOGIN (530 5.7.0 Must issue a STARTTLS command first. l3-v6sm18819292pff.8 – gsmtp)
Docker側で元々あったssmtp.confファイルを編集したらOKなのにWindows側でファイル作ったら上記エラーが出たよ。
これはハマったので書いておくw
// Dockerfile作成
Dockerfile
FROM php:7.2-apache
RUN apt-get update
# php.iniを読み込ませる
COPY ./conf/php/php.ini /usr/local/etc/php
# sSMTPをインストール
RUN apt-get install -y ssmtp
# 設定ファイルを読ませる
COPY ./conf/ssmtp/ssmtp.conf /etc/ssmtp
# 元々のパーミッション644に設定
RUN chmod 644 /etc/ssmtp/ssmtp.conf
buildオプションをつけて起動!
$ docker-compose up -d --build
※赤字で以下のメッセージが出るが特に必要ないらしいので無視!
debconf: delaying package configuration, since apt-utils is not installed
html/test-mail.txt
To:*****@gmail.com
From:*****@gmail.com
Subject: Test
This is a test mail.
// コンテナに入る
$ docker exec -it lamp_web_1 /bin/bash
// メール送信テスト
# /usr/sbin/sendmail -t < test-mail.txt
※Gmailアカウントでの安全性の低いアプリの許可は言うまでもなく・・・
PHPからもメール関数で送信テスト
<?php
mail('*****@gmail.com', 'Test', 'This is a test mail.');