広告
広告
https://www.7key.jp/nw/technology/protocol/smtp.html#smtp
SMTP は【Simple Mail Transfer Protocol】の略となっていまして、メールを送信する際に使用するプロトコルです。もともとはサーバ間でメールのやりとりをするために使用されるプロトコルだったのですが、ユーザーがメーラー(メールクライアント)を使ってメールサーバ(正確にはSMTP サーバ)にメールを送信する際にも使用されるため、一般にも広く知られる名前となっています。
https://www.7key.jp/nw/technology/protocol/smtp.html#structure
SMTP の仕組みはクライアントとサーバ間の対話によって実現されています。とは言いましても、コンピュータの世界ですので本当に話をしているわけではありません。送信側SMTPと受信側SMTPとの間に全二重通信路を確保し、データをお互いにやりとりすることによって会話をしているのです。
では実際に会話の中身を見てみましょう。まず送信者(メールクライアント)はメール(SMTP)サーバに「これからメールを送りますよ」と話し掛けます。そうするとメールサーバは「はい、わかりました」と答えます。次に送信者は「私は○○というものです」と自分の情報(メールアドレス等)を通知します。また、メールサーバは「はい、わかりました」と返事を返します。送信者は更に、「○○という所属の△△さんに送りたいのです」と宛先情報をメールサーバに伝えます。メールサーバはまた、「はい、わかりました」と返事を返します。ここで初めて、送信者はメールサーバ宛にメール本文の送信を開始します。このような手順でメールの送信をするのですが、当然送信者が間違った手順で情報を送ったり、良く分からない内容を送ったりした場合には、メールサーバは「はい、わかりました」とは答えません。「あなたの要求は受け付けることができません」などと答える場合もあります。そういった応答を、SMTP サーバは以下の決められた3桁の数値で返します。
200 | 正しくない応答コード(正しくは250) |
211 | システムの状態、またはシステムヘルプの応答 |
214 | そのサーバで使えるコマンドのヘルプが返されるときに使われる |
220 | SMTPコネクションが確立したときに使われる。 220 (domain名) という書式をとる |
221 | 転送チャンネルを閉じる(QUITに対する応答)。221 (domain名) という書式をとる |
250 | 要求されたコマンドが正常に終了したことを表す成功応答 |
251 | 宛先として指定されたユーザはローカルに存在せず、応答に指定した宛先へ転送する |
252 | VRFYコマンドでのユーザ確認ができず、ユーザはローカルに存在しないがメールの転送は可能 |
253 | サーバがそのノード宛メッセージをもっている際の成功コード(メッセージがない場合は251を用いる) |
334 | ダイジェスト待ち |
354 | DATAに対する応答。「.」が来るまでのすべてのデータをメール本文として扱う |
421 | サービスが利用不可能なので転送を閉じる |
432 | Authenticationで、認証メカニズムを変更する必要がある |
450 | 他に該当しない一時的なエラー |
451 | データ処理中にエラーが発生した |
452 | システムのディスク容量不足 |
453 | メールがない |
454 | Authenticationで、サーバ側の原因により認証が失敗した |
458 | 何らかの理由でキューができない |
459 | 何らかの理由でそのクライアントにサービスが提供されない |
500 | 構文エラー、コマンドが解釈不能 |
501 | パラメータや引数の構文エラー |
502 | コマンドが実装されていない |
503 | コマンドの並びが悪い |
504 | コマンドのパラメータが実装されていない |
521 | メールを受けとらない |
530 | アクセス拒否 |
534 | 認証メカニズムが弱すぎる |
535 | 認証エラー |
538 | 要求された認証メカニズムには暗号化が必要 |
550 | 要求されたアクションを実行できない |
551 | ユーザはローカルでない |
552 | 要求されたコマンドは中止された |
553 | 要求されたコマンドは受け入れられない |
554 | トランザクションの失敗 |
555 | MAIL/RCPT のパラメータエラー |
表を見て頂ければ分かると思いますが、「はい、わかりました」のときは「250」という数値をSMTP サーバは返します。これらのコードをSMTP サーバが送信者に返すことにより、送信者はメールサーバの状態を確認することができるのです。
では、送信者は一体どのようにしてSMTP サーバに話かけているのでしょう。送信者は全てコードというわけにはいかないので、決められたコマンドを使用してSMTP サーバに命令を行います。コマンドの詳細は下記表を参照して下さい。
HELO | HELO <Space> ドメイン名 <CR><LF> | SMTPクライアントをSMTPサーバに認識させるためのコマンド。 |
MAIL <Space> FROM:送信元ユーザ名 <CR><LF> | メール転送を開始するコマンド。パラメータで送信元アドレスを指定。 | |
RCPT | RCPT <Space> TO:送信先リスト <CR><LF> | MAILコマンドに続いて実行し、送信する受信者を指定する。 |
DATA | DATA <CR><LF> | 転送するメールデータの送信開始を表し、<CR><LF>.<CR><LF>で終了とみなされる。 |
RSET | RSET <CR><LF> | MAIL、SENDコマンドにより開始中のメール転送処理を中止する。このコマンド以前に設定されていた情報は全てリセットされる。 |
SEND | SEND <Space> FROM:送信元ユーザ名 <CR><LF> | MAILコマンドと同様だが、送信先がユーザのターミナルとなる。 |
SOML | SOML <Space> FROM:送信元ユーザ名 <CR><LF> | メッセージをメールボックスではなくターミナルへ送信する。ユーザがログインしていない場合メッセージはメールボックスへと送られる。ただし利用できる環境はほとんどない。 |
SAML | SAML <Space> FROM:送信元ユーザ名 <CR><LF> | メッセージをメールボックスとターミナル両方へ送信する。ユーザがログインしていない場合メッセージはメールボックスのみへ送られる。ただし利用できる環境はほとんどない。 |
VRFY | VRFY <Space> ユーザ名 <CR><LF> | SMTPサーバにユーザ名の確認を行う。指定されたユーザが存在すればユーザの情報を返す。 |
EXPN | EXPN <Space> メールリスト名 <CR><LF> | メーリングリストの会員アドレスの要求 |
HELP | HELP [<Space> コマンド名] <CR><LF> | SMTPサーバがサポートしているコマンドの一覧、説明を表示する。 |
NOOP | NOOP <CR><LF> | ダミーコマンド。サーバの状況を確認する際に使用される。 |
QUIT | QUIT <CR><LF> | SMTPによる接続の終了。 |
TURN | TURN <CR><LF> | クライアントとサーバの役割の逆転 |
これらのことをふまえて、もう一度送信者(メールクライアント)とメール(SMTP)サーバの会話を見てみましょう。
クライアント側 | サーバ側 | |
---|---|---|
HELLOコマンド | → | |
← | 250 | |
MAILコマンド | → | |
← | 250 | |
RCPTコマンド | → | |
← | 250or251 | |
DATAコマンド | → | |
← | 354 | |
メール本文 | → | |
ピリオドのみ | → | |
← | 250 | |
QUITコマンド | → | |
← | 221 |
QUIT コマンドが送信されると実際にメールが送信されます。
SMTP の仕組みは大まかに以上のような流れになっているのですが、SMTP サーバの仕組みはこれで終わりではありません。SMTP サーバは大抵の場合、受け取ったメールを他のメールサーバ(宛先のメールボックスを持っているサーバ)に転送しなければなりません。この転送のときもSMTP を使用し、他のメールサーバにメールを送ります。
https://www.7key.jp/nw/technology/protocol/smtp.html#extensions
従来のSMTPに加え、元々のSMTPを拡張する方法が登場しました。これを特にESMTP【Extended SMTP/SMTP Servide Extension】と呼びますが、SMTPとESMTPをまとめてSMTPと表現する場合がほとんどです。
SMTPサービス拡張の目的で、SMTPは封筒(envelope)と内容(content)を含むメールをSMTPでリレーするための拡張がなされています。
内容にはヘッダと本文が含まれ、SMTP DATA 単位で送信されます。
従来のHELOコマンドに対して、拡張機能をサポートするSMTPクライアントが発行するEHLOコマンドが追加されています。EHLOコマンドに対してSMTPサーバが返す応答は次の通りです。
応答コード | 内容 |
---|---|
250 | 拡張プロトコルをサポートする(成功) |
554 | 拡張プロトコルが何らかの理由で利用できない(失敗) |
501 | EHLOコマンドは認識するが、引数が拒否される(エラー) |
502 | EHLOコマンドは認識するが、拡張プロトコルが未実装(エラー) |
421 | EHLOコマンドは認識するが、システム停止などの理由でサービスが利用できない(エラー) |
500 | 拡張プロトコルがサポートされていない(失敗) |
コマンド | コマンドの意味 | 機能 |
---|---|---|
EXPN | Expand | 宛先リストを展開する |
HELP | Help | ヘルプ機能を要求する |
SAML | Send and Mail | メールをユーザ端末、及びメールボックスへ配信する |
SEND | Send | メールをユーザ端末へ配信する |
SOML | Send Or Mail | メールをユーザ端末、又はメールボックスへ配信する |
TURN | Turn | 送受信の役割を交代(RFC2821によりセキュリティ上の理由から使用が禁止されている) |
https://www.7key.jp/nw/technology/protocol/smtp.html#other
メッセージはASCII文字に限る、1行は1000文字以内などと言った制限がSMTPにはあります。これを解決する為にMIMEが考え出されました。
広告