E-mailの構造


E-mailを実際に送受信するためのProtocolである、SMTP、POPについて書いていきます。ここで、もうひとつのE-mailのProtocolのIMAPについては、割愛させてもらいます。というのも、今現在、私が知らないことが要因です。


E-mail送受信

E-mailのmessageは、headerとbodyで構成されています。body部は、MUAでuserが作ったmessageの本文にあたります。MUAでuserが作った、本文以外の部分は、headerの一部になります。

headerの例を下表に示します。この中で、上から3つ、Date,From,Toが必須です。

header説明
DateSun,01 Oct 2000 12:34:56 +0900送信日付
From"the GAME"<hhh@wwf.com>送信者
ToVince<owner@wwf.com>受信者
Message-ID01102000001@wwf.commessageの番号。世界中でuniqueでなければならない
Reply-Torock@eyebrow.org送信者が返信をしてもらうときにFromで指定したaddress以外のaddress
MIME-Version1.0MIMEのVersion
Subjectfor World Champion's fans表題
Ccjimmy@44magnum.co.jpcarbon copyの宛先
Bccrei_atsumi@vowwow.co.jpBlind Carbon Copyの宛先
Content-Typetext/plain; charset=iso-2022-jp本文の形式

上記を踏まえて、E-Mailの見本を下に示します。この中で、DateとMessage-Idは、自動生成されました。実際には、Receivedというheaderも加わるのですが、serverが勝手に付加するものなので、気にする必要はないでしょう。もっとたくさんの見本が欲しい方は、ご自身のMUAに(ほとんどの場合)、header情報を見る機能がありますので参照ください。

From: "the GAME"<hhh@wwf.com> Date: Sun, 13 Jun 1999 22:22:11 +0900 (JST) Message-Id: <199906131322.WAA02027@wwf.com> Subject: test To: Vince<owner@wwf.com> X-Mailer: PostMan v 1.0 Mime-Version: 1.0 Content-Type: TEXT/PLAIN; charset="iso-2022-jp" X-UIDL: abae988542544dd28735ce39afe3fed5 これは、てすとです

SMTPの通信手順

それでは、送信側のProtocolであるSMTPから見て行きましょう。

SMTP Serverにmailを送るには、そのserverのDomain Nameまたは、IP AddressがわかればOKです。まれにPort番号が、Wellknown Portと違う場合もありますので、違う場合は注意する必要があります。詳しくは、所属のProviderに問い合わせてください。下表は、主なSMTP commandです。serverと実際のやり取りに使われます。

Command用途
HELOserverにこれから通信を始めることを伝える。messageの送信Domainを伝える意味でも使える。
MAILMail送信の初期化。送信者を伝える。
RCPT送信先の指定。
DATAMail送信の開始。
RSETMail送信のResetをして、やり直す。
HELPhelp情報の取得。
QUITSMTPとの接続を終了する。

上記のcommandをserverが受信すると、返答を返します。この返答は、番号が付与されています。この番号の例を下表に示します。

番号意味
211System Status/System Help
214Help Message
220service準備完了
221SMTP connection終了
250要求commandの完了
354mail受付開始
421service受付不可。SMTP session終了
451local側のerror
452記憶容量不足
500commandの構文error
501引数などのerror
502要求されたcommandを知らない
503要求commandの順序が違う
504要求commandの引数などが実装されていない
551指定のserverに指定のuserが存在しない

SMTP serverの実際の動作は、

  1. まず、serverのDomain Nameまたは、IP AddressとPort番号を指定して、接続します。
  2. すると、serverから、OKならば220で始まるmessageが返ってきます。
  3. 次に、HELO (Domain Name)という風に自分のDomain Nameを含んでcommandを入力します。
  4. serverから、OKならば250で始まるmessageが返ってきます。
  5. 次に、MAIL From: (Mail Address)という風に自分のMail Addressを含んでcommandを入力します。
  6. serverから、OKならば250で始まるmessageが返ってきます。
  7. 次に、RCPT to:(Mail Address)という風に宛先のMail Addressを含んでcommandを入力します。
  8. serverから、OKならば250で始まるmessageが返ってきます。
  9. 次に、DATAとcommandを入力します。
  10. serverから、OKならば354で始まるmessageが返ってきますので、
  11. Message[headerと本文]を入力し、最後に"."のみの行を入力します。
  12. OKならば250で始まるmessageが返ってきます。
  13. 次に、QUITとcommandを入力します。
  14. serverから、OKならば221で始まるmessageが返ってきます。

これで送信完了となります。ここで、各入力の最後には、改行codeが必要となりますが、Internetの改行codeは、CR+LFです。また、各入力でのserverからの応答がerrorの場合、やり直さなければなりません。

