ここでは、Postfix + Dovecot + Postfix Adminでマルチドメインのメールサーバ(PostgreSQL)で設定したメールサーバの動作確認を行っていきます。

動作確認前の下準備

動作確認では、実際にメール送信ししますので、Postfix Adminで

  • サーバのhostnameのドメインを、Postfix Adminを使ってドメインを追加
  • そのドメインにユーザを追加
  • そのドメインの「root」ユーザを先程追加したユーザに転送設定

を行ってください。Postfix Adminの操作はこちらのページが参考になります(私も書こうとしたのですが、挫折しました…)。ここではドメインが「example.com」、作成したユーザが「test@example.comとして仮定して説明しますので、実際のドメインやユーザに置き換えてご確認ください。

Dovecotの動作確認

サーバにはTera Temなどのターミナルエミュレータで接続していると思いますが、ターミナルエミュレータを2つ立ち上げ、一方では

tail -f /var/log/maillog

と実行し、ログを監視します。もう一方で操作を行ってください。

PostfixはDovecotに依存しているため、最初にDovecotの動作確認を行います。コマンドラインから、telnetでDovecotに接続します。

telnet localhost 143

接続でき、下記のような応答があることを確認してください。

Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN] IMAP Server ready.

telnetの接続が拒否される場合、Dovecotのdaemonが起動していません。接続されるけれど応答がない場合、Dovecotがトラブルを起こしています。

もし

Trying ::1...
Connected to localhost.
Escape character is '^]'.
* OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ LOGINDISABLED] IMAP Server ready.

と「LOGINDISABLED」と表示されていたら、ログインできません。うまくいかない場合は、ログの出力を見ながら

service dovecot restart

を実行してみてください。

次に、IMAPのコマンドを発行してログインを試みます。

A10 LOGIN test@example.com password

「password」は実際のパスワードに置き換えてください。ログインできることを確認してください。ログインできなければ、Postfix AdminとDovecotの連携がうまく行っていません。設定ファイルを見直してみて下さい。(認証関係ですので、「conf.d/10-auth.conf」や「dovecot-sql.conf.ext」などが中心だと思います)

ログインできると、次のような応答があるはずです。

A10 OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY PREVIEW=FUZZY PREVIEW STATUS=SIZE SAVEDATE LITERAL+ NOTIFY METADATA SPECIAL-USE IMAPSIEVE=sieve://host.example.com FILTER=SIEVE QUOTA ACL RIGHTS=texk] Logged in

最後に「Logged in」がでればOKです。「CAPABILITY」にはIMAPサーバがサポートしている機能が列挙されています。(私の環境では、別途設定して機能を有効化していますので、CAPABILITYがこの例より少なくても大丈夫です)

ここまでくれば、Dovecotの動作は(一応)確認できました。telnetコマンドを終了してください。

Postfixの動作確認(SMTP TCP/25)

次に、Postfixの動作を確認していきます。サーバ間の転送に用いられるSMTP(TCP/25)を確認します。「/var/log/maillog」の監視は続けながら

telnet locahost 25

とPostfixに接続して下さい。接続ができたら、Postfixから応答があります。

Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 host.example.com ESMTP

応答があれば、SMTPコマンドを送信します。

EHLO localhost

これを送信すると、Postfixから次のような応答があるはずです。

250-host.example.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-AUTH PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING

最初の行は、Postfixが動いているホスト名です。では、SMTPのコマンドでメールを送信してみます。まずは送信元を指定します。

MAIL FROM: <test@example.com>

Postfixからの応答は、次のようなはずです。

250 2.1.0 Ok

続けて宛先を指定します。

RCPT TO: <test@example.com>

応答が返ってきたら続けメールの本体を送ります。

DATA

「DATA」コマンドを送ると、サーバから応答があります。

354 End data with <CR><LF>.<CR><LF>

この応答を確認してから、メールの本体を送ります。

Hello, World!
.

送信がうまくいくと、Postfixから次の反応が返ってきます。

250 2.0.0 Ok: queued as A8D173A55C

キューの番号はその時その時で変わります。このあとPostfixはDovecotが待ち受けているLMTPにメール配信を依頼します。

では、続けてセキュリティ関係の設定(の一部)がうまく行っているかどうか確認します。一度SMTPをリセットします。

RSET

応答を待って、存在しないドメインのユーザからメールを送ってみます。

MAIL FROM: <test@noexistent.test>

この時点では、まだ応答があります。

250 2.1.0 Ok

続けて宛先を指定します。

RCPT TO: <test@exmaple.com>

この時点で、セキュリティチェックが働き、次の反応が返ってきます。

