CLX C++ Libraries
Home >> pop3

Declaration

template <class Socket>
class basic_pop3 : public Socket;

typedef basic_pop3<tcp::socket> pop3;

Overview

pop3 クラスは POP3 (Post Office Protocol version 3) を用いて, メールサーバからメールを受信するためのクラスです. start() メソッドでメールサーバと接続し,login() メソッドでログイン処理を行った後, 各種メソッドを用いてメールサーバと通信を行います.ログイン方法は, 平文による認証方式と APOP 認証方式に対応しています.

メールの内容を取得する retrieve() メソッドには,関数オブジェクト(または,関数ポインタ) を指定することもできます.引数として関数オブジェクトが指定された場合,pop3 クラスはメールの内容を 受信するための入力ストリームを関数オブジェクトへ渡します.指定する関数オブジェクト, または関数ポインタには以下ような関数が定義されている必要があります.

// 関数の場合
void recvmail(std::istream& sin);

// 関数オブジェクトの場合
class recvmail {
public:
    template <class InputStream>
    void operator()(InputStream& sin);
};

pop3 クラスは,サーバからエラーメッセージが返された場合には pop3_error を例外として送出します.

Example

example_pop3.cpp

#include <iostream>
#include <string>
#include "clx/pop3.h"

int main(int argc, char* argv[]) {
    if (argc < 4) std::exit(-1);
    
    try {
        clx::pop3 session(argv[1], 110);
        
        // APOP が使用できるなら APOP 認証を用いる.
        session.login(argv[2], argv[3], session.apop_support());
        
        std::cout << "status: " << session.status() << std::endl;
        
        // LIST コマンド
        clx::pop3::list_type list = session.list();
        std::cout << "mail list" << std::endl;
        std::cout << "-----" << std::endl;
        for (size_t i = 0; i < list.size(); ++i) {
            std::cout << list[i] << std::endl;
        }
        std::cout << "-----" << std::endl;
        
        // TOP コマンド
        std::cout << "top [1]" << std::endl;
        std::cout << "-----" << std::endl;
        std::cout << session.top(1, 0) << std::endl;
        std::cout << "-----" << std::endl;
        
        session.finish();
    }
    catch (clx::pop3_error& e) {
        std::cerr << e.what() << std::endl;
        std::exit(-1);
    }
    catch (clx::socket_error& e) {
        std::cerr << e.what() << std::endl;
        std::exit(-1);
    }
    catch (std::runtime_error& e) {
        std::cerr << e.what() << std::endl;
        std::exit(-1);
    }
    
    return 0;
}
Result
status: 6 5543
mail list
-----
1 975
2 1012
3 960
4 866
5 864
6 866
-----
top [1]
-----
Return-Path: <clown@abeam.ocn.ne.jp>
Delivered-To: clown@cielquis.net

・・・(以下略)・・・

Template Parameters

Socket
ソケットクラスを指定します.

Related Types

typedef Socket socket_type;
typedef char char_type;
typedef std::basic_string<char_type> string_type;
typedef std::vector<string_type> list_type;

Construction and Member Functions

basic_pop3();
basic_pop3(const basic_pop3& cp);
explicit basic_pop3(const string_type& host, int port = 110);
explicit basic_pop3(const char_type* host, int port = 110);
virtual ~basic_pop3();

basic_pop3& start(const string_type& host, int port = 110);
basic_pop3& start(const char_type* host, int port = 110);

void finish();

basic_pop3& login(const string_type& id, const string_type& pass, bool apop = false);
basic_pop3& login(const char_type* id, const char_type* pass, bool apop = false);
basic_pop3& apop(const string_type& id, const string_type& pass);
basic_pop3& apop(const char_type* id, const char_type* pass);

start() メソッドで SMTP サーバと接続し,login() メソッドでログイン処理を行います. login() メソッドの第 3 引数が true の場合,APOP 認証を試みます.これは,login() メソッドの代わりに apop() メソッドを実行した場合と等価です. サーバが APOP 認証に対応しているかどうか不明な場合は,apop_suppert() メソッドの返り値を第 3 引数に指定しておくと,APOP 認証が可能なときだけ APOP 認証を実行するように設定することができます.

string_type status();

list_type list();
list_type uid_list();
string_type list(int n);
string_type uid_list(int n);

string_type retrieve(int n);

template <class Functor>
basic_pop3& retrieve(int n, Functor f);

string_type top(int n, int line);

basic_pop3& erase(int n);
basic_pop3& reset();
basic_pop3& noop();

status(), list(), uid_list(), retrieve(), top(), erase(), reset(), noop() メソッドは, それぞれ POP3 で定められている STAT, LIST, UIDL, RETR, TOP, DELE, RSET, NOOP コマンドをメールサーバへ送信し,サーバからの応答を受信します.

bool apop_support() const;

apop_support() メソッドは,通信しているメールサーバが APOP 認証に対応している場合に true を返します.

Related Pages

  1. CLX C++ Libraries - pop3s
  2. CLX C++ Libraries - smtp
  3. CLX C++ Libraries - smtps

Reference

  1. ThikIT - 暗号化した通信はtcpdumpでどう見えるか