以下に例示します。

Client側Server側
smtp.wwf.com:25220 ESMTP server (InterMail vM.5.01.03.08 201-253-122-118-108-20010628) ready Sun, 7 Oct 2001 15:59:12 +0900
HELO hhh@wwf.com250 sendmail1.wwf.com
MAIL From:hhh@wwf.com250 Sender <hhh@wwf.com> Ok
RCPT To:owner@wwf.com250 Recipient <owner@wwf.com> Ok
RCPT To:smh@wwf.com250 Recipient <smh@wwf.com> Ok
RCPT To:rock@wwf.com250 Recipient <rock@wwf.com> Ok
DATA354 Ok Send data ending with .
これは、てすとです
"CR+LF"."CR+LF"
250 Message received: 20011007070356.SBHL1468.sendmail1.wwf.com@wwf.com
QUIT221 sendmail1.wwf.com ESMTP server closing connection.

POPの通信手順

POPの通信手順は、SMTPの通信手順にいくつかの手順が追加されているようなものです。SMTPと同じように、POPについて見ていきましょう。

POP serverと通信を行うには、serverのDomain Nameまたは、IP AddressとPort番号、User名、そのPasswordが必要です。詳しくは、所属のProviderに問い合わせてください。下表は、主なPOP commandです。serverとの実際のやり取りに使われます。

Command用途
USERUser名を知らせる
PASSPasswordを送る
APOPUSER、PASSを暗号化して送る
LISTmail boxにあるmailの一覧を取り出す
RETRmailを取り出す
DELEmailを削除する。ただし、実際に削除されるのは、接続を終了したときであり、それまでは、ゴミ箱に入ってるような状態
RSET接続をresetする
QUIT接続を終了する

上記のcommandをserverが受信すると、返答を返します。この返答は、OKなら"+OK"、NGなら"-ERR"、という単純なものです。

POP serverとの実際のやり取りですが、以降は全てのcommandが正常であった場合の動作です。

  1. まず、serverのDomain Nameまたは、IP AddressとPort番号を指定して、接続します。
  2. すると、serverから、+OKで始まるmessageが返ってきます。
  3. 次に、USER (User名)と言うように自分のUser名を入力します。
  4. すると、serverから、+OKで始まるmessageが返ってきます。
  5. 次に、PASS (Password)と言うようにPasswordを入力します。
  6. すると、serverから、+OKで始まるmessageが返ってきます。
  7. 次に、LISTと入力します。
  8. すると、serverから、+OKとmailの数とbyte数が返ってきます。
  9. ここでは、仮に3つのmailがあったとしましょう。この場合、1から連番で番号が振られますので、その数字でやり取りをします。
  10. ここでは、2番目のmessageだけを取り出すことにします。
  11. RETR 2と入力します。
  12. すると、serverから、+OKと実際のmailが取り出されます。
  13. そして、もし、このmailを削除する場合は、DELE 2と入力します。
  14. すると、serverから、+OKで始まるmessageが返ってきます。
  15. QUITと入力します。
  16. すると、serverから、+OKで始まるmessageが返ってきます。

これで、session終了です。なお、複数のmessageを取り出すには、RETR commandとDELE commandを複数回繰り返せば、取り出すことができます。

以下に例示します。

Client側Server側
pop3.wwf.com:110+OK InterMail POP3 server ready.
USER hhh+OK please send PASS command
PASS thegame+OK 0112080501 is welcome here
LIST+OK 1 messages
1 522
.
RETR 1+OK 522 octets
Return-Path: <hhh@wwf.com>
Received: from wwf.com
Message-Id: <20011007070356.SBHL1468.sendmail.wwf.com@hhh.wwf.com>
Date: Sun, 7 Oct 2001 16:04:19 +0900
From: <0112080501@jcom.home.ne.jp>
これは、てすとです
.
QUIT+OK hhh Sendmail POP3 server signing off.

最後に

SMTPとPOPの例の中で"serverから、・・・・で始まるmessageが返ってきます。"と書いているのは、serverによって内容が異なるからです。しかし、基本的な動作は、RFCに標準化されていますので、変わりません。どちらも、telnet接続で、ためすことができますので、試してみては如何でしょうか。telnetのapplicationは、online softwareとして、あちこちに転がってるし、OSに大体標準で含まれているようです。また、serverを自分のmachineで動かすsoftwareもあります。

また、自分でMUAを作成する場合は、Serverの応答の1文字目に注目すれば簡単に実装できるでしょう。

2001/10/082005/02/14
Copyright © 2005 antithese@metalpress All Rights Reserved