TECHSCORE BLOG

クラウドCRMを提供するシナジーマーケティングのエンジニアブログです。

telnetでメール送信を体験してみました

現在、Synergy! のメッセージング機能を担当しています。 メッセージング機能はメール配信やLINEへの配信など、クライアントとのコミュニケーションを担う重要な機能であり、特にメール配信はSynergy!の中心となる役割を担っています。 メッセージング機能を担当するにあたり、メール配信(SMTP)の実際の仕組みを理解しておくことは開発や運用の面でとても重要です。

この記事では、メール配信(SMTP)の仕組みを理解するために、telnet を使って一通りのメール配信の手順を手動で体験してみました。

実行するときのコマンドを記載しますので、ぜひ一度お試しください。

中根 秋(ナカネ アキ)
入社2年目のエンジニアです。最近のブームはピクミン4です。

環境構築

メールを送信するための仕組みとして、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桁の数字について詳しく知りたい方は、以下をご覧ください。

実際にメールを送信してみる

では、実際にメールを送信して、メールボックスにメールがあるか確認してみます。

実行の流れとしては、コマンドを実行して、それに対しての返答が返ってくるという流れになります。 (見やすくするために、実行したコマンドの前後には改行を入れています。また、コマンド入力とそれに対するレスポンスで枠を作っています。)

では、接続します。

$ 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 にアクセスし、先ほど送信したメールが一覧に表示されているか確認します。

https://cdn-ak.f.st-hatena.com/images/fotolife/t/techscore/20230727/20230727160629.png

DATA コマンドで指定した本文 Hello,World! が表示されていることを確認出来ました。

https://cdn-ak.f.st-hatena.com/images/fotolife/t/techscore/20230727/20230727160714.png

動作確認のため立てたコンテナの削除手順を記載しますので、削除したい場合は以下を実行してください。

docker stop $(docker ps -a -q -f "name=test_mailhog") && docker rm $(docker ps -a -q -f "name=test_mailhog")

最後に

telnet を使って一通りのメール配信の手順を手動で体験してみました。 上記では紹介していないコマンドも他にあるので、ぜひ RFC5321 のページを見て試してみてください。

シナジーマーケティング株式会社では一緒に働く仲間を募集しています。