CLX C++ Libraries
Home >> smtp

Declaration

template <class Socket>
class basic_smtp : public Socket;

typedef basic_smtp<tcp::socket> smtp;

Overview

smtp クラスは SMTP (Simple Mail Transfer Protocol) でメールを送信するためのクラスです. start() メソッドでメールサーバと接続し,login() メソッドでログイン処理を行った後, mail() メソッドで実際にメールを送信します.login() メソッドは現在のところ EHLO パケットを送るのみで,SMTP-AUTH などの実装は行っていません.sttp クラスは SMTP で決められているプロトコルに沿ってデータを送信するのみです.したがって,メールの書式 (Date, From, To, Subject ヘッダの付与など)はユーザが正しく記述する必要があります.

smtp クラスは,サーバからエラーメッセージが返された場合には smtp_error を例外として送出します. また,smtp クラスはサーバからの応答メッセージを内部に蓄積するように実装しています. response() メソッドを呼ぶと,サーバからの応答メッセージの一覧を取得することができます.

Example

example_smtp.cpp

#include <iostream>
#include <string>
#include <sstream>
#include "clx/smtp.h"
#include "clx/date_time.h"

int main(int argc, char* argv[]) {
    if (argc < 5) {
        std::cerr << "usage " << argv[0] << " host id from to" << std::endl;
        std::exit(-1);
    }
    
    try {
        clx::smtp session(argv[1], 25);
        session.login(argv[2]);
        
        std::string from(argv[3]);
        std::string to(argv[4]);
        
        // create a sample message
        std::stringstream msg;
        clx::date_time now;
        msg << "Date: " << now.to_string<char>("%a, %d %b %Y %H:%M:%S +0900") << "\r\n";
        msg << "From: " << from << "\r\n";
        msg << "To: " << to << "\r\n";
        msg << "Subject: SMTP test mail\r\n";
        msg << "\r\n";
        msg << "This ia test mail for clx::smtp class.\r\n";
        msg << ".\r\n";
        
        session.mail(from, to, msg.str());
        session.finish();
        
        // print message log
        for (size_t i = 0; i < session.responses().size(); i++) {
            std::cout << session.response(i).first << ": " <<
                session.response(i).second << std::endl;
        }
    }
    catch (clx::smtp_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);
    }
    
    return 0;
}
Result
221: Bye
250: Ok: queued as 1DB8025DB
354: End data with .
250: Ok
250: Ok
250: 8BITMIME
250: ETRN
250: SIZE 104857600
250: PIPELINING
250: smtp.abeam.ocn.ne.jp
220: smtp.abeam.ocn.ne.jp ESMTP Postfix

Template Parameters

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

Related Types

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

typedef std::pair<int, string_type> response_type;
typedef std::deque<response_type> response_array;

Construction and Member Functions

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

basic_smtp& start();
basic_smtp& start(const string_type& host, int port = 25);
basic_smtp& start(const char_type* host, int port = 25);

void finish();

basic_smtp& login(const string_type& id);
basic_smtp& login(const char_type* id);

basic_smtp& mail(const string_type& from, const string_type& to,
    const string_type& message);
basic_smtp& mail(const char_type* from, const char_type* to,
    const char_type* message);

start() メソッドで SMTP サーバと接続し,login() メソッドでログイン処理を行います (現在は EHLO パケットを送るだけ).実際にメールを送信するときは,送信元,宛先, メールの内容を引数として指定し mail() メソッドを実行します.

response_array& response();
const response_array& response() const;
const response_type& response(size_t index) const;

response() メソッドは,SMTP サーバからの応答メッセージの一覧を取得するためのメソッドです. それぞれの応答メッセージ (response_type) は,応答コードとメッセージのペアで構成されています. サーバからの応答メッセージはキュー (正確には std::deque) で管理しているため, 最新のメッセージが先頭に格納されています.

Related Page

  1. CLX C++ Libraries - smtps