現在、Synergy! のメッセージング機能を担当しています。 メッセージング機能はメール配信やLINEへの配信など、クライアントとのコミュニケーションを担う重要な機能であり、特にメール配信はSynergy!の中心となる役割を担っています。 メッセージング機能を担当するにあたり、メール配信(SMTP)の実際の仕組みを理解しておくことは開発や運用の面でとても重要です。
この記事では、メール配信(SMTP)の仕組みを理解するために、telnet を使って一通りのメール配信の手順を手動で体験してみました。
実行するときのコマンドを記載しますので、ぜひ一度お試しください。
環境構築
メールを送信するための仕組みとして、SMTP というものがあります。 SMTP に定められた手順に沿って処理をしていくことで、メールを送信出来ます。 今回は、telnet で SMTP に沿ったメール送信を体験し、SMTP の理解を深めていきたいと思います。
今回は実際のSMTPサーバーに接続するのではなく、MailHog というツールを利用します。 MailHog はSMTPサーバーのように振る舞ってメール送信を受け付けます。また、受け付けたメールの内容をGUIで確認することができます。
では、動作を確認するための環境構築を行っていきます。
Docker で MailHog のコンテナを立てます。
docker run -d -p 8025:8025 -p 1025:1025 --name test_mailhog mailhog/mailhog
次に、telnet コマンドを使用し、先ほど立てたコンテナの 1025 ポートに接続します。
telnet localhost 1025
以下のように表示されていれば、正常に接続されています。
Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mailhog.example ESMTP MailHog
telnet でメールを送信するには
メールを送信するには、SMTPコマンドを実行していく必要があります。コマンドは主に、MAIL、RCPT、DATA、QUITなどがあります。
それらのコマンドには実行する順序の制限があり、その制限に沿ってコマンドを実行していく必要があります。 順序については、後に実際にメールを送信するまでの手順を記載しますので、そちらで雰囲気を掴んでもらえればと思います。
また、SMTPコマンドの応答として、3桁の数字が使用されます。 SMTPコマンドが正常に完了した場合は、250 が返ってきます。コマンドの構文が間違っているなど誤りがあった場合は、400系もしくは500系が返ってきます。
もし、他のSMTPコマンドはなにがあるか、順序と応答の3桁の数字について詳しく知りたい方は、以下をご覧ください。
- SMTPコマンドについて
- コマンドの順序について
- コマンドの応答の数字について
実際にメールを送信してみる
では、実際にメールを送信して、メールボックスにメールがあるか確認してみます。
実行の流れとしては、コマンドを実行して、それに対しての返答が返ってくるという流れになります。 (見やすくするために、実行したコマンドの前後には改行を入れています。また、コマンド入力とそれに対するレスポンスで枠を作っています。)
では、接続します。
$ telnet localhost 1025 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. 220 mailhog.example ESMTP MailHog
EHLOコマンドを入力し、メール送信をするためのSMTPセッションを開始します。 レスポンスとして、接続の際の返答(Hello)とサポートされている拡張機能が返ってきます。
EHLO 250-Hello 250-PIPELINING 250 AUTH PLAIN
MAILコマンドで、送信元アドレスを指定します。 レスポンス 250 で、完了したことが確認できます。
MAIL FROM: <sample@sample.com> 250 Sender sample@sample.com ok
RCPTコマンドで、受信者のアドレスを指定します。 こちらもレスポンス 250 で、完了したことが確認できます。
RCPT TO: <sample@sample.com> 250 Recipient sample@sample.com ok
DATAコマンドで、メールの内容を指定します。 レスポンスの354は、メールの内容入力の開始を意味しています。
DATA 354 End data with <CR><LF>.<CR><LF>
先ほどメールの内容入力を開始したため、内容を入力していきます。 送信元、受信元、本文を入力しています。
入力の終了の際には、「.」を入力します。
FROM: sample@sample.com TO: example@example.com Hello,World! . 250 Ok: queued as gMY26Kr2qHp9DvpRDGIZuY_LAn3cKG5EtB9zMq3OkiQ=@mailhog.example
QUITコマンドを入力することで、セッションを終了します。 レスポンスとして 221 が返ってきており、セッションが終了したことを意味します。
QUIT 221 Bye Connection closed by foreign host.
では、http://localhost:8025 にアクセスし、先ほど送信したメールが一覧に表示されているか確認します。
DATA
コマンドで指定した本文 Hello,World!
が表示されていることを確認出来ました。
動作確認のため立てたコンテナの削除手順を記載しますので、削除したい場合は以下を実行してください。
docker stop $(docker ps -a -q -f "name=test_mailhog") && docker rm $(docker ps -a -q -f "name=test_mailhog")
最後に
telnet を使って一通りのメール配信の手順を手動で体験してみました。 上記では紹介していないコマンドも他にあるので、ぜひ RFC5321 のページを見て試してみてください。