このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

POP3の仕様書はどこでしょうか?

発言者:稲垣@信州
( Date Saturday, February 08, 1997 21:13:11 )


 いつもお世話になっています。稲垣@信州です。

 メイルリストのスクリプト用にPOP3の仕様書のありかを探してい
ます。

 RFC-indexから、POP3を探したのですが、RFC-1734,1957があっ
たのですが、どうも探しているものとは違いました。

 探しているのは、POP3のクライアントとサーバでのやり取りの、手
順の載っているものです。

 TCP/IP addtionで組むようなレベルのものです。

 RFC番号か、参考になる本などを知っていましたら、教えてください。


元永二朗 さんからのコメント
( Saturday, February 08, 1997 22:28:16 )

1957に、RFC 1939 を参照しろって、書いてありますよ(^^)。
indexを 'Post Office Protocol' ('POP' ではなく) で検索すると
引っかかります。

→  RFC1939

元永二朗 さんからのコメント
( Saturday, February 08, 1997 22:31:20 )

それと、telnetでpopのポートに実際につないでみるとセッションの様子が
良く分かります。

田中求之 さんからのコメント
( Saturday, February 08, 1997 22:41:00 )

POP サーバーからメールをダウンロードするスクリプト( TCP/IP osax 利用)
のサンプルもありますが、いりますか?

POP の手順を理解するには、元永さんが書かれているように、RFC を見ながら
Telnet で手動でダウンロードの実験をするのが一番です。そのログを保存して
おいて、後でスクリプトに翻訳すれば出来上がります。

ただし、TCP/IP osax で大量のメールを連続してダウンロードしようとすると
エラーが起きることがあるようです(私はこれが原因で、会議室へのメールによる
投稿システムの開発を中止しました (^_^;;  )。

佐藤@京都市 さんからのコメント
( Sunday, February 09, 1997 01:59:52 )

Frontier の tcpcmd のスクリプトもなかなか参考になりますよ。
サーバーに残しておいたメールを削除するスクリプトを書いて
便利に使っています。

昔は telnet して keyquencer で
dele 1
dele 2
などと打ち込ませていました。

佐藤@京都市 さんからのコメント
( Sunday, February 09, 1997 05:42:58 )

RFC1939 は日本語訳があるようです。

→  rfc1939-jp.html

稲垣@信州 さんからのコメント
( Sunday, February 09, 1997 16:04:23 )

 どうも皆さんありがとうございます。

 簡単なところで見落としていたようですね。ではダウンロードして研
究します。

 ありがとうございました。

 あと、田中先生、サンプルをもらえるとうれしいです。

 メイルは、f925003@giptc.shinshu-u.ac.jpまでお願いします。

田中求之 さんからのコメント
( Sunday, February 09, 1997 18:04:17 )

ではサンプルのスクリプトです。とりあえず動くというレベルのものですので、
実験には気を付けてください。

----

property LF : (ASCII character 10)
property crlf : (ASCII character 13) & (ASCII character 10)


property myHost : "" --- POP サーバーの Host
property myName : "" --- POP アカウントのユーザー名
property myPass : "" --- POP アカウントのパスワード

on run
  getMail()
end run


on getMail()
  tcp start
  set sss to (tcp connect to host myHost port 110)
  readStream(sss, "")
  
  try
    tcp write data "USER " & myName & crlf stream sss
    set myLine to readStream(sss, "")
    set myFlg to checkresult(myLine)
    if myFlg is not "+OK" then
      error
    end if
    
    tcp write data "PASS " & myPass & crlf stream sss
    set myLine to readStream(sss, "")
    set myFlg to checkresult(myLine)
    if myFlg is not "+OK" then
      error
    end if
    
    
    tcp write data "STAT" & crlf stream sss
    set myStat to (readStream(sss, "") as string)
    set mySlist to tokenize myStat with delimiters " "
    if item 1 of mySlist is "+OK" then
      set myNum to (item 2 of mySlist) as integer
      if myNum > 0 then
        repeat with myDone from 1 to myNum
          try
            tcp write data "RETR " & myDone & crlf stream sss
            repeat until (tcp ahead characters (crlf & "." & crlf) stream sss)
            end repeat
            set myData to tcp read stream sss until characters (crlf & "." & crlf)
            ----
            set myLine to formatGetMail(myData)
            set myFlg to checkresult(myLine)
            if myFlg is not "+OK" then
              error
            end if
            ----
            tcp write data "DELE " & myDone & crlf stream sss
            set myLine to readStream(sss, "")
          on error
          end try
        end repeat
      end if
    end if
    tcp write data "QUIT" & crlf stream sss
    tcp close stream sss
    tcp finish
  on error
    tcp write data "QUIT" & crlf stream sss
    tcp close stream sss
    tcp finish
  end try
  
end getMail

on formatGetMail(myData)
  --- メールの全体が渡されるので、ここで MIME をデコードしたり
  --- JIS を SJIS に変換する、あるいはメールをファイルにする
  --- 等の処理を行う。
  
  
  return "OK"
end formatGetMail

on readStream(sstream, myTerm)
  if myTerm is "" then set myTerm to crlf
  repeat until (tcp ahead characters myTerm stream sstream)
  end repeat
  set myRLine to (tcp read until characters myTerm stream sstream using ISO88591)
  return myRLine
end readStream

on checkresult(myLine)
  set AppleScript's text item delimiters to {}
  return ((characters 1 through 3 of myLine) as string)
end checkresult


稲垣@信州 さんからのコメント
( Monday, February 10, 1997 10:05:45 )

 田中先生、ありがとうございます。

 色々確認をしながら、勉強したいと思います。