メール配送のしくみ

1999/06/25 epnetfan 座学編
高橋 共馬 kyoma@cosmos.sci.hokudai.ac.jp

インターネットにおいて使われている「電子メール」はどのように動いているか.

参考:

もくじ


インターネット・メールアドレス

メールの宛先や発信者を示すのに使われるのがメールアドレス.

kyoma@blue.sci.hokudai.ac.jp

メールアドレスは,@ を含んだ文字列.ローカル部 (kyoma) とドメイン部 (blue.sci.hokudai.ac.jp) から成る.

ドメイン部は,最も後ろにある @ より後の文字列にあたる.それより前がローカル部.例えば,

 God@heaven.af.mil
    @heaven.af.mil
@at@@heaven.af.mil
のドメイン部はどれも heaven.af.mil となる.ローカル部はそれぞれ,God,空,@at@.

ドメイン部は大文字と小文字とを区別しない.以下はみな同じメールアドレス.

God@heaven.af.mil
God@HEAVEN.AF.MIL
God@Heaven.AF.Mil

メッセージの構造

RFC822日本語版とその 注意書き) に定められている.

メッセージはヘッダとボディで構成される.ボディとヘッダの境界は,空行(CRLF しかない行).

X-PostPet-STag: 1
X-PostPet-Switch: 0
Received: from blue.sci.hokudai.ac.jp (blue.sci.hokudai.ac.jp [133.87.45.26])
    by mail.yabumi.com (8.8.8/3.6W) with SMTP id UAA00874
    for <kyoma@yabumi.com>; Tue, 22 Jun 1999 20:10:07 -0700 (PDT)
From: kyoma@blue.sci.hokudai.ac.jp
Message-Id: <199906230310.UAA00874@mail.yabumi.com>
Received: (qmail 28663 invoked from network); 23 Jun 1999 03:02:22 -0000
Received: from skyblue.sci.hokudai.ac.jp (HELO ?133.50.133.146?) (133.50.133.146)
  by blue.sci.hokudai.ac.jp with SMTP; 23 Jun 1999 03:02:22 -0000
Date: Wed, 23 Jun 1999 12:02:24 +0900
To: kyoma@yabumi.com
Subject: test
X-Mailer: Eudora-J(1.3.8.8r6-J16)
X-UIDL: 38cd772c9812707c58953ceb7e0dee27

Hello.

Bye.

ヘッダ

各ヘッダフィールドは,フィールド名とフィールドボディから成る.コロン ": " がこれらを分かつ.フィールドには,"Return-Path", "Received", "Date", "From", "Subject", "Sender", "To", "Cc" などがある. フィールドボディは,複数の行にまたがることができ,2 行目以降の行は空白かタブで始めなければならない.

Subject: test
Received: from blue.sci.hokudai.ac.jp (blue.sci.hokudai.ac.jp [133.87.45.26])
    by mail.yabumi.com (8.8.8/3.6W) with SMTP id UAA00874
    for <kyoma@yabumi.com>; Tue, 22 Jun 1999 20:10:07 -0700 (PDT)

Message Transfer Agent(転送プログラム, MTA)

MTA は,1) SMTP (Simple Mail Transfer Protocol) による,ホスト間のメッセージ転送(リモート配送),2) 指定されたディレクトリ・ファイルへのメッセージの配送(ローカル配送)を行う.

エンベロープ

MTA が(MUA, Mail User Agent などによって)ローカルに生成されたメールを受け取ると,発信者アドレスと受信者アドレスを見つけ,エンベロープを書く.このエンベロープや,リモート配送によって SMTP を通じて受け取ったときには既に付けられているエンベロープによって,メールは配送される.

MTA がローカルに生成されたメールを受け取ると,以下のヘッダフィールドから発信者アドレスを見つける(qmail の場合).

Return-Path, From, Sender, Reply-To, Return-Receipt-To, Errors-To, Resent-Sender, Resent-From, Resent-Reply-To

同様に,以下のフィールドから受信者アドレスを見つける(qmail の場合).

To, Cc, Bcc, Apparently-To, Resent-To, Resent-Cc, Resent-Bcc

エンベロープには,発信者アドレスと受信者アドレスが書かれる.Bcc フィールドは削除される.

通常はエンベロープアドレスはヘッダにあるアドレスと一致している.しかし,そうでないこともある.異なるドメイン部をもつ複数のメールアドレスにメールを配るとき,MTA は,まずメールを複製し,それぞれにエンベロープを付ける.

