広告
広告
https://www.7key.jp/nw/technology/protocol/smtp.html#smtpSMTP は【Simple Mail Transfer Protocol】の略となっていまして、メールを送信する際に使用するプロトコルです。もともとはサーバ間でメールのやりとりをするために使用されるプロトコルだったのですが、ユーザーがメーラー(メールクライアント)を使ってメールサーバ(正確にはSMTP サーバ)にメールを送信する際にも使用されるため、一般にも広く知られる名前となっています。
https://www.7key.jp/nw/technology/protocol/smtp.html#structureSMTP の仕組みはクライアントとサーバ間の対話によって実現されています。とは言いましても、コンピュータの世界ですので本当に話をしているわけではありません。送信側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が考え出されました。
広告