SMTP【Simple Mail Transfer Protocol】

広告

広告

SMTP とは

最終更新
2004-06-23T00:00:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/smtp.html#smtp

SMTP は【Simple Mail Transfer Protocol】の略となっていまして、メールを送信する際に使用するプロトコルです。もともとはサーバ間でメールのやりとりをするために使用されるプロトコルだったのですが、ユーザーがメーラー(メールクライアント)を使ってメールサーバ(正確にはSMTP サーバ)にメールを送信する際にも使用されるため、一般にも広く知られる名前となっています。

SMTP の仕組み

最終更新
2004-06-23T00:00:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/smtp.html#structure

SMTP の仕組みはクライアントサーバ間の対話によって実現されています。とは言いましても、コンピュータの世界ですので本当に話をしているわけではありません。送信側SMTPと受信側SMTPとの間に全二重通信路を確保し、データをお互いにやりとりすることによって会話をしているのです。

では実際に会話の中身を見てみましょう。まず送信者(メールクライアント)はメール(SMTPサーバに「これからメールを送りますよ」と話し掛けます。そうするとメールサーバは「はい、わかりました」と答えます。次に送信者は「私は○○というものです」と自分の情報(メールアドレス等)を通知します。また、メールサーバは「はい、わかりました」と返事を返します。送信者は更に、「○○という所属の△△さんに送りたいのです」と宛先情報をメールサーバに伝えます。メールサーバはまた、「はい、わかりました」と返事を返します。ここで初めて、送信者はメールサーバ宛にメール本文の送信を開始します。このような手順でメールの送信をするのですが、当然送信者が間違った手順で情報を送ったり、良く分からない内容を送ったりした場合には、メールサーバは「はい、わかりました」とは答えません。「あなたの要求は受け付けることができません」などと答える場合もあります。そういった応答を、SMTP サーバは以下の決められた3桁の数値で返します。

SMTPコード表
200正しくない応答コード(正しくは250)
211システムの状態、またはシステムヘルプの応答
214そのサーバで使えるコマンドのヘルプが返されるときに使われる
220SMTPコネクションが確立したときに使われる。 220 (domain名) という書式をとる
221転送チャンネルを閉じる(QUITに対する応答)。221 (domain名) という書式をとる
250要求されたコマンドが正常に終了したことを表す成功応答
251宛先として指定されたユーザはローカルに存在せず、応答に指定した宛先へ転送する
252VRFYコマンドでのユーザ確認ができず、ユーザはローカルに存在しないがメールの転送は可能
253サーバがそのノード宛メッセージをもっている際の成功コード(メッセージがない場合は251を用いる)
334ダイジェスト待ち
354DATAに対する応答。「.」が来るまでのすべてのデータをメール本文として扱う
421サービスが利用不可能なので転送を閉じる
432Authenticationで、認証メカニズムを変更する必要がある
450他に該当しない一時的なエラー
451データ処理中にエラーが発生した
452システムのディスク容量不足
453メールがない
454Authenticationで、サーバ側の原因により認証が失敗した
458何らかの理由でキューができない
459何らかの理由でそのクライアントにサービスが提供されない
500構文エラー、コマンドが解釈不能
501パラメータや引数の構文エラー
502コマンドが実装されていない
503コマンドの並びが悪い
504コマンドのパラメータが実装されていない
521メールを受けとらない
530アクセス拒否
534認証メカニズムが弱すぎる
535認証エラー
538要求された認証メカニズムには暗号化が必要
550要求されたアクションを実行できない
551ユーザはローカルでない
552要求されたコマンドは中止された
553要求されたコマンドは受け入れられない
554トランザクションの失敗
555MAIL/RCPT のパラメータエラー

表を見て頂ければ分かると思いますが、「はい、わかりました」のときは「250」という数値をSMTP サーバは返します。これらのコードをSMTP サーバが送信者に返すことにより、送信者はメールサーバの状態を確認することができるのです。

では、送信者は一体どのようにしてSMTP サーバに話かけているのでしょう。送信者は全てコードというわけにはいかないので、決められたコマンドを使用してSMTP サーバに命令を行います。コマンドの詳細は下記表を参照して下さい。

SMTPコマンド
HELOHELO <Space> ドメイン名 <CR><LF>SMTPクライアントをSMTPサーバに認識させるためのコマンド。
MAILMAIL <Space> FROM:送信元ユーザ名 <CR><LF>メール転送を開始するコマンド。パラメータで送信元アドレスを指定。
RCPTRCPT <Space> TO:送信先リスト <CR><LF>MAILコマンドに続いて実行し、送信する受信者を指定する。
DATADATA <CR><LF>転送するメールデータの送信開始を表し、<CR><LF>.<CR><LF>で終了とみなされる。
RSETRSET <CR><LF>MAIL、SENDコマンドにより開始中のメール転送処理を中止する。このコマンド以前に設定されていた情報は全てリセットされる。
SENDSEND <Space> FROM:送信元ユーザ名 <CR><LF>MAILコマンドと同様だが、送信先がユーザのターミナルとなる。
SOMLSOML <Space> FROM:送信元ユーザ名 <CR><LF>メッセージをメールボックスではなくターミナルへ送信する。ユーザがログインしていない場合メッセージはメールボックスへと送られる。ただし利用できる環境はほとんどない。
SAMLSAML <Space> FROM:送信元ユーザ名 <CR><LF>メッセージをメールボックスとターミナル両方へ送信する。ユーザがログインしていない場合メッセージはメールボックスのみへ送られる。ただし利用できる環境はほとんどない。
VRFYVRFY <Space> ユーザ名 <CR><LF>SMTPサーバにユーザ名の確認を行う。指定されたユーザが存在すればユーザの情報を返す。
EXPNEXPN <Space> メールリスト名 <CR><LF>メーリングリストの会員アドレスの要求
HELPHELP [<Space> コマンド名] <CR><LF>SMTPサーバがサポートしているコマンドの一覧、説明を表示する。
NOOPNOOP <CR><LF>ダミーコマンド。サーバの状況を確認する際に使用される。
QUITQUIT <CR><LF>SMTPによる接続の終了。
TURNTURN <CR><LF>クライアントとサーバの役割の逆転

これらのことをふまえて、もう一度送信者(メールクライアント)とメール(SMTPサーバの会話を見てみましょう。

SMTP会話
クライアント側 サーバ側
HELLOコマンド
250
MAILコマンド
250
RCPTコマンド
250or251
DATAコマンド
354
メール本文
ピリオドのみ
250
QUITコマンド
221
  1. 送信側となるSMTPクライアントはHELO/EHLO(拡張SMTP)コマンドを送ってメッセージの送受信を開始します。
  2. SMTPクライアントはメッセージの送信者(FROM)を含むMAILコマンドを送信する。
  3. SMTPクライアントは宛先(TO)を含むRCPTコマンドを送信する。
  4. SMTPクライアントはメッセージ送信開始を示すDATAコマンドに続けてメール本文を送信する。
  5. メール本文を最後まで送信し、メッセージの終わりを示す<CR><LF>.<CR><LF>を最後に送信する。
  6. QUITコマンドを送って送信を終了します。

QUIT コマンドが送信されると実際にメールが送信されます。

SMTP の仕組みは大まかに以上のような流れになっているのですが、SMTP サーバの仕組みはこれで終わりではありません。SMTP サーバは大抵の場合、受け取ったメールを他のメールサーバ(宛先のメールボックスを持っているサーバ)に転送しなければなりません。この転送のときもSMTP を使用し、他のメールサーバにメールを送ります。

SMTPサービスの拡張

最終更新
2005-12-17T13:20:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/smtp.html#extensions

従来のSMTPに加え、元々のSMTPを拡張する方法が登場しました。これを特にESMTP【Extended SMTP/SMTP Servide Extension】と呼びますが、SMTPとESMTPをまとめてSMTPと表現する場合がほとんどです。

SMTP拡張の枠組み

SMTPサービス拡張の目的で、SMTPは封筒(envelope)と内容(content)を含むメールをSMTPでリレーするための拡張がなされています。

封筒

内容

内容にはヘッダと本文が含まれ、SMTP DATA 単位で送信されます。

追加コマンド

従来のHELOコマンドに対して、拡張機能をサポートするSMTPクライアントが発行するEHLOコマンドが追加されています。EHLOコマンドに対してSMTPサーバが返す応答は次の通りです。

EHLOコマンドに対する応答
応答コード内容
250拡張プロトコルをサポートする(成功)
554拡張プロトコルが何らかの理由で利用できない(失敗)
501EHLOコマンドは認識するが、引数が拒否される(エラー)
502EHLOコマンドは認識するが、拡張プロトコルが未実装(エラー)
421EHLOコマンドは認識するが、システム停止などの理由でサービスが利用できない(エラー)
500拡張プロトコルがサポートされていない(失敗)

追加機能

拡張SMTPで追加された機能
コマンドコマンドの意味機能
EXPNExpand宛先リストを展開する
HELPHelpヘルプ機能を要求する
SAMLSend and Mailメールをユーザ端末、及びメールボックスへ配信する
SENDSendメールをユーザ端末へ配信する
SOMLSend Or Mailメールをユーザ端末、又はメールボックスへ配信する
TURNTurn送受信の役割を交代(RFC2821によりセキュリティ上の理由から使用が禁止されている)

補足知識

最終更新
2005-12-25T17:05:00+09:00
この記事のURI参照
https://www.7key.jp/nw/technology/protocol/smtp.html#other

メッセージはASCII文字に限る、1行は1000文字以内などと言った制限がSMTPにはあります。これを解決する為にMIMEが考え出されました。

広告

Copyright (C) 2003-2004 七鍵 key@do.ai 初版:2004年06月23日 最終更新:2005年12月17日