450 4.1.8 <test@noexistent.test>: Sender address rejected: Domain not found

存在しないドメインからのメールを拒否していることがわかります。次に、自分が受取先ではないメールアドレスを拒否するかどうか、確認します。SMTPコマンドを送信します。

RSET

応答が返ってきたら、送信者は実在のものを指定します。

MAIL FROM: <test@example.com>

応答が返ってきたら、「自分が受け付けないドメイン」を宛先に指定します。

RCPT TO: <test@nonexistent.test>

Postfixが次の反応を返してくれば、大丈夫です。

554 5.7.1 <test@nonexistent.test>: Relay access denied

もし受け付けるなら、Postfixの設定を見直す必要があります。

では、「VRFT」コマンドの無効化ができているかどうか確認します。SMTPの状態をリセットします。

RSET

応答が返ってきたら、VRFYコマンドを送信します。

VRFY test@example.com

次のような応答があれば、正常です。

502 5.5.1 VRFY command is disabled

もし、

252 2.0.0 test@example.com

と返ってきたら、設定ファイルにミスがあります。要確認です。

さて、ここまでの確認で「test@example.com」にメールが1通送信されています。「/var/spool/vmail/example.com/test/」フォルダが作成されているかどうか、それにそこにメールがあるかどうかを確認してみましょう。まずtelnetを抜けてシェルで

cd /var/spool/vmail
ls

と実行すると「example.com」ディレクトリがあるはずです。このディレクトリに入ってフォルダを確認してみます。

cd example.com
ls

「test」ディレクトリがあるはずです。更に確認してみましょう。

cd test
ls

ここに「new」フォルダがあるはずです。更に潜ってみます。

cd new
ls

すると、ファイルが1個あるはずです。これがテスト送信したファイルになります(ファイル名はその時その時で変わります)。これを見ると、メールの内容を確認することができます。ここまで成功すると、Postfixがメールを受け付け、DovecotのLMTPにそれを引き渡し、指定されたフォルダにメールを格納する、とういう一連の流れを確認することができます。

Postfixの動作確認(Submission TCP/587)

では、/var/log/maillogの監視は続けたまま、telnetでSubmissionポートに接続します。

telnet localhost 587

接続が成功したら、Postfixから応答があります。

Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 garnet.topazium.site ESMTP

最初に「EHLO」を送ります。

EHLO localhost

このコマンドを送ると、Postfixから応答があります。

250-host.example.com
250-PIPELINING
250-SIZE 10240000
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-DSN
250-SMTPUTF8
250 CHUNKING

Submissionでは認証を必須化してあるので、わざと認証無しでメール送信を試みます。SMTPコマンドを送ります。試しに、自分から自分にメール送信を試みます。

MAIL FROM: <test@example.com>

応答があります。

250 2.1.0 Ok

続けて、受信アドレスを指定します。

RCPT TO: <test@example.com>

この時点で、次のエラーメッセージが返ってくるはずです。

554 5.7.1 <test@example.com>: Recipient address rejected: Access denied

では、SMTP認証をしてどうなるかを確認してみます。一度telnetを抜けから、シェルで次のコマンドを実行します。

printf "%s\0%s\0%s" test@example.com test@example.com password | base64

「printf」にわたすのは、固定の文字列「"%s\0%s\0%s"」と、自分のメールアドレス2回、それにパスワードです。それをパイプでbase64コマンドに渡しBASE64エンコードします。次のような文字列が返ってくるはずです。

dGVzdEBleGFtcGxlLmNvbQB0ZXN0QGV4YW1wbGUuY29tAHBhc3N3b3Jk

これをコピーしておきます。次にtelnetでSubmissionポートに接続します。

telnet localhost 587

応答が返ってきたら、まずは「EHLO」を送信します。

EHLO localhost

更に、応答が返ってきたら、SMTP認証を行います。

AUTH PLAIN

これは「PLAIN認証を行う」というSMTPのコマンドです。応答があります。

334

数字が返ってきたら、先程コピーしたBASE64エンコードされた文字列を貼り付けて、ENTERキーを押します。

dGVzdEBleGFtcGxlLmNvbQB0ZXN0QGV4YW1wbGUuY29tAHBhc3N3b3Jk

次のような応答があれば、認証成功です。

235 2.7.0 Authentication successful

では、認証が通ったところで、自分から自分にメールを送信してみます。

MAIL FROM: <test@example.com>

応答があれば

RCPT TO: <test@example.com>

先程は「Access denied」でしたが、今回は受け付けられるはずです。

250 2.1.5 Ok

ここで確認完了です。telnetを抜けてください。