(エンベロープ) djb から root へ
From: djb
To: root, god@brl.mil
(エンベロープ) djb から god@brl.mil へ
From: djb
To: root, god@brl.mil
同じドメイン部をもつ複数のメールアドレスにメールを配るとき,MTA はメールをコピーしない.
(エンベロープ) djb から god@brl.mil と angel@brl.mil へ
From: djb
To: god@brl.mil, angel@brl.mil, joe, frde

qmail では,受信者アドレスを Delivered-To ヘッダフィールドに,発信者アドレスを Return-Path に記録する.また,Delivered-To をメール転送ループ検出に使う.

エンベロープの受信者アドレスのドメイン部が,その MTA の動いているホストを指しているとき,ローカル配送が行われ,そのホストの外を指しているとき,リモート配送によって目的のホストに送られる.

リモート配送

参考: RFC821日本語), http://netnews.to/tec/smtppop.htm

リモート配送のときには,メールのエンベロープにしたがって配送(返送)される.

エンベロープの受信者アドレスのドメイン部から Domain Name Server (DNS) の MX (Mail eXchanger) レコードを検索して,宛先(送り先)ホストを決定する.

メッセージがホスト間を移動するとき,送り先ホストとの接続手順には SMTP (RFC821) が使われる.そのとき,エンベロープ発信者は MAIL FROMコマンドにより,また,エンベロープ受信者はRCPT TOコマンドにより伝えられる.また,メッセージは DATA コマンドにより伝えられる.

例," | ","S | ","SN| ","NS| " でマークしたのはそれぞれ,受け手から送り手,送り手から受けて,送り手から DNS,DNS から送り手への通信.

SN| #P\05\0$#####\0\0#\0\0\0\0\0\0#yabumi#com\0\0#\0#
        (ANY? yabumi.com.)
NS| \05#P\0#S#####\0#\0#\0#\0##yabumi#com\0\0#\0###\0#\0#\0#gp\0##MAIL#P
    LAYA-US#com\0##\0#\0#\0#gp\0##YABUMI#-##\0#\0#\0#;#\0#\0\n#mail####\
    0#\0#\0#gp\0##(##\0#\0#\0#gp\0##G#(\0#\0#\0#f!\0######G\0#\0#\0#f!\0
    ######^\0#\0#\0#;#\0#####
        (NS MAIL.PLAYA-US.com., NS YABUMI.PLAYA-US.com., MX mail.yabumi.com.)
SN| #Q\05\0$\r####\0\0#\0\0\0\0\0\0#yabumi#com\0\0#\0#
        (MX? yabumi.com.)
NS| \05#Q\0#######\0#\0#\0#\0##yabumi#com\0\0#\0###\0#\0#\0#;#\0#\0\n#ma
    il####\0#\0#\0#gp\0##MAIL#PLAYA-US#com\0##\0#\0#\0#gp\0##YABUMI#B#*\
    0#\0#\0#;#\0######=\0#\0#\0#f!\0######\\0#\0#\0#f!\0#####
        (MX mail.yabumi.com.)
SN| #R\05\0)#s###\0\0#\0\0\0\0\0\0#mail#yabumi#com\0\0#\0#
        (A? mail.yabumi.com.)
NS| \05#R\0#=#####\0#\0#\0#\0##mail#yabumi#com\0\0#\0###\0#\0#\0#;#\0###
    ###YABUMI#COM\0\0#\0#\0#gp\0##MAIL#PLAYA-US#8#1\0#\0#\0#gp\0##YABUMI
    #L#G\0#\0#\0#f!\0######c\0#\0#\0#f!\0#####
        (A mail.yabumi.com)
SN| #S\05\05N+###\0\0#\0\0\0\0\0\0#242#226#20#207#in-addr#arpa\0\0#\0#
        (PTR? 242.226.20.207.)
S | 
NS| \05#S\0#w#####\0#\0#\0#\0##242#226#20#207#in-addr#arpa\0\0#\0###\0#\
    0#\0#Q#\0##mail#yabumi#com\0#226#20#207#in-addr#arpa\0\0#\0#\0#Q#\0#
    #mail#playa-us#E#J\0#\0#\0#Q#\0##yabumi#r#m\0#\0#\0#Q#\0#######\0#\0
    #\0#Q#\0#####
        (PTR mail.yabumi.com.)
  | 220 mail.yabumi.com ESMTP Sendmail 8.8.8/3.6W; Tue, 22 Jun 1999 20:10:07 -0700 (PDT)
S | HELO blue.sci.hokudai.ac.jp
  | 250 mail.yabumi.com Hello blue.sci.hokudai.ac.jp [133.87.45.26], pleased to meet you
S | MAIL FROM:<kyoma@blue.sci.hokudai.ac.jp>
  | 250 <kyoma@blue.sci.hokudai.ac.jp>... Sender ok
S | RCPT TO:<kyoma@yabumi.com>
  | 250 <kyoma@yabumi.com>... Recipient ok
S | DATA
  | 354 Enter mail, end with "." on a line by itself
S | Received: (qmail 28663 invoked from network); 23 Jun 1999 03:02:22 -0000
    Received: from skyblue.sci.hokudai.ac.jp (HELO ?133.50.133.146?) (133.50.133.146)
      by blue.sci.hokudai.ac.jp with SMTP; 23 Jun 1999 03:02:22 -0000
    Date: Wed, 23 Jun 1999 12:02:24 +0900
    To: kyoma@yabumi.com
    From: kyoma@blue.sci.hokudai.ac.jp
    Subject: test
    X-Mailer: Eudora-J(1.3.8.8r6-J16)
    
    test.
    
    .
  | 250 UAA00874 Message accepted for delivery
S | QUIT
  | 221 mail.yabumi.com closing connection

配送記録

参考: RFC822日本語版とその 注意書き

メッセージがホストからホストへリレーされるたびに,新しい Received フィールドがメッセージヘッダに加えられる.

"from" domain    送り出したホスト
"by" domain      受け取ったホスト
"via" atom       物理的なパス
"with" atom      リンク・メールプロトコル
"id" msg-id      受け取り手のメッセージID
"for" addr-spec  元々の受信者アドレス

Received: from blue.sci.hokudai.ac.jp (blue.sci.hokudai.ac.jp [133.87.45.26])
    by mail.yabumi.com (8.8.8/3.6W) with SMTP id UAA00874
    for <kyoma@yabumi.com>; Tue, 22 Jun 1999 20:10:07 -0700 (PDT)

ローカル配送

MUA が受け取ったメールのエンベロープの受信者アドレスのドメイン部が,その MTA の動いているホストを指しているとき,ローカル配送が行われる.

ローカル配送においては,エンベロープの受信者アドレスのローカル部によって配送先が決められる.これにより,ユーザのディレクトリ・ファイルなどに配られる.

ローカル配送の制御にはホームディレクトリの .qmail ファイル(qmail のばあい)や .forward ファイル(sendmail のばあい)が使われる.これにより,届いたメールの転送などが制御される.

転送されたメッセージは,以下のようなフィールドを加えられている.

Resent-Sender, Resent-From, Resent-Reply-To, Resent-To, Resent-Cc, Resent-Bcc, Resent-Date, Resent-Message-ID

Mail User Agent(MUA)

利用者がメールの読み書きに使うのが MUA.ローカルなディレクトリ・ファイルに配られたメールを読み出し,また,メールを MTA に渡す.

リモートのメールサーバと通信してメールを読み書きする MUA

参考: http://netnews.to/tec/smtppop.htm

ローカルなメールの配達先ディレクトリ・ファイルを直接読むのではなく,POP, APOP, IMAP といったプロトコルを使って,リモートのメールサーバ上のディレクトリ・ファイルを読むような MUA もある(パソコンのはこれにあたる).

こうした {POP,APOP,IMAP} プロトコルを使った通信には,これに対応した {POP,APOP,IMAP} クライアント (MUA) と,{POP,APOP,IMAP} サーバ(メールサーバにそうした機能をもたせる)が必要である.

例,APOP.S| でマークしたのがサーバからクライアントへの通信.

S| +OK <27969.930028995@blue.sci.hokudai.ac.jp>
 | APOP kyoma 39db6086a2177820774b3f07befaf946
S| +OK
 | STAT
S| +OK 1 467
 | LIST 1
S| +OK 1 467
 | RETR 1
S| +OK
S| Return-Path: <kyoma@blue.sci.hokudai.ac.jp>
   Delivered-To: kyoma@blue.sci.hokudai.ac.jp
   Received: (qmail 27963 invoked from network); 22 Jun 1999 05:23:14 -0000
   Received: from skyblue.sci.hokudai.ac.jp (HELO ?133.50.133.146?) (133.50.133.146)
     by blue.sci.hokudai.ac.jp with SMTP; 22 Jun 1999 05:23:14 -0000
   Date: Tue, 22 Jun 1999 14:23:14 +0900
   To: kyoma@blue.sci.hokudai.ac.jp
   From: kyoma@blue.sci.hokudai.ac.jp
   Subject: tes
   X-Mailer: Eudora-J(1.3.8.8r6-J16)
   
   tes
   
   .
 | DELE 1
S| +OK 
 | QUIT
S| +OK

例,POP.

S| +OK QUALCOMM Pop server derived from UCB (version 2.1.4-R3) at cosmos starting.
 | USER kyoma
S| +OK Password required for kyoma.
 | PASS xxxxxxxx
S| +OK kyoma has 1 message(s) (771 octets).
 | STAT
S| +OK 1 771
 | LIST
S| +OK 1 messages (771 octets)
S| 1 771
S| .
 | RETR 1
S| +OK 771 octets
S| >From kyoma@blue.sci.hokudai.ac.jp  Tue Jun 22 13:05:45 1999
   Received: from blue.sci.hokudai.ac.jp (blue.sci.hokudai.ac.jp [133.87.45.26])
           by cosmos.sci.hokudai.ac.jp (8.8.8/3.6W) with SMTP id NAA10723
           for <kyoma@cosmos.sci.hokudai.ac.jp>; Tue, 22 Jun 1999 13:05:45 +0900 (JST)
   From: kyoma@blue.sci.hokudai.ac.jp
   Message-Id: <199906220405.NAA10723@cosmos.sci.hokudai.ac.jp>
   Received: (qmail 27776 invoked from network); 22 Jun 1999 04:04:27 -0000
   Received: from skyblue.sci.hokudai.ac.jp (HELO ?133.50.133.146?) (133.50.133.146)
     by blue.sci.hokudai.ac.jp with SMTP; 22 Jun 1999 04:04:27 -0000
   Date: Tue, 22 Jun 1999 13:04:27 +0900
   To: kyoma@cosmos.sci.hokudai.ac.jp
   Subject: test
   X-Mailer: Eudora-J(1.3.8.8r6-J16)
   
           test
   
   
   .
 | DELE 1
S| +OK Message 1 has been deleted.
 | STAT
S| +OK 0 0
 | QUIT
S| +OK Pop server at cosmos signing off.

このような MUA がメールを発送するときは,「SMTP サーバ」として指定するメールサーバにメールを送る.この際には,SMTP が使用される.メールサーバは,エンベロープに従って配送する.

例," | ","S | ","SN| ","NS| " でマークしたのはそれぞれ,クライアントから(メール)サーバ,サーバからクライアント,サーバから DNS,DNS からサーバへの通信.

  | 
S | 
SN| #N\05\03###\#\0\0#\0\0\0\0\0\0#26#45#87#133#in-addr#arpa\0\0#\0#
        (PTR? 26.45.87.133.)
NS| \05#N\0#m##\##\0#\0#\0#\0##26#45#87#133#in-addr#arpa\0\0#\0###\0#\0#
    \0#~@\0##blue#sci#hokudai#ac#jp\0#87#133#in-addr#arpa\0\0#\0#\0#~@\0
    ##nameserv#sys#@#O\0#\0#\0#~@\0##wsclark#huie#@#O\0#\0#\0#~@\0##name
    serv2#w#n\0#\0#\0#~@\0##W####\0#\0#\0#~@\0##W#\n##\0#\0#\0#~@\0##W##
    ##\0#\0#\0#~@\0####R
        (PTR blue.sci.hokudai.ac.jp.)
SN| #O\05\05###]#\0\0#\0\0\0\0\0\0#146#133#50#133#in-addr#arpa\0\0#\0#
        (PTR? 146.133.50.133.)
NS| \05#O\0##o#]##\0#\0#\0#\0##146#133#50#133#in-addr#arpa\0\0#\0###\0#\
    0#\0#~@\0##skyblue#sci#hokudai#ac#jp\0#50#133#in-addr#arpa\0\0#\0#\0
    #~@\0##nameserv#sys#E#T\0#\0#\0#~@\0##wsclark#huie#E#T\0#\0#\0#~@\0#
    #nameserv2#|#s\0#\0#\0#~@\0##W####\0#\0#\0#~@\0##W#\n##\0#\0#\0#~@\0
    ##W####\0#\0#\0#~@\0####R
        (PTR skyblue.sci.hokudai.ac.jp.)
S | 220 blue.sci.hokudai.ac.jp ESMTP
  | HELO [133.50.133.146]
S | 250-blue.sci.hokudai.ac.jp
    250-PIPELINING
    250 8BITMIME
  | RSET
S | 250 flushed
  | MAIL FROM:<kyoma@blue.sci.hokudai.ac.jp>
S | 250 ok
  | RCPT TO:<kyoma@yabumi.com>
S | 250 ok
  | DATA
S | 354 go ahead
  | Date: Wed, 23 Jun 1999 12:02:24 +0900
  | To: kyoma@yabumi.com
  | From: kyoma@blue.sci.hokudai.ac.jp
  | Subject: test
    X-Mailer: Eudora-J(1.3.8.8r6-J16)
  | 
    test.
    
    .
S | 250 ok 930106942 qp 28663
  | QUIT
S | 221 blue.sci.hokudai.ac.jp