[DockerでLAMP開発環境] GmailのSMTPサーバを経由してメール送信したい!

送信だけできればいいので送信専用の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.');