Works by

Ren's blog

@rennnosuke_rk 技術ブログです

【NW】SMTP

SMTP

SMTPとは、メール転送のための通信プロトコルです。
主にメールを管理するメールサーバーが他のメールサーバーにメールを転送するためにこのプロトコル用います。

メールサーバーとメール転送

SMTPの通信内容について説明する前に、そもそもメールがどのように配送され、送り先に届くのか、簡単に見てみましょう。

私たちは普段、PCやスマートフォン上でメールを書き、それを送りたい相手へと送信します。PCであればOutlookGmailスマートフォンであればGmailやキャリアの用意したメールアプリなどを使いますね。このような、メールを作成したり送信したりするプログラムをメーラー(メールクライアント)と呼びます。

メーラーを使って私たちがメールを送信すると、メールはメールサーバーと呼ばれるサーバーに一旦送られます。メールサーバーはユーザーのメールボックスを保持しており、メーラーはこのメールボックスを参照することで相手からのメールを受信することができます。このようなメーラー、もといメールクライアントは、メールの配送や転送のサービスを享受する側としてMail User Agent(MUA)と呼ばれます。

例えば、Aさんがメーラーとしてデスクトップ版Gmailを使ってメールを送る場合、下図のようになります。

f:id:rennnosukesann:20180704081137p:plain:w300

メールサーバーはメールを受け取ると、その宛先によって取るべきアクションを変えます。

① メールの宛先が自分が管理するユーザの場合、ユーザのメールボックスに配送する
② メールの宛先が自分が管理するユーザでない場合、他のメールサーバーに転送する

① メールの配送

メールサーバーは受け取ったメールの宛先を確認し、もし自分が管理するユーザー宛であれば、そのユーザのメールボックスにメールを配送します。

例えば、メールサーバーαがAさんとBさんの情報、そして彼らのメールボックスを管理しているとします。このときAさんがBさん宛にメールを送信すると、メールサーバーはメールの宛先を確認し、Bさんのメールボックスにメールを配送します。

f:id:rennnosukesann:20180704082612p:plain:w600

Bさんのメーラーは適宜メールサーバー上のBさんのメールボックスを参照します(この参照はIMAP/POP3などのプロトコルを用いて行われます)

② メールの転送

メールサーバーの受け取ったメールの宛先が、メールサーバーの管理するユーザー宛でなければ、そのユーザを管理する他のメールサーバーへと転送します。

今度はAさんがCさん宛にメールを送信したとしましょう。メールサーバーはメールの宛先を確認し、Cさんが自分の管理下にいないとわかると、Cさんを管理する別のメールサーバーへと転送しようとします。

f:id:rennnosukesann:20180704083658p:plain

このとき、メールサーバーαから、Cさんを管理下に置くメールサーバーβへメールの転送を行いますが、この転送時に用いられる通信プロトコルSMTPになります。またメールサーバーはメールネットワークのなかでメール転送する役割を担うことから、Mail Transfer Agent(MTA)とも呼ばれます。

ちなみにどうやってCさんを管理するメールサーバーを見つけるのか?と疑問に思うかもしれませんが、これはあて先のメールアドレスを使って解決します。

f:id:rennnosukesann:20180704084303p:plain:w300

メールアドレスは{ユーザ名}@{ドメイン名orメールサーバー名}という、左側にメールサーバーで一意なユーザ名、右側にドメイン名またはメールサーバー名が書かれている構成になっています。このうち、右側のメールサーバー名とドメイン名は、DNSとよばれる仕組み(とプロトコル)を使って、サーバーの居場所(IPアドレス)を突き止めることができます。IPアドレスがわかれば、あとはそのIPアドレス先のホストに対してSMTPでメールを転送するだけです。

SMTPの通信フロー

SMTPの通信フローは以下の5段階からなります。

① Greeting
② 送信元メールアドレスの送信
③ 宛先メールアドレスの送信
④ メールコンテンツの送信
⑤ 通信終了

f:id:rennnosukesann:20180704212954p:plain

① Greeting

メールを転送したいサーバーαがSMTPによる通信を開始するとき、送信先のメールサーバーβに対して通信開始の合図として「HELO」文字列を送ります(設定によっては「EHLO」を送ることもあります)。この挨拶に対して、メールサーバーβが250番応答を返したとき、Greetingは成功とし、SMTP通信が開始されます。

② 送信元メールアドレスの送信

Greetingが完了すると、メールサーバーαはメールサーバーβに対してメールの送信元アドレスを送信します。この送信に対してメールサーバーβが250番応答を返すと送信成功となります。

③ 宛先メールアドレスの送信

次に、メールサーバーαはメールサーバーβに対してメールの宛先アドレスを送信します。この送信に対してメールサーバーβが250番応答を返すと送信成功となります。

④ メールコンテンツの送信

送信元・宛先メールアドレスを送信し終わると、メールサーバーαはメールの内容を送る準備を開始します。その合図としてメールサーバーαは「DATA」の文字列をメールサーバーβに送信し、それに対してメールサーバーβは354番応答を返します。ここからメール内容の送信が開始されます。

送信されるメール内容は

  • 日付
  • 送信元メールアドレス
  • 宛先メールアドレス
  • メールの主題
  • メーラーのバージョン情報
  • メールの内容 ...

となります。

このメール内容送信に対してメールサーバーが250番応答を返すことで、メール内容送信は成功となります。

⑤ 通信終了

最後にメールサーバーαが「QUIT」メッセージをメールサーバーβに送信し、メールサーバーβが221番応答を返すことでSMTP通信が終了となります。

参考

Simple Mail Transfer Protocol - Wikipedia

SMTP(Simple Mail Transfer Protocol)〜前編:インターネット・プロトコル詳説(5) - @IT

e-words.jp

ascii.jp

(素材をお借りしました。ありがとうございました!) flat-icon-design.com