Help us understand the problem. What is going on with this article?

Docker環境のMailDevでSMTP認証をする

More than 1 year has passed since last update.

Docker初心者なので個人的な備忘録として。。。

はじめに

メール配信は、Sendmail/SMTPの両方に対応しないといけません。
そして、SMTP配信を使う場合は、SMTP Authを使っての認証を使うことが欠かせません。

このためSMTP Authの開発・テスト環境を作っていきます。

前回作成した、DockerでPHP-alpineのメール配信テスト(SMTP/sendmail)環境を構築するをベースに、step10-php5-xdebug-redis-mail3として作成していきます。

TL;DR

GitHub上のサンプルコードのStep10をご覧ください。
step10-php5-xdebug-redis-mail3

MailDevのSMTP Auth対応

SMTP Authへの対応は、MailDevのUsageに書いています。
MailDevの起動オプションに、「--incoming-user」と「--incoming-pass」をつければいいそうです。

maildev [options]

  -h, --help                      output usage information
  -V, --version                   output the version number
  -s, --smtp <port>               SMTP port to catch emails [1025]
  -w, --web <port>                Port to run the Web GUI [1080]
・・・省略・・・
  --incoming-user <user>          SMTP user for incoming emails
  --incoming-pass <pass>          SMTP password for incoming emails
・・・省略・・・
  -o, --open                      Open the Web GUI after startup
  -v, --verbose
  --silent

ここまではわかるのですが、じゃ、Dockerとしてはどうしたらいいの?ってなりました。

MailDevのDockerHubに記載されているDockerfileを見ると、最後に「CMD ["bin/maildev", "--web", "80", "--smtp", "25"]」という記載があります。

MailDevのデフォルトのDockerfile
FROM node:6-alpine
MAINTAINER "Dan Farrelly <daniel.j.farrelly@gmail.com>"

ENV NODE_ENV production

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ADD package.json /usr/src/app/

RUN npm install && \
    npm prune && \
    npm cache clean \
    rm -rf /tmp/*

ADD . /usr/src/app/

EXPOSE 80 25

CMD ["bin/maildev", "--web", "80", "--smtp", "25"]

ここを書き換えてImageを作り直すのかな?ってとも思いました。

さらに調査すると、docker-compose.ymlでcommandという形で指定ができることがわかりました。

step10のdocker-compose.ymlを以下のように書き換えます。
SMTP AUTHのID/PWは変更する可能性があるので環境変数指定にします。

docker-compose.yml
version: '3'
services:
・・・省略・・・
  maildev:
    image: kanemu/maildev-with-iconv
    command: bin/maildev -w 80 -s 25 --incoming-user ${SMTP_USER} --incoming-pass ${SMTP_PASSWORD}
    ports:
      - "1025:25"
      - "8025:80"
・・・省略・・・

.envファイルにID/PWを追記します。

.env
MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_DATABASE=step3
MYSQL_USER=db_user
MYSQL_PASSWORD=password

# REDIS関係
REDIS_PORT=6379
REDIS_PASSWORD=password

# Mail <-ここ
SMTP_USER=smtpuser
SMTP_PASSWORD=password

次にsendmailの役割を担っているssmtp.confにもSMTP Authの設定を追記します。
ちなみに、直接記述していますが、環境変数で指定ができるといいんですけど、いい方法はないでしょうか?
まぁ、最終手段として、.envを見てssmtp.confを生成するスクリプトを作成すればよいのですが。。。

app/ssmtp.conf
root=postmaster
mailhub=maildev:25
hostname=app
FromLineOverride=YES

AuthUser=smtpuser
AuthPass=password
AuthMethod=LOGIN

最後に、サンプルファイルであるindex.phpのSMTP送信部分を書き換えます。
sendmailの方は、SMTP Authをssmtpが対応してくれましたので、修正はありません。

data/html/index.php
        use PHPMailer\PHPMailer\PHPMailer;
        use PHPMailer\PHPMailer\Exception;

        // Load Composer's autoloader
        require 'vendor/autoload.php';

        // Instantiation and passing `true` enables exceptions
        $mail = new PHPMailer;

        try {
            //Server settings
            echo '<pre class="log">';
            echo 'SMTPでメール配信' . PHP_EOL;

            $mail->SMTPDebug = 2;                                       // Enable verbose debug output
            $mail->isSMTP();                                            // Set mailer to use SMTP
            $mail->Host       = 'maildev';  // Specify main and backup SMTP servers
            $mail->SMTPAuth   = true;                                   // Enable SMTP authentication
            $mail->Username   = getenv('SMTP_USER');                     // SMTP username
            $mail->Password   = getenv('SMTP_PASSWORD');                               // SMTP password
            $mail->SMTPSecure = false;                                  // Enable TLS encryption, `ssl` also accepted
            $mail->SMTPAutoTLS = false;
            $mail->Port       = 25;                                    // TCP port to connect to

            //Recipients
            $mail->setFrom('from@example.com', mb_encode_mimeheader('日本語送信者名SMTP AUTH'));
            $mail->addAddress('smtp@example.net', mb_encode_mimeheader('日本語受信者名SMTP AUTH'));     // Add a recipient

テスト

127.0.0.1にアクセスすると、SMTP/Sendmailでメールが1通ずつ送信されます。
127.0.0.1:8025にアクセスをして、2通のメールの受信ができればOKです。

2019-06-16_10h33_35.png

まとめ

これで一般的なメールのテストに対応ができると思います。

idani
井谷(いだに)と申します。 前職では、cakePHPとjQueryとVue.jsを使って、メール配信、SMS配信、セミナー募集システム、かんたんな決済処理、アフィリエイトシステムなどを開発していました。 使える言語は、C、C++、Perl、C#、PHP、JSになります。 昔々、Gentoo Linuxの翻訳作業をしていました。
https://hirotae.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away