docker-composeとdjangoとpostfixの構築ログ


はじめに

mailホストにubuntu:16.04とpostfixを入れて、
webホストのdjangoからpostfixを利用したい。

Dockerfileでpostfixのインストール

Dockerfileでapt-get install -y postfixにコケる。プロンプトが出るので失敗する。
ENV DEBIAN_FRONTEND noninteractiveをDockerfileに記述したらプロンプトが出なくなった。

送信テスト

コンテナにログイン後、postfix をスタートして

# service postfix start

sendmail コマンドを使って外部にメールを送信すると届いている(Gmailに送信した)。

# sendmail MY-EMAIL-ADDRESS
From:@
To:MY-EMAIL-ADDRESS
Subject:test-send
test-body

Gmailには /etc/postfix/main.cf の myhostname からのメールだと表示されている。

Django(別ホスト)からの利用

djangoのホストからsend_mailを使って、postfixのホストを利用してメールを送信しようとする。django側にはEMAIL_HOSTとEMAIL_PORTを設定。
しかし送信しようとすると以下のエラー。

SMTPRecipientsRefused at /xxx/
{'[email protected]': (454, b'4.7.1 <[email protected]>: Relay access denied')}

以下を見つける。

エラーのお色直し

/etc/postfix/main.cf の smtpd_relay_restrictions を以下のように変更。

#smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination

service postfix reload 後に再度 django 側から send_mail で送信すると以下のエラー。
一見すると同じエラーに見えるが 454 が 554 に変わっている。smtpd_relay_restrictions の変更が影響している。

SMTPRecipientsRefused at /xxx/
{'[email protected]': (554, b'5.7.1 <[email protected]>: Relay access denied')}

SMTPの悩み

Host to Host で web ホストから mail ホストを利用する形になると、ホスト間の認証が必要になる。認証はSMTP認証で、djangoでもEMAIL_HOST_USERとEMAIL_HOST_PASSWORDがSMTP認証用に用意されている。
ホストを二つにしているので認証が必要になるが、ホストを一つにしてしまったら認証が必要なくなるかもしれない。

ホストを一つにする

docker-composeのホストをwebひとつにして、webにpostfixをインストールしてみる。送信だけならそっちのほうが楽かもしれない。

DjangoのEMAIL_HOSTの設定

djangoのEMAIL_HOSTに'localhost'を設定。djangoとpostfixは同じホストにインストールされている。

送信成功

無事にsend_mailが成功した。やはりホストを複数にしていたため、SMTP認証分の手間が増えていたようだ。ホストを一つにしてlocalhostから送信できるようにすると手間が少なくて済んだ。

結論

docker-composeでpostfixを利用したい場合、マルチホストにするとSMTP認証の設定の手間が増える。
シングルホストにするとSMTP認証の設定が必要なくなって構築が少し楽になる。

参考