POPによるメールの取り込み

戻る

メールの取り込みはPOP(バージョン3)を用いて行う。手順としては、サーバに対して接続を行った後、ユーザ名&パスワードを送りログイン、コマンドを用いてメールのチェックと取り込み・削除を行う。通常使用するPOPコマンドは下記の通りである。(各コマンドの末尾に<CR><LF>を付けることを忘れないように)

USER xxxxユーザ名「xxxx」の通知
PASS yyyyパスワード「yyyy」の通知
STAT到着しているメール数と容量の確認
RETR nn番目のメールの取り込み
DELE nn番目のメールの削除
QUIT終了
これらの他、POPコマンドとしては、到着しているメールのサイズ一覧を取得できる「LIST」や、メールの最初の数行のみを取りこむための「TOP」、削除指定を解除するための「RSET」等も存在する。また、ユーザ認証については、「APOP」という方法も使用できるが、これらについてはここでは言及しない。

サーバへの接続は、ドメインネームもしくはIPアドレスと、ポート番号を指定して行う。POP3のポート番号は通常110である。ドメインネームやIPアドレスについては、VBでWinsockコントロールを使用している限りでは、どちらを使用しようと問題はないが、システムによって異なる可能性はある。

サーバへの接続の後と、これらのコマンドを送付した後は、サーバ側から戻り値やステータスを含んだ文字列が返される。これは、エラーが無ければ「+OK」で、エラーがあれば「-ERR」で始まる文字列で、メールリーダ側はこの受信をした後で次の処理に移る。返答の受信にあたっては、ネットワークでの遅延に対しての対策が必要であるとともに、予期せぬネットワーク切断に対処すべく、プログラム上ではタイムアウト処理を考えねばならない。

上記のコマンドのうち、注意すべきこととしては、処理終了後は必ず「QUIT」とすることがあげられる。サーバ側は、ネットワークのエラー(回線の切断)に備え、一定時間後にタイムアウトするのが普通であるが、その間のアクセスが不能になるなどの問題が生じる。また、「QUIT」した時点で初めて「DELE」で指定した削除が実行される。同様に、新着のメールについても、接続状態では反映されない。現実には、タイマを用いるなどして、定期的にサーバへの接続とメールの取り込みを行い、その都度(メールがあろうと無かろうと)「QUIT」する処理となる。たとえば、メールを取り込んだ後に処理を加える場合など、その処理段階でエラーが生じることを考慮するならば、一旦「QUIT」しておき、全ての処理が終了した時点で、改めて接続して「DELE」コマンドを送るような工夫が必要であろう。

実際の処理ステップは概略下記の通りとなる。各項1行目のイタリックの部分が、コマンドである。2行目以降は、コマンド送出後の処理となる。

  1. サーバのポート110への接続(Open)
    ステータス「+OK ...」の戻りを確認し、次のステップへ
  2. ユーザ名の送出「USER xxxx
    ステータス「+OK ...」の戻りを確認し、次のステップへ
  3. パスワードの送出「PASS yyyy
    ステータス「+OK ...」の戻りを確認し、次のステップへ
  4. メール到着確認「STAT
    ステータス「+OK ...」の戻り値により、到着メール数を確認。もし0ならば終了する。
  5. メール取得「RETR n
    まず、ステータス「+OK ...」(1行)が戻り、引き続き本文を受信する。到着メールの数に応じて、これを繰り返す。
  6. 終了コマンドの送出「QUIT
    ステータス「+OK ...」が戻った後、切断(Close)する。
  7. ....受信メールに関する内部処理....
  8. サーバのポート110への接続(Open)
    ステータス「+OK ...」の戻りを確認し、次のステップへ
  9. ユーザ名の送出「USER xxxx
    ステータス「+OK ...」の戻りを確認し、次のステップへ
  10. パスワードの送出「PASS yyyy
    ステータス「+OK ...」の戻りを確認し、次のステップへ
  11. メール削除「DELE n
    ステータス「+OK ...」の戻り戻りを確認し、到着メールの数に応じて、これを繰り返す。次のステップへ。
  12. 終了コマンドの送出「QUIT
    ステータス「+OK ...」が戻った後、切断(Close)する。

同じようなコマンド羅列が繰り返しになっているが、これは、「受信」のステップと受信済みメールに関する「削除」のステップを別けているからである。別けている理由は主にエラー時の対策をとるためであり、念を入れているということだ。一度の接続で受信と削除を連続して行ってしまっても構わない。なお、繋ぎっぱなしで放置した場合、サーバ側で時間切れとなり自動切断されることもあるし、回線エラーに遭遇する危険性もある。この辺は、使用環境を考慮する。

メールのチェック頻度や、同時取り込み数は、メールの使用状況に応じて考えておく。さほど頻度が高くないのであれば、メールを1本ずつ取り込み、削除していくようにすると、プログラミング上での負担はわずかながら軽減されるであろう。その場合は、上記で採っているメール確認ステップ(STATコマンド)を省略し、取り込みコマンド「RETR」に対するエラー確認にしてしまう手もある。

もし、受信メールのサイズを規定しておきたいのであれば、上記の「RETR n」コマンドに代えて、「TOP n 100」というコマンドを用いると良い。この例の100は、ヘッダを除いて100行目までを受信するという指定になる。また、受信するメールサイズが非常に大きい場合は、プログラミング上での工夫が必要になる。


ProtocolNameRFC
POP3Post Officce Protocol, Version 31939