はじめに
オープンソースにてMTA機能を提供するPostfix(ポストフィックス)をコンテナ上で用意し、telnetで通信した結果をログとして残しました。コンテナ実行環境のOSとしてはLinux(Debian)です。
コマンド環境情報
# cat /etc/os-release PRETTY_NAME="Debian GNU/Linux 9 (stretch)" ... # docker --version Docker version 19.03.5, build 633a0ea838
SMTPサーバを立ち上げる
以下にてイメージを取得し、ポート25でコンテナを起動します。
# docker run -d -p 25:25 \ > --name mailserver \ > -e maildomain=hoge \ > -e smtp_user=user:password \ > catatnight/postfix
以下のようにコンテナが起動されました。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 86d111ea9bca catatnight/postfix "/bin/sh -c '/opt/in…" ... 0.0.0.0:25->25/tcp mailserver
下記コマンドでコンテナ内部にログインでき
# docker exec -it 86d111ea9bca /bin/bash
以下にある設定ファイル群も中を見れます。
root@86d111ea9bca:# ls /etc/postfix dynamicmaps.cf main.cf master.cf post-install postfix-files postfix-script sasl root@86d111ea9bca:/etc/postfix# cat main.cf # See /usr/share/postfix/main.cf.dist for a commented, more complete version # Debian specific: Specifying a file name will cause the first # line of that file to be used as the name. The Debian default # is /etc/mailname. #myorigin = /etc/mailname smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no # appending .domain is the MUA's job. append_dot_mydomain = no # Uncomment the next line to generate "delayed mail" warnings #delay_warning_time = 4h readme_directory = no # TLS parameters smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_use_tls=yes smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for # information on enabling SSL in the smtp client. smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = hoge alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = xxx, localhost.localdomain, , localhost relayhost = mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = all smtpd_sasl_auth_enable = yes broken_sasl_auth_clients = yes smtpd_recipient_restrictions = permit_sasl_authenticated,reject_unauth_destination
SMTPサーバと通信を行う
telnetで接続し、メール送信ができます。以下のやりとりを見て分かる通り、電子メールの受信に認証は必須ですが送信では認証がないものもあります。
# telnet localhost smtp Trying ::1... Connected to localhost. Escape character is '^]'. 220 hoge ESMTP Postfix (Ubuntu) EHLO hoge 250-hoge 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-STARTTLS 250-AUTH PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM 250-AUTH=PLAIN LOGIN CRAM-MD5 DIGEST-MD5 NTLM 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN MAIL FROM:hoge@gmail.com 250 2.1.0 Ok RCPT TO:root@localhost 250 2.1.5 Ok DATA 354 End data with <CR><LF>.<CR><LF> From: hoge@gmail.com Subject: test mail test . 250 2.0.0 Ok: queued as AD93E44918 QUIT 221 2.0.0 Bye Connection closed by foreign host.
実際にSMTPサーバとしての応答が返ってくるので例えば送信先にyahooやgmailを選定すると以下のようにSMTP認証エラーとなりました。クラウド上に展開したからかSMTPがブロックされている可能性もあります。
RCPT TO:hoge@yahoo.co.jp 454 4.7.1 <hoge@yahoo.co.jp>: Relay access denied
終わりに
手軽に自前のSMTPサーバを動かせ、実際にコンテナ内にログインも可能です。
SMTPサーバの動き方を確認する環境が欲しい方は、同手順を参考ください。