前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3
SFXSMTP
[内部的に利用されるクラスです] SMTP プロトコルを処理するためのクラスです。
#include <SFXSMTP.h.hpp>
class SFXSMTP;
SFMTYPEDEFCLASS(SFXSMTP)

協調図

SFXSMTP クラスの協調図

解説

SFXSMTP クラスは、SMTP プロトコルを処理するためのクラスです。

[Note] 注意

SFXSMTP クラスは、 SFXSMTPSender クラスを実装するときに使用される内部実装クラスです。

SFXSMTPSender クラスに代わる開発者独自のメール送信クラスを実装する場合に使用します。

SMTP メール送信の手順

  1. SFXSMTP インスタンスを生成します (この時点では、SMTP メール送信のためのリソースは確保されていません)。
  2. SFXSMTP::Open 関数を呼び出して、SMTP メール送信の初期化を行います。
  3. SFXSMTP::Connect 関数を呼び出して、SMTP サーバーに接続します。 SMTP サーバー接続の結果は、 SFXSMTP::Connect 関数の引数に指定したコールバック関数に通知されます (SMTP サーバーとの接続が確立すると、SMTP メール送信を開始できます)。
  4. コールバック関数の中で SFXSMTP::SendEhloCommand 関数により EHLO コマンドを発行し、接続の挨拶を行います。 SMTP サーバーからの応答は、SFXSMTP::Connect 関数の引数に指定したコールバック関数に通知されます。
  5. (SMTP 認証を行う場合のみ): コールバック関数の中で SFXSMTP::SendAuthCommand 関数により AUTH コマンドを発行し、 SMTP 認証を行います。 SMTP サーバーからの応答は、 SFXSMTP::Connect 関数の引数に指定したコールバック関数に通知されます。

    そして、コールバック関数の中で SMTP 認証の種類に応じて SFXSMTP::SendAuthResponse 関数により AUTH コマンドの応答に対する返答を送信します。 SMTP サーバーからの応答は、SFXSMTP::Connect 関数の引数に指定したコールバック関数に通知されます。

  6. コールバック関数の中で SFXSMTP::SendMailCommand 関数により MAIL コマンドを発行し、送信元アドレスを送信します(1 メールに付き 1 回だけ行います)。 SMTP コマンドに対する SMTP サーバーからの応答は、 SFXSMTP::Connect 関数の引数に指定したコールバック関数に通知されます。
  7. コールバック関数の中で SFXSMTP::SendMailCommand 関数により MAIL コマンドを発行し、送信元アドレスを送信します。 SMTP コマンドに対する SMTP サーバーからの応答は、 SFXSMTP::Connect 関数の引数に指定したコールバック関数に通知されます。
  8. コールバック関数の中で SFXSMTP::SendRcptCommand 関数により RCPT コマンドを発行し、送信先アドレスを送信します(送信先の数だけ行います)。 SMTP コマンドに対する SMTP サーバーからの応答は、 SFXSMTP::Connect 関数の引数に指定したコールバック関数に通知されます。
  9. コールバック関数の中で SFXSMTP::SendDataCommand 関数により DATA コマンドを発行し、データ(メールヘッダーとメール本文からなるメールテキスト)を送信する旨をサーバーに伝えます。 SMTP コマンドに対する SMTP サーバーからの応答は、 SFXSMTP::Connect 関数の引数に指定したコールバック関数に通知されます。
  10. コールバック関数の中で応答コード "354" を確認してから、 SFXSMTP::SendDataText 関数により データ(メールヘッダーとメール本文からなるメールテキスト)をサーバーに送信します。 SMTP コマンドに対する SMTP サーバーからの応答は、 SFXSMTP::Connect 関数の引数に指定したコールバック関数に通知されます。
  11. MAIL コマンドを発行してから データを送信し終えるまえの途中で SFXSMTP::SendRsetCommand 関数により RSET コマンドを発行し、 メール送信をリセットし、MAIL コマンドを発行する段階に戻ることも可能です。 SMTP サーバーからの応答は、 SFXSMTP::Connect 関数の引数に指定したコールバック関数に通知されます。
  12. ※応答コードは SFXSMTP::GetResponseCode 関数、 応答テキストは SFXSMTP::GetResponseText 関数を呼び出してそれぞれ取得します。
  13. SMTP メール受信が完了すると、 SFXSMTP::SendQuitCommand 関数を呼び出して QUIT コマンドを発行します。
  14. SMTP サーバーからの応答を確認してから、 SFXSMTP::Close 関数を呼び出して SMTP サーバーとの接続を切断します。
[Caution] タイムアウトの制御

タイムアウトの制御は、アプリケーション側で行います。

[Note] SMTP プロトコルについて

SMTP プロトコルの仕様は、 RFC2821(Simple Mail Transfer Protocol) を参照してください。

例 843. SFXSMTPSender クラスの実装

/***************************************************************************************
****************************************************************************************
***
***     File            : SFXSMTPSender.f.hpp
***
****************************************************************************************
****************************************************************************************/

#ifndef __SOPHIAFRAMEWORK_SFXSMTPSENDER_FHPP
#define __SOPHIAFRAMEWORK_SFXSMTPSENDER_FHPP

#include <SFXGeneral/SFXEnvironment.h.hpp>

SFMTYPEDEFCLASS(SFXSMTPSENDER)

#endif // __SOPHIAFRAMEWORK_SFXSMTPSENDER_FHPP //


/***************************************************************************************
****************************************************************************************
***
***     File            : SFXSMTPSender.h.hpp
***
****************************************************************************************
****************************************************************************************/

#ifndef __SOPHIAFRAMEWORK_SFXSMTPSENDER_HHPP
#define __SOPHIAFRAMEWORK_SFXSMTPSENDER_HHPP

#include <SFXGeneral/SFXEnvironment.h.hpp>
#include <SFXProtocol/SFXMail/SFXSMTPSender.f.hpp>
#include <SFXProtocol/SFXMail/SFXSMTP.h.hpp>
#include <SFXCollection/SFXArray.h.hpp>
#include <SFXProtocol/SFXMail/SFXMailMessage.f.hpp>

class SFXSMTPSender {
    SFMSEALCOPY(SFXSMTPSender)
    public:
        enum ProgressEnum {
            PROGRESS_NONE                       = 0,
            PROGRESS_CONNECT,
            PROGRESS_EHLO,
            PROGRESS_HELO,
            PROGRESS_AUTH,
            PROGRESS_AUTHRESP1,
            PROGRESS_AUTHRESP2,
            PROGRESS_MAIL,
            PROGRESS_RCPT,
            PROGRESS_DATA,
            PROGRESS_DATATEXT,
            PROGRESS_QUIT,
            PROGRESS_ERRORQUIT,
            PROGRESS_DONE
        };
        enum AuthEnum {
            AUTH_NONE                           = 0,
            AUTH_PLAIN,
            AUTH_LOGIN,
            AUTH_CRAM_MD5,
            AUTH_DIGEST_MD5
        };
    private:
        enum StateEnum {
            STATE_STANDBY                       = 0,
            STATE_SENDING
        };

    public:
        typedef Void                            (*CallbackSPP)                  (SFCError error, VoidPtr reference);

    private:
                StateEnum                       _state;
                ProgressEnum                    _progress;
                ProgressEnum                    _previous;
                CallbackSPP                     _spp;
                VoidPtr                         _reference;
                AuthEnum                        _auth;
                SFXAnsiString                   _user;
                SFXAnsiString                   _password;
                SFXSocketAddress                _server;
                SFXAnsiString                   _client;
                SFXAnsiString                   _from;
                SFXArray<SFXAnsiStringPtr>      _toList;
                SFXAnsiString                   _message;
                SFXSMTP                         _smtp;
                SInt16                          _index;
                Bool                            _quit;
                Bool                            _isSSL;
                UInt32                          _sslTrustMode;

    public:
        explicit                                SFXSMTPSender                   (Void);
                                                ~SFXSMTPSender                  (Void);
                SFXSMTPRef                      GetSFXSMTP                      (Void);
                ProgressEnum                    GetProgress                     (Void) const;
                Void                            SetSSLMode                      (Bool isSSL);
                Bool                            GetSSLMode                      (Void) const;
                Void                            SetTrustMode                    (UInt32 sslTrustMode);
                UInt32                          GetTrustMode                    (Void) const;
                Void                            Cancel                          (Void);
                SFCError                        SetHostName                     (SFXAnsiStringConstRef host);
                SFCError                        SetServer                       (SFXSocketAddressConstRef server);
                SFCError                        SetAuthorization                (SFXSMTPSender::AuthEnum auth, SFXAnsiStringConstRef user, SFXAnsiStringConstRef password);
                SFCError                        SetFrom                         (SFXAnsiStringConstRef from);
                Void                            ClearTo                         (Void);
                SFCError                        AddTo                           (SFXAnsiStringConstRef to);
                SFCError                        SendMessage                     (SFXMailMessagePtr message, CallbackSPP spp, VoidPtr reference);
                SFCError                        SendText                        (SFXAnsiStringConstRef text, CallbackSPP spp, VoidPtr reference);
                Bool                            IsQuit                          (Void);
    private:
                SFCError                        ProceedConnect                  (UInt16 code);
                SFCError                        ProceedEhlo                     (UInt16 code);
                SFCError                        ProceedHelo                     (UInt16 code);
                SFCError                        ProceedAuth                     (UInt16 code);
                SFCError                        ProceedAuthresp1                (UInt16 code);
                SFCError                        ProceedAuthresp2                (UInt16 code);
                SFCError                        ProceedMail                     (UInt16 code);
                SFCError                        ProceedRcpt                     (UInt16 code);
                SFCError                        ProceedData                     (UInt16 code);
                SFCError                        ProceedDataText                 (UInt16 code);
                Void                            ProceedError                    (Void);
                Void                            FinishSend                      (SFCError err);
                SFCError                        SetBrackets                     (SFXAnsiStringConstRef string, SFXAnsiStringPtr result);
                XALLBACK_DECLARE_SFXSMTP(OnSMTP)
};

#define     XALLBACK_DECLARE_SFXSMTPSENDER(FUNCTION)                            XALLBACK_DECLARE_SFXSMTP(FUNCTION)

#include <SFXProtocol/SFXMail/SFXSMTPSender.i.hpp>


#endif // __SOPHIAFRAMEWORK_SFXSMTPSENDER_HHPP //


/***************************************************************************************
****************************************************************************************
***
***     File            : SFXSMTPSender.i.hpp
***
****************************************************************************************
****************************************************************************************/

#ifndef __SOPHIAFRAMEWORK_SFXSMTPSENDER_IHPP
#define __SOPHIAFRAMEWORK_SFXSMTPSENDER_IHPP

#include <SFXGeneral/SFXEnvironment.h.hpp>

/*public */inline SFXSMTPRef SFXSMTPSender::GetSFXSMTP(Void)
{
    return _smtp;
}// SFXSMTPSender::GetSFXSMTP //

/*public */inline SFXSMTPSender::ProgressEnum SFXSMTPSender::GetProgress(Void) const
{
    return _progress;
}// SFXSMTPSender::GetProgress //

/*public */inline Void SFXSMTPSender::SetSSLMode(Bool isSSL)
{
    _isSSL = isSSL;
    return;
}// SFXSMTPSender::SetSSLMode //

/*public */inline Bool SFXSMTPSender::GetSSLMode(Void) const
{
    return _isSSL;
}// SFXSMTPSender::GetSSLMode //

/*public */inline Void SFXSMTPSender::SetTrustMode(UInt32 sslTrustMode)
{
    _sslTrustMode = sslTrustMode;
    return;
}// SFXSMTPSender::SetTrustMode //

/*public */inline UInt32 SFXSMTPSender::GetTrustMode(Void) const
{
    return _sslTrustMode;
}// SFXSMTPSender::GetTrustMode //

/*public */inline SFCError SFXSMTPSender::SetHostName(SFXAnsiStringConstRef host)
{
    return _client.Set(host);
}// SFXSMTPSender::SetHostName //

/*public */inline SFCError SFXSMTPSender::SetServer(SFXSocketAddressConstRef server)
{
    return _server.Set(server);
}// SFXSMTPSender::SetServer //

/*public */inline SFCError SFXSMTPSender::SetFrom(SFXAnsiStringConstRef from)
{
    return _from.Set(from);
}// SFXSMTPSender::SetFrom //

/*public */inline Bool SFXSMTPSender::IsQuit(Void)
{
    return _quit;
}// SFXSMTPSender::IsQuit //

#define     XALLBACK_IMPLEMENT_SFXSMTPSENDER(TYPE, FUNCTION, ERROR)             XALLBACK_IMPLEMENT_SFXSMTP(TYPE, FUNCTION, ERROR)

#endif // __SOPHIAFRAMEWORK_SFXSMTPSENDER_IHPP //


/***************************************************************************************
****************************************************************************************
***
***     File            : SFXSMTPSender.i.cpp
***
****************************************************************************************
****************************************************************************************/

#include <SFXProtocol/SFXMail/SFXSMTPSender.h.hpp>
#include <SFXProtocol/SFXMail/SFXMailMessage.h.hpp>
#include <SFXProtocol/SFXMail/SFXMailUtility.h.hpp>

/*public */SFXSMTPSender::SFXSMTPSender(Void) : _state(STATE_STANDBY), _progress(PROGRESS_NONE), _auth(AUTH_NONE), _quit(false), _isSSL(false), _sslTrustMode(SSL_TRUST_MODE_FAIL)
{
}// SFXSMTPSender::SFXSMTPSender //

/*public */SFXSMTPSender::~SFXSMTPSender(Void)
{
    Cancel();
}// SFXSMTPSender::~SFXSMTPSender //

/*public */Void SFXSMTPSender::Cancel(Void)
{
    _state = STATE_STANDBY;
    _progress = PROGRESS_NONE;
    _spp = null;
    _reference = null;
    _server.Set(0, 0);
    _from.Clear();
    ClearTo();
    _message.Clear();
    _smtp.Close();
}// SFXSMTPSender::Cancel //

/*public */SFCError SFXSMTPSender::SetAuthorization(SFXSMTPSender::AuthEnum auth, SFXAnsiStringConstRef user, SFXAnsiStringConstRef password)
{
    SFCError error;

    if ((error = _user.Set(user)) == SFERR_NO_ERROR) {
        if ((error = _password.Set(password)) == SFERR_NO_ERROR) {
            _auth = auth;
        }
    }
    return error;
}// SFXSMTPSender::SetAuthorization //

/*public */Void SFXSMTPSender::ClearTo(Void)
{
    SFXArray<SFXAnsiStringPtr>::Iterator itor;
    SFXAnsiStringPtr string;

    itor = _toList.GetFirstIterator();
    while (itor.HasNext()) {
        string = itor.GetNext();
        ::delete string;
    }
    _toList.Clear();
}// SFXSMTPSender::ClearTo //

/*public */SFCError SFXSMTPSender::AddTo(SFXAnsiStringConstRef to)
{
    SFCError error;
    SFXAnsiStringPtr string;

    if ((string = ::new SFXAnsiString(to)) != null) {
        error = _toList.InsertLast(string);
    }
    else {
        error = SFERR_NO_MEMORY;
    }
    return error;
}// SFXSMTPSender::AddTo //

/*public */SFCError SFXSMTPSender::SendMessage(SFXMailMessagePtr message, CallbackSPP spp, VoidPtr reference)
{
    SFCError error(SFERR_NO_ERROR);
    SFBNetMgrSmp net;
    SFXAnsiString temp;
    SInt32 r0, r1;
    SFXProperty property;
    SFXAnsiStringPtr mail;

    if (!_server.Get().IsEmpty()) {
        if (error == SFERR_NO_ERROR) {
            if (_from.IsEmpty()) {
                _from = message->GetFromField();
            }
            if (_toList.IsEmpty()) {
                if ((error = SFXMailUtility::ParseMailboxList(message->GetToField(), &property)) == SFERR_NO_ERROR) {
                    if ((error = SFXMailUtility::ParseMailboxList(message->GetCcField(), &property)) == SFERR_NO_ERROR) {
                        if ((error = SFXMailUtility::ParseMailboxList(message->GetBccField(), &property)) == SFERR_NO_ERROR) {
                            r1 = property.GetSize();
                            for (r0 = 0; r0 < r1; ++r0) {
                                if ((mail = ::new SFXAnsiString) != null) {
                                    if ((error = mail->Set(property.GetValue(r0))) == SFERR_NO_ERROR) {
                                        if ((error = _toList.InsertLast(mail)) != SFERR_NO_ERROR) {
                                            break;
                                        }
                                    }
                                    else {
                                        break;
                                    }
                                }
                                else {
                                    error = SFERR_NO_MEMORY;
                                    break;
                                }
                            }
                        }
                    }
                }
            }
        }
        if (error == SFERR_NO_ERROR) {
            if (message->GetBccField().IsEmpty()) {
                error = _message.Set(message->Write());
            }
            else {
                if ((error = temp.Set(message->Write())) == SFERR_NO_ERROR) {
                    if ((r0 = temp.FirstIndexOf("BCC:", SINT32_MINIMUM, false)) > -1) {
                        r1 = temp.FirstIndexOf("\r\n", r0);
                        if ((error = _message.Set(temp.Substring(0, r0))) == SFERR_NO_ERROR) {
                            error = _message.Add(temp.Substring(r1 + 2, temp.GetLength()));
                        }
                    }
                    else {
                        error = SFERR_FAILED;
                    }
                }
            }
        }
        if (error == SFERR_NO_ERROR) {
            if (!_from.IsEmpty() && !_toList.IsEmpty()) {
                _smtp.Close();
                if ((error = _smtp.Open()) == SFERR_NO_ERROR) {
                    _smtp.SetSSLMode(_isSSL);
                    if ((error = _smtp.SetTrustMode(_sslTrustMode)) == SFERR_NO_ERROR) {
                        if ((error = _smtp.Connect(_server, XALLBACK_INTERNAL(OnSMTP))) == SFERR_NO_ERROR) {
                            _state = STATE_SENDING;
                            _progress = PROGRESS_CONNECT;
                            _spp = spp;
                            _reference = reference;
                            _quit = false;
                        }
                    }
                    if (error != SFERR_NO_ERROR) {
                        _smtp.Close();
                    }
                }
            }
            else {
                error = SFERR_INVALID_PARAM;
            }
        }
    }
    else {
        error = SFERR_FAILED;
    }
    return error;
}// SFXSMTPSender::SendMessage //

/*public */SFCError SFXSMTPSender::SendText(SFXAnsiStringConstRef text, CallbackSPP spp, VoidPtr reference)
{
    SFCError error(SFERR_NO_ERROR);
    _message.Set(text); // temp
    if (!_client.IsEmpty() && !_from.IsEmpty() && !_toList.IsEmpty()) {
        _smtp.Close();
        if ((error = _smtp.Open()) == SFERR_NO_ERROR) {
            _smtp.SetSSLMode(_isSSL);
            if ((error = _smtp.SetTrustMode(_sslTrustMode)) == SFERR_NO_ERROR) {
                if ((error = _smtp.Connect(_server, XALLBACK_INTERNAL(OnSMTP))) == SFERR_NO_ERROR) {
                    _state = STATE_SENDING;
                    _progress = PROGRESS_CONNECT;
                    _spp = spp;
                    _reference = reference;
                    _quit = false;
                }
            }
            if (error != SFERR_NO_ERROR) {
                _smtp.Close();
            }
        }
    }
    else {
        error = SFERR_INVALID_PARAM;
    }
    return error;
}// SFXSMTPSender::SendText //

/*private */XALLBACK_IMPLEMENT_SFXSMTP(SFXSMTPSender, OnSMTP, error)
{
    SIntN code;

    if (error == SFERR_NO_ERROR) {
        code = _smtp.GetResponseCode();
        switch (_progress) {
            case PROGRESS_CONNECT:
                error = ProceedConnect(code);
                break;
            case PROGRESS_EHLO:
                error = ProceedEhlo(code);
                break;
            case PROGRESS_HELO:
                error = ProceedHelo(code);
                break;
            case PROGRESS_AUTH:
                error = ProceedAuth(code);
                break;
            case PROGRESS_AUTHRESP1:
                error = ProceedAuthresp1(code);
                break;
            case PROGRESS_AUTHRESP2:
                error = ProceedAuthresp1(code);
                break;
            case PROGRESS_MAIL:
                error = ProceedMail(code);
                break;
            case PROGRESS_RCPT:
                error = ProceedRcpt(code);
                break;
            case PROGRESS_DATA:
                error = ProceedData(code);
                break;
            case PROGRESS_DATATEXT:
                error = ProceedDataText(code);
                break;
            case PROGRESS_ERRORQUIT:
                _progress = PROGRESS_DONE;
                FinishSend(_previous);
                break;
            case PROGRESS_QUIT:
                _progress = PROGRESS_DONE;
                FinishSend(SFERR_NO_ERROR);
                break;
            case PROGRESS_DONE:
            case PROGRESS_NONE:
            default:
                FinishSend(PROGRESS_NONE);
                break;
        }
    }
    if (error != SFERR_NO_ERROR) {
        FinishSend(_progress);
    }
}// XALLBACK_IMPLEMENT_SFXSMTP(SFXSMTPSender, OnSMTP, error) //

/*private */SFCError SFXSMTPSender::ProceedConnect(UInt16 code)
{
    SFCError error(SFERR_NO_ERROR);
    SFXInetAddress address;

    if (code == 220) {
        _progress = PROGRESS_EHLO;
        if (_client.IsEmpty()) {
            address = SFXInetAddress::LocalInetAddress();
            if (!address.Get().IsEmpty()) {
                error = _client.Set(address.Get());
            }
            else {
                error = SFERR_FAILED;
            }
        }
        error = _smtp.SendEhloCommand(_client);
    }
    else {
        ProceedError();
    }
    return error;
}// SFXSMTPSender::ProceedConnect //

/*private */SFCError SFXSMTPSender::ProceedEhlo(UInt16 code)
{
    SFCError error(SFERR_NO_ERROR);
    SFXSMTP::AuthEnum auth(SFXSMTP::AUTH_NONE);
    SFXAnsiString temp;

    if (_auth == AUTH_NONE) {
        if (code == 250) {
            _progress = PROGRESS_MAIL;
            if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) {
                error = _smtp.SendMailCommand(temp);
            }
        }
        else {
            _progress = PROGRESS_HELO;
            error = _smtp.SendHeloCommand(_client);
        }
    }
    else {
        if (code == 250) {
            _progress = PROGRESS_AUTH;
            switch (_auth) {
                case AUTH_NONE:
                    auth = SFXSMTP::AUTH_NONE;
                    break;
                case AUTH_PLAIN:
                    auth = SFXSMTP::AUTH_PLAIN;
                    break;
                case AUTH_LOGIN:
                    auth = SFXSMTP::AUTH_LOGIN;
                    break;
                case AUTH_CRAM_MD5:
                    auth = SFXSMTP::AUTH_CRAM_MD5;
                    break;
                case AUTH_DIGEST_MD5:
                    auth = SFXSMTP::AUTH_DIGEST_MD5;
                    break;
                default:
                    break;
            }
            error = _smtp.SendAuthCommand(auth);
        }
        else {
            ProceedError();
        }
    }
    return error;
}// SFXSMTPSender::ProceedEhlo //

/*private */SFCError SFXSMTPSender::ProceedHelo(UInt16 code)
{
    SFCError error(SFERR_NO_ERROR);
    SFXAnsiString temp;

    if (code == 220) {
        _progress = PROGRESS_MAIL;
        if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) {
            error = _smtp.SendMailCommand(temp);
        }
    }
    else {
        ProceedError();
    }
    return error;
}// SFXSMTPSender::ProceedHelo //

/*private */SFCError SFXSMTPSender::ProceedAuth(UInt16 code)
{
    SFCError error(SFERR_NO_ERROR);

    if (code == 334) {
        _progress = PROGRESS_AUTHRESP1;
        switch (_auth) {
            case AUTH_PLAIN:
                error = _smtp.SendAuthResponse(_user, _password);
                break;
            case AUTH_LOGIN:
                error = _smtp.SendAuthResponse(_user);
                break;
            case AUTH_CRAM_MD5:
                error = _smtp.SendAuthResponse(_user, _password, _smtp.GetResponseText());
                break;
            case AUTH_NONE:
            case AUTH_DIGEST_MD5:
            default:
                // DIGEST_MD5 has not been supported yet.
                _previous = _progress;
                _progress = PROGRESS_ERRORQUIT;
                if ((error = _smtp.SendQuitCommand()) == SFERR_NO_ERROR) {
                    _quit = true;
                }
                break;
        }
    }
    else {
        ProceedError();
    }
    return error;
}// SFXSMTPSender::ProceedAuth //

/*private */SFCError SFXSMTPSender::ProceedAuthresp1(UInt16 code)
{
    SFCError error(SFERR_NO_ERROR);
    SFXAnsiString temp;

    if (code == 334) {
        if (_auth == AUTH_LOGIN) {
            _progress = PROGRESS_AUTHRESP2;
            error = _smtp.SendAuthResponse(_password);
        }
    }
    else if (code == 235) {
        _progress = PROGRESS_MAIL;
        if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) {
            error = _smtp.SendMailCommand(temp);
        }
    }
    else {
        ProceedError();
    }
    return error;
}// SFXSMTPSender::ProceedAuthresp1 //

/*private */SFCError SFXSMTPSender::ProceedAuthresp2(UInt16 code)
{
    SFCError error(SFERR_NO_ERROR);
    SFXAnsiString temp;

    if (code == 235) {
        _progress = PROGRESS_MAIL;
        if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) {
            error = _smtp.SendMailCommand(temp);
        }
    }
    else {
        ProceedError();
    }
    return error;
}// SFXSMTPSender::ProceedAuthresp2 //

/*private */SFCError SFXSMTPSender::ProceedMail(UInt16 code)
{
    SFXAnsiString temp;
    SFCError error(SFERR_NO_ERROR);

    if (code == 250) {
        _progress = PROGRESS_RCPT;
        _index = 0;
        if ((error = SetBrackets(*_toList[0], &temp)) == SFERR_NO_ERROR) {
            error = _smtp.SendRcptCommand(temp);
        }
    }
    else {
        ProceedError();
    }
    return error;
}// SFXSMTPSender::ProceedMail //

/*private */SFCError SFXSMTPSender::ProceedRcpt(UInt16 code)
{
    SFXAnsiString temp;
    SFCError error(SFERR_NO_ERROR);

    if (code == 250 || code == 251) {
        ++_index;
        if (_index < _toList.GetSize()) {
            if ((error = SetBrackets(*_toList[_index], &temp)) == SFERR_NO_ERROR) {
                error = _smtp.SendRcptCommand(temp);
            }
        }
        else {
            _progress = PROGRESS_DATA;
            error = _smtp.SendDataCommand();
        }
    }
    else {
        ProceedError();
    }
    return error;
}// SFXSMTPSender::ProceedRcpt //

/*private */SFCError SFXSMTPSender::ProceedData(UInt16 code)
{
    SFCError error(SFERR_NO_ERROR);

    if (code == 354) {
        _progress = PROGRESS_DATATEXT;
        error = _smtp.SendDataText(_message);
    }
    else {
        ProceedError();
    }
    return error;
}// SFXSMTPSender::ProceedData //

/*private */SFCError SFXSMTPSender::ProceedDataText(UInt16 /*code*/)
{
    SFCError error(SFERR_NO_ERROR);

    _progress = PROGRESS_QUIT;
    if ((error = _smtp.SendQuitCommand()) == SFERR_NO_ERROR) {
        _quit = true;
    }
    return error;
}// SFXSMTPSender::ProceedDataText //

/*private */Void SFXSMTPSender::ProceedError(Void)
{
    _previous = _progress;
    _progress = PROGRESS_ERRORQUIT;
    if (_smtp.SendQuitCommand() == SFERR_NO_ERROR) {
        _quit = true;
    }
    return;
}// SFXSMTPSender::ProceedError //

/*private */Void SFXSMTPSender::FinishSend(SFCError error)
{
    _state = STATE_STANDBY;
    _smtp.Close();
    if (_spp != null) {
        _spp(error, _reference);
    }
    return;
}// SFXSMTPSender::FinishSend //

/*private */SFCError SFXSMTPSender::SetBrackets(SFXAnsiStringConstRef string, SFXAnsiStringPtr result)
{
    SFCError error(SFERR_NO_ERROR);

    if (string.StartsWith('<') && string.EndsWith('>')) {
        error = result->Set(string);
    }
    else {
        if ((error = result->Set('<')) == SFERR_NO_ERROR) {
            if ((error = result->Add(string)) == SFERR_NO_ERROR) {
                error = result->Add('>');
            }
        }
    }
    return error;
}// SFXSMTPSender::SetBrackets //

参照

SFXSMTPSender | メール送受信 | RFC2821(Simple Mail Transfer Protocol)

メンバ

コンストラクタ/デストラクタ
SFXSMTP( Void )
SFXSMTP クラスのコンストラクタです。
~SFXSMTP( Void )
SFXSMTP クラスのデストラクタです。
パブリック関数
Void Cancel( Void )
SMTP メール送信をキャンセルします。
Void Close( Void )
SMTP サーバーとの接続を終了します。
SFCError Connect( SFXSocketAddressConstRef address , CallbackSPP spp , VoidPtr reference )
SMTP サーバーに接続します。
SFCError GetEhloResponse( SFXAnsiStringPtr domain , SFXAnsiStringPtr greet , SFXAnsiStringHandle extList , UInt32Ptr extCount )
EHLO コマンドの応答を取得します。
SFCError GetHeloResponse( SFXAnsiStringPtr domain , SFXAnsiStringPtr greet )
HELO コマンドの応答を取得します。
SFCError GetLocalAddress( SFXSocketAddressPtr result )
SMTP クライアントのソケットアドレス(ドメイン名または IP アドレスとポート番号)を取得します。
SFCError GetRemoteAddress( SFXSocketAddressPtr result )
SMTP サーバーのソケットアドレス(ドメイン名または IP アドレスとポート番号)を取得します。
SInt32 GetResponseCode( Void )
応答コードを取得します。
SFXAnsiString GetResponseText( Void )
応答テキストを取得します。
SFCError GetResponseText( SFXAnsiStringPtr result )
応答テキストを取得します。
Bool GetSSLMode( Void )
SSL 接続モードを取得します。
UInt32 GetTrustMode( Void )
SSL 認証モードを取得します。
SFCError Open( Void )
SMTP サーバーに接続するための初期化を行います。
SFCError SendAuthCommand( AuthEnum auth )
AUTH コマンドを発行します。
SFCError SendAuthResponse( SFXAnsiStringConstRef str1 , SFXAnsiStringConstRef str2 = SFXAnsiString::EmptyInstance() , SFXAnsiStringConstRef str3 = SFXAnsiString::EmptyInstance() )
AUTH コマンドの応答に対する返答を送信します。
SFCError SendCommand( ACharConstPtr command , UInt32 size )
SMTP コマンドを発行します。
SFCError SendCommand( SFXAnsiStringConstRef command )
SMTP コマンドを発行します。
SFCError SendDataCommand( Void )
DATA コマンドを発行します。
SFCError SendDataText( SFXAnsiStringConstRef text )
データを送信します。
SFCError SendEhloCommand( SFXAnsiStringConstRef hostName )
ELHO コマンドを発行します。
SFCError SendHeloCommand( SFXAnsiStringConstRef hostName )
HELO コマンドを発行します。
SFCError SendMailCommand( SFXAnsiStringConstRef from )
MAIL コマンドを発行します。
SFCError SendNoopCommand( Void )
NOOP コマンドを発行します。
SFCError SendQuitCommand( Void )
QUIT コマンドを発行します。
SFCError SendRcptCommand( SFXAnsiStringConstRef to )
RCPT コマンドを発行します。
SFCError SendRsetCommand( Void )
RSET コマンドを発行します。
Void SetSSLMode( Bool isSSL )
SSL 接続モードに設定します。
SFCError SetTrustMode( UInt32 sslTrustMode )
SSL 認証モードを設定します。
AuthEnum
SMTP 認証方式を表す定数です。
CallbackSPP
SMTP サーバー接続や SMTP コマンド発行の結果が通知されるコールバック関数の型です。

SFXSMTP::SFXSMTP
SFXSMTP クラスのコンストラクタです。
[ public, explicit ]
SFXSMTP(Void);

解説

このコンストラクタでは、SSL 接続モードを OFF(false)に設定します。

[Note] 注意

SMTP メール送信に必要なリソースは、 SFXSMTP::OpenSFXSMTP::Connect などの関数を呼び出したときに確保されます。

参照

SFXSMTP::SetSSLMode | SFXSMTP::Open | SFXSMTP::Connect


SFXSMTP::~SFXSMTP
SFXSMTP クラスのデストラクタです。
[ public, virtual ]
~SFXSMTP(Void);

解説

このデストラクタは、SMTP サーバーとの接続を終了します。

内部で使用している TCP / SSL 通信やストリームの処理やコールバックをキャンセルし、 同時にリソースを解放します。

[Note] 注意

SFXSMTP::Close 関数と同等の処理を行います。

参照

SFXSMTP::Close


SFXSMTP::Cancel
SMTP メール送信をキャンセルします。
[ public ]
Void Cancel(Void);

解説

この関数は、SMTP メール送信をキャンセルします。

内部で使用している TCP / SSL 通信やストリームの処理やコールバックをキャンセルします。

[Note] 注意

この関数は、内部的に SFXSMTP::Close 関数から呼び出されます。

参照

SFXSMTP::Close


SFXSMTP::Close
SMTP サーバーとの接続を終了します。
[ public ]
Void Close(Void);

解説

この関数は、SMTP サーバーとの接続を終了します。

内部で使用している TCP / SSL 通信やストリームの処理やコールバックをキャンセルし、 同時にリソースを解放します。

[Note] 注意

この関数は、内部的に SFXSMTP::Cancel 関数を呼び出します。

[Note] SMTP サーバーとの接続の切断方法

SFXSMTP::SendQuitCommand 関数を使用して QUIT コマンドを発行し、 SMTP サーバーからの応答を確認した後、 この関数を呼び出して SMTP サーバーとの接続を切断します。

※ SMTP プロトコル(RFC2821)では、 QUIT コマンドを発行せずに強制的に切断することを推奨していないため、 通信中にこの関数を明示的に呼ぶべきではありません。

参照

SFXSMTP::Cancel | SFXSMTP::SendQuitCommand | SFXSMTP::Connect | RFC2821(Simple Mail Transfer Protocol)


SFXSMTP::Connect
SMTP サーバーに接続します。
[ public ]
SFCError Connect(
    SFXSocketAddressConstRef address   // [入力] SMTP サーバーのソケットアドレス(ドメイン名または IP アドレスとポート番号)
    CallbackSPP spp                    // [入力] SMTP サーバー接続や SMTP コマンド発行の結果が通知されるコールバック関数
    VoidPtr reference                  // [入力] コールバック関数に渡すデータ(参照値)
);

引数

address

SMTP サーバーのソケットアドレス(ドメイン名または IP アドレスとポート番号)を指定します。

spp

SMTP サーバー接続や SMTP コマンド発行の結果が通知されるコールバック関数を指定します。

reference

コールバック関数に渡すデータ(参照値)を指定します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが開いていない、または既に接続されている(処理中を含む)とき: SFERR_INVALID_STATE
  • SMTP サーバーの IP アドレスとポート番号が設定されていないとき: SFERR_INVALID_STATE
  • SFBNetMgr インスタンスの作成に失敗したとき: SFERR_FAILED
  • メモリ不足のとき: SFERR_NO_MEMORY
  • ネットワークエラーのとき[※コールバック関数に通知される]: BREW API ISOCKET_GetLastError 関数が返すエラー値、またはAEE_NET_ERROR

解説

この関数は、SMTP サーバーに接続します。

[Caution] コールバック関数

SMTP サーバー接続や SMTP コマンド発行の結果は、 spp 引数に指定するコールバック関数(SFXSMTP::CallbackSPP)に通知されます。

参照

SFXSMTP::Open | SFXSMTP::Close | SFXSocketAddress | SFXSMTP::CallbackSPP | BREW API ISOCKET_GetLastError


SFXSMTP::GetEhloResponse
EHLO コマンドの応答を取得します。
[ public, const ]
SFCError GetEhloResponse(
    SFXAnsiStringPtr domain       // [出力] ドメイン名または IP アドレスが格納された場所へのポインタ
    SFXAnsiStringPtr greet        // [出力] グリーティングメッセージが格納された場所へのポインタ
    SFXAnsiStringHandle extList   // [出力] 拡張コマンドのリストが格納された場所へのポインタ
    UInt32Ptr extCount            // [出力] 拡張コマンドの数が格納された場所へのポインタ
);

引数

domain

SMTP サーバーが応答するドメイン名または IP アドレスが格納された場所へのポインタが返却されます。 取得する必要がない場合、null を指定します。

greet

SMTP サーバーが応答するグリーティングメッセージが格納された場所へのポインタが返却されます。 取得する必要がない場合、null を指定します。

extList

SMTP サーバーが応答する拡張コマンドのリストが格納された場所へのポインタが返却されます。 SFXAnsiString の配列が渡されます。 配列は、呼び出し側が "::delete []" で解放する必要があります。 取得する必要がない場合、null を指定します。

extCount

SMTP サーバーが応答する拡張コマンドの数が格納された場所へのポインタが返却されます。 取得する必要がない場合、null を指定します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • 応答コードが 250 でないとき: SFERR_FAILED
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、 SFXSMTP::SendEhloCommand 関数により発行される ELHO コマンドの応答を取得します。

具体的には、 ELHO コマンドを発行した後に呼び出されるコールバック関数内で、 ELHO コマンドの応答に含まれる、 ドメイン名または IP アドレス、グリーティングメッセージ、拡張コマンドのリストと数を取得します。

[Note] ELHO コマンドについて

ELHO コマンドは、SMTP メール送信のセッションを開始するためのコマンドです。

ELHO コマンドの詳細は、 RFC2821: 4.1.1.1 Extended HELLO (EHLO) or HELLO (HELO) を参照してください。

参照

SFXSMTP::SendEhloCommand | RFC2821: 4.1.1.1 Extended HELLO (EHLO) or HELLO (HELO)


SFXSMTP::GetHeloResponse
HELO コマンドの応答を取得します。
[ public, const ]
SFCError GetHeloResponse(
    SFXAnsiStringPtr domain   // [出力] ドメイン名または IP アドレス
    SFXAnsiStringPtr greet    // [出力] グリーティングメッセージ
);

引数

domain

SMTP サーバーが応答するドメイン名または IP アドレスが格納された場所へのポインタが返却されます。 取得する必要がない場合は、null を指定します。

greet

SMTP サーバーが応答するグリーティングメッセージが格納された場所へのポインタが返却されます。 取得する必要がない場合は、null を指定します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • 応答コードが 250 でないとき: SFERR_FAILED
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、 SFXSMTP::SendHeloCommand 関数により発行される HELO コマンドの応答を取得します。

具体的には、 HELO コマンドを発行した後に呼び出されるコールバック関数内で、 HELO コマンドの応答に含まれる、 ドメイン名または IP アドレス、グリーティングメッセージを取得します。

[Note] HELO コマンドについて

HELO コマンドは、SMTP メール送信のセッションを開始するためのコマンドです。

HELO コマンドの詳細は、 RFC2821: 4.1.1.1 Extended HELLO (EHLO) or HELLO (HELO) を参照してください。

参照

SFXSMTP::SendHeloCommand | RFC2821: 4.1.1.1 Extended HELLO (EHLO) or HELLO (HELO)


SFXSMTP::GetLocalAddress
SMTP クライアントのソケットアドレス(ドメイン名または IP アドレスとポート番号)を取得します。
[ public, const ]
SFCError GetLocalAddress(
    SFXSocketAddressPtr result   // [出力] SMTP クライアントのソケットアドレス(ドメイン名または IP アドレスとポート番号)の格納先へのポインタ
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • バインドされておらず、接続も確立されていないとき: SFERR_INVALID_STATE
  • result 引数が null のとき: SFERR_INVALID_PARAM
  • その他: BREW API ISOCKET_GetLastError 関数が返すエラー値、またはAEE_NET_ERROR

解説

この関数は、SMTP クライアントのソケットアドレス(ドメイン名または IP アドレスとポート番号)を取得します。

参照

SFXInetAddress::LocalInetAddress | SFXTCPSocket::GetLocalAddress | SFXSocketAddress | BREW API ISOCKET_GetLastError


SFXSMTP::GetRemoteAddress
SMTP サーバーのソケットアドレス(ドメイン名または IP アドレスとポート番号)を取得します。
[ public, const ]
SFCError GetRemoteAddress(
    SFXSocketAddressPtr result   // [出力] SMTP サーバーのソケットアドレス(ドメイン名または IP アドレスとポート番号)の格納先へのポインタ
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • result 引数が null のとき: SFERR_INVALID_PARAM
  • その他: BREW API ISOCKET_GetLastError 関数が返すエラー値、またはAEE_NET_ERROR

解説

この関数は、SMTP サーバーのソケットアドレス(ドメイン名または IP アドレスとポート番号)を取得します。

参照

SFXTCPSocket::GetRemoteAddress | SFXSocketAddress | BREW API ISOCKET_GetLastError


SFXSMTP::GetResponseCode
応答コードを取得します。
[ public, const ]
SInt32 GetResponseCode(Void);

戻り値

10 進数 3 桁の応答コード

解説

この関数は、SMTP コマンドの応答コードを取得します。

[Note] 注意

SMTP コマンド発行の結果は、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数に通知されます。 コールバック関数内でこの関数を呼び出すことで応答コードを取得できます。

[Note] 注意

応答コードの詳細は、 RFC2821: 4.2 SMTP Replies を参照してください。

参照

SFXSMTP::GetResponseText | SFXSMTP::SendCommand | SFXSMTP::Connect | RFC2821: 4.2 SMTP Replies


SFXSMTP::GetResponseText
応答テキストを取得します。
[ public, const ]
SFXAnsiString GetResponseText(Void);
[ public, const ]
SFCError GetResponseText(
    SFXAnsiStringPtr result   // [出力] 応答テキストが格納された場所へのポインタ
);

引数

result

SMTP サーバーから取得した応答テキストが格納された場所へのポインタが返却されます。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、SMTP コマンドの応答テキストを取得します。

[Note] 注意

SMTP コマンド発行の結果は、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数に通知されます。 コールバック関数内でこの関数を呼び出すことで応答コードを取得できます。

[Note] 応答テキストとは

応答テキストとは、 SMTP サーバーからの応答メッセージから行頭の応答コードとそれに続く空白文字またはハイフン("-")を削除したテキストのことです。

応答テキストの詳細は、 RFC2821: 4.2 SMTP Replies を参照してください。

参照

SFXSMTP::GetResponseCode | SFXSMTP::SendCommand | SFXSMTP::Connect | RFC2821: 4.2 SMTP Replies


SFXSMTP::GetSSLMode
SSL 接続モードを取得します。
[ public, const ]
Bool GetSSLMode(Void);

戻り値

  • SSL 接続モードが ON であるとき: true
  • そうでないとき: false

解説

この関数は、SMTP メール受信の SSL 接続モードを取得します。

参照

SFXSMTP::SetSSLMode


SFXSMTP::GetTrustMode
SSL 認証モードを取得します。
[ public, const ]
UInt32 GetTrustMode(Void);

戻り値

SSL 認証モード

解説

この関数は、SMTP メール受信の SSL 認証モードを取得します。

以下の 4 種類の SSL 認証モードの何れかが返却されます。

  • SSL_TRUST_MODE_FAIL: トラストエラーがあると接続が失敗します。[デフォルト]
  • SSL_TRUST_MODE_CHECK: トラストエラーの場合、チェックまたは無視できるように中断します。
  • SSL_TRUST_MODE_IGNORE: すべてのトラストエラーを無視します。
  • SSL_TRUST_MODE_ALWAYS: トラストをチェックできるように常に中断します。

参照

SFXSMTP::SetTrustMode | BREW API ISSL_NegotiateV


SFXSMTP::Open
SMTP サーバーに接続するための初期化を行います。
[ public ]
SFCError Open(Void);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが既に開いているとき: SFERR_INVALID_STATE
  • SFBNetMgr クラス、もしくは SFBSSL インスタンスの生成に失敗したとき: SFERR_FAILED
  • 失敗したとき: AEE_NET_ERROR

解説

この関数は、SMTP サーバーに接続するための初期化を行います。

[Note] 注意

この関数は、 内部的に SFXSSLSocket::Open 関数を呼び出します (TCP 接続の場合は、内部で使用している SFXSSLSocket::Connect 関数のコールバック関数内で SFXSSLSocket::Permit 関数を呼び出します)。

参照

SFXSSLSocket::Open | SFXSSLSocket::Connect | SFXSSLSocket::Permit | SFXSMTP::Close


SFXSMTP::SendAuthCommand
AUTH コマンドを発行します。
[ public ]
SFCError SendAuthCommand(
    AuthEnum auth   // [入力] SMTP 認証方式
);

引数

auth

設定可能な SMTP 認証方式は、以下の 4 種類です(SFXSMTP::AuthEnum)。

  • AUTH_NONE: SMTP 認証を行いません。
  • PLAIN: PLAIN 認証を行います。
  • LOGIN: LOGIN 認証を行います。
  • CRAM-MD5: CRAM-MD5 認証を行います。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、AUTH コマンドを SMTP サーバーに送信します。

auth 引数に指定できる認証方式(SFXSMTP::AuthEnum)は、 AUTH_NONE / PLAIN / LOGIN / CRAM-MD5 の何れかです。

AUTH コマンドは、 どの認証方式が利用可能か明記されている EHLO コマンドの応答を受信してから SMTP サーバーに送信します。

[Note] 注意

SMTP コマンドの行末を表す CRLF(\r\n)は、自動的に付与されます。

[Note] AUTH コマンドについて

AUTH コマンドは、サーバーとクライアントが相互認証(SMTP 認証)するためのコマンドです。

AUTH コマンドの詳細は、 RFC2554: SMTP Service Extension for Authentication を参照してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

使用例

以下は、CRAM-MD5 認証を行うコードです。

smtp.SendAuthCommand(SFXSMTP::AUTH_CRAM_MD5);

参照

SFXSMTP::SendAuthResponse | SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | SFXSMTP::AuthEnum | RFC2554: SMTP Service Extension for Authentication


SFXSMTP::SendAuthResponse
AUTH コマンドの応答に対する返答を送信します。
[ public ]
SFCError SendAuthResponse(
    SFXAnsiStringConstRef str1                                    // [入力] 文字列 1(認証方式によって異なります)
    SFXAnsiStringConstRef str2 = SFXAnsiString::EmptyInstance()   // [入力] 文字列 2(認証方式によって異なります)
    SFXAnsiStringConstRef str3 = SFXAnsiString::EmptyInstance()   // [入力] 文字列 3(認証方式によって異なります)
);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、AUTH コマンドの応答に対する返答を送信します。

AUTH コマンドを SFXSMTP::SendAuthCommand 関数で送信した後、 SMTP サーバーからの応答に対して返答を送ります(※ SMTP 認証方式により引数に指定する内容は異なります)。

PLAIN の場合

  1. str1: ユーザー名
  2. str2: パスワード
  3. str3: 使用しません

LOGINの場合 : 1 回目は "SendAuthResponse(user)" を実行します。 SMTP サーバーから応答があった後、 2 回目は "SendAuthResponse(password)" を実行します。

CRAM-MD5 の場合

  1. str1: ユーザー名
  2. str2: パスワード
  3. str3: チャレンジコード(SMTP サーバーから送信されてきた応答テキスト)

[Note] 注意

SMTP コマンドの行末を表す CRLF(\r\n)は、自動的に付与されます。

引数に指定した文字列は自動的に Base64 エンコードされます。

[Note] AUTH コマンドについて

AUTH コマンドは、サーバーとクライアントが相互認証(SMTP 認証)するためのコマンドです。

AUTH コマンドの詳細は、 RFC2554: SMTP Service Extension for Authentication を参照してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

使用例

以下は、CRAM-MD5 認証を行うコードです。

smtp.SendAuthResponse("user", "password", smtp.GetResponseText());

参照

SFXSMTP::SendAuthResponse | SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | SFXMailUtility::EncodeBase64 | RFC2554: SMTP Service Extension for Authentication


SFXSMTP::SendCommand
SMTP コマンドを発行します。
[ public ]
SFCError SendCommand(
    ACharConstPtr command   // [入力] SMTP コマンドが格納されている変数へのポインタ
    UInt32 size             // [入力] SMTP コマンドの長さ
);
[ public ]
SFCError SendCommand(
    SFXAnsiStringConstRef command   // [入力] SMTP コマンド
);

引数

command

SMTP サーバーに送信する SMTP コマンドを指定します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、SMTP コマンドを発行します。

[Note] 注意

この関数を使用すれば、任意の SMTP コマンドを発行することが可能です。

ただし、command 引数に指定するコマンドの行末に CRLF(\r\n) は自動的に付与されませんので注意してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

参照

SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | RFC2821: 4.1 SMTP Commands


SFXSMTP::SendDataCommand
DATA コマンドを発行します。
[ public ]
SFCError SendDataCommand(Void);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、DATA コマンドを発行します。

SMTP サーバーは DATA コマンドを受信すると、 データ(メールヘッダーとメール本文からなるメールテキスト)の送信を促す『応答コード: 354』 を返却します。

クライアント側では、『応答コード: 354』 の確認後、 SFXSMTP::SendDataText 関数を使用してデータ(メールヘッダーとメール本文からなるメールテキスト)を送信します。

[Note] 注意

SMTP コマンドの行末を表す CRLF(\r\n)は、自動的に付与されます。

[Note] DATA コマンドについて

DATA コマンドは、 データ(メールヘッダーとメール本文からなるメールテキスト)を送信する直前に発行するコマンドです。

DATA コマンドの詳細は、 RFC2821: 4.1.1.4 DATA (DATA) を参照してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

参照

SFXSMTP::SendDataText | SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | RFC2821: 4.1.1.4 DATA (DATA)


SFXSMTP::SendDataText
データを送信します。
[ public ]
SFCError SendDataText(
    SFXAnsiStringConstRef text   // [入力] 送信するデータ
);

引数

text

メールの本文です。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、データ(メールヘッダーとメール本文からなるメールテキスト)を送信します。

この関数は、SFXSMTP::SendDataCommand 関数による DATA コマンドの『応答コード: 354』 を確認した後で呼び出します。

[Caution] 注意

text 引数に指定するデータの各行の長さは、CRLF 文字を含めて 1000 文字以下でなければいけません。

[Note] 注意

各行頭に "." 文字を追加するドット・スタッフィング(dot-stuffing)と、 ".\r\n" だけからなる最終行の追加は自動的に行われます。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

参照

SFXSMTP::SendDataCommand | SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | RFC2821: 4.1.1.4 DATA (DATA)


SFXSMTP::SendEhloCommand
ELHO コマンドを発行します。
[ public ]
SFCError SendEhloCommand(
    SFXAnsiStringConstRef hostName   // [入力] ホスト名
);

引数

hostName

接続するクライアントのホスト名です。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、ELHO コマンドを発行します。

応答メッセージは SFXSMTP::GetEhloResponse 関数で取得します。

[Note] 注意

SMTP コマンドの行末を表す CRLF(\r\n)は、自動的に付与されます。

[Note] ELHO コマンドについて

ELHO コマンドは、SMTP メール送信のセッションを開始するためのコマンドです。

ELHO コマンドの詳細は、 RFC2821: 4.1.1.1 Extended HELLO (EHLO) or HELLO (HELO) を参照してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

参照

SFXSMTP::GetEhloResponse | SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | RFC2821: 4.1.1.1 Extended HELLO (EHLO) or HELLO (HELO)


SFXSMTP::SendHeloCommand
HELO コマンドを発行します。
[ public ]
SFCError SendHeloCommand(
    SFXAnsiStringConstRef hostName   // [入力] ホスト名
);

引数

hostName

接続するクライアントのホスト名です。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、HELO コマンドを発行します。

応答メッセージは SFXSMTP::GetHeloResponse 関数で取得します。 HELO コマンドは古いサーバーとの互換性のために用意されており、使用は推奨されていません。 通常は ELHO コマンド(SFXSMTP::SendEhloCommand 関数)を使用します。

[Note] 注意

SMTP コマンドの行末を表す CRLF(\r\n)は、自動的に付与されます。

[Note] HELO コマンドについて

HELO コマンドは、SMTP メール送信のセッションを開始するためのコマンドです。

HELO コマンドの詳細は、 RFC2821: 4.1.1.1 Extended HELLO (EHLO) or HELLO (HELO) を参照してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

参照

SFXSMTP::SendEhloCommand | SFXSMTP::GetHeloResponse | SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | RFC2821: 4.1.1.1 Extended HELLO (EHLO) or HELLO (HELO)


SFXSMTP::SendMailCommand
MAIL コマンドを発行します。
[ public ]
SFCError SendMailCommand(
    SFXAnsiStringConstRef from   // [入力] 送信元メールアドレス
);

引数

from

送信元メールアドレスを指定します(送信元アドレスは、"<" と ">" で囲む必要があります。)

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、MAIL コマンドを発行します。

[Note] 注意

SMTP コマンドの行末を表す CRLF(\r\n)は、自動的に付与されます。

[Note] MAIL コマンドについて

MAIL コマンドは、メールメッセージの送信元アドレスを設定するためのコマンドです。

MAIL コマンドの詳細は、 RFC2821: 4.1.1.2 MAIL (MAIL) を参照してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

参照

SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | RFC2821: 4.1.1.2 MAIL (MAIL)


SFXSMTP::SendNoopCommand
NOOP コマンドを発行します。
[ public ]
SFCError SendNoopCommand(Void);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、NOOP コマンドを発行します。

NOOP コマンドを受け取ると、 SMTP サーバーはいつも "250 ok" という応答を返します("250" は応答コード、"ok" は応答テキスト)。

[Note] 注意

SMTP コマンドの行末を表す CRLF(\r\n)は、自動的に付与されます。

[Note] NOOP コマンドについて

NOOP コマンドを発行しても何も起きません。 このコマンドによりタイマによる自動ログアウトを回避したり、 SMTP サーバーとの接続を確認することができます。

NOOP コマンドの詳細は、 RFC2821: 4.1.1.9 NOOP (NOOP) を参照してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

参照

SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | RFC2821: 4.1.1.9 NOOP (NOOP)


SFXSMTP::SendQuitCommand
QUIT コマンドを発行します。
[ public ]
SFCError SendQuitCommand(Void);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、QUIT コマンドを発行します。

[Note] 注意

SMTP コマンドの行末を表す CRLF(\r\n)は、自動的に付与されます。

[Note] SMTP メール送信のセッション終了方法

この関数で QUIT コマンドを発行し、その応答を確認してから、 SFXSMTP::Close 関数を呼び出して SMTP サーバーとの接続を切断します。

[Note] QUIT コマンドについて

QUIT コマンドは、SMTP メール送信のセッションを終了するためのコマンドです。

QUIT コマンドの詳細は、 RFC2821: 4.1.1.10 QUIT (QUIT) を参照してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

参照

SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTPSender::IsQuit | SFXSMTP::Connect | RFC2821: 4.1.1.10 QUIT (QUIT)


SFXSMTP::SendRcptCommand
RCPT コマンドを発行します。
[ public ]
SFCError SendRcptCommand(
    SFXAnsiStringConstRef to   // [入力] メールメッセージの送信先アドレス
);

引数

to

メールメッセージの送信先アドレスを指定します(送信先アドレスは、"<" と ">" で囲む必要があります。)

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、RCPT コマンドを発行します。

[Note] 注意

SMTP コマンドの行末を表す CRLF(\r\n)は、自動的に付与されます。

[Note] RCPT コマンドについて

RCPT コマンドは、メールメッセージの送信先を設定するためのコマンドです。

RCPT コマンドの詳細は、 RFC2821: 4.1.1.3 RECIPIENT (RCPT) を参照してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

参照

SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | RFC2821: 4.1.1.3 RECIPIENT (RCPT)


SFXSMTP::SendRsetCommand
RSET コマンドを発行します。
[ public ]
SFCError SendRsetCommand(Void);

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 接続が確立されていないとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY

解説

この関数は、RSET コマンドを発行します。

[Note] 注意

SMTP コマンドの行末を表す CRLF(\r\n)は、自動的に付与されます。

[Note] RSET コマンドについて

RSET コマンドは、SMTP メール送信のセッションをリセットするためのコマンドです。

RSET コマンドの詳細は、 RFC2821: 4.1.1.5 RESET (RSET) を参照してください。

[Note] エラー値と応答コード

この関数の戻り値として返却されるのは、 クライアント側の内部処理についてのエラー値です。

通信やコマンドについての実行エラーは、 SFXSMTP::Connect 関数の spp 引数に指定するコールバック関数の第 1 引数に通知されます。

※コマンドの実行結果(応答コード/応答テキスト)は、 コールバック関数内で SFXSMTP::GetResponseCode / SFXSMTP::GetResponseText 関数を呼び出すことでを取得できます。

参照

SFXSMTP::GetResponseCode | SFXSMTP::GetResponseText | SFXSMTP::Connect | RFC2821: 4.1.1.5 RESET (RSET)


SFXSMTP::SetSSLMode
SSL 接続モードに設定します。
[ public ]
Void SetSSLMode(
    Bool isSSL   // [入力] SSL 接続モードを ON にするか否か
);

解説

この関数は、SSL 接続モードを設定します。

デフォルト値: false(SSL 接続モードは OFF)

[Note] 注意

SSL 接続モードを ON する場合、isSSL 引数に true を指定します。

参照

SFXSMTP::GetSSLMode | SFXSMTP::SFXSMTP


SFXSMTP::SetTrustMode
SSL 認証モードを設定します。
[ public ]
SFCError SetTrustMode(
    UInt32 sslTrustMode   // [入力] SSL 認証モード
);

引数

sslTrustMode

以下の 4 種類の何れかの SSL 認証モードを指定します。

  • SSL_TRUST_MODE_FAIL: デフォルトです。認証エラーがあると接続が失敗します。
  • SSL_TRUST_MODE_CHECK: 認証エラーの場合、チェックまたは無効にできるように中断します。
  • SSL_TRUST_MODE_IGNORE: すべての認証エラーを無効にします。
  • SSL_TRUST_MODE_ALWAYS: 認証をチェックできるように常に中断します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • ソケットが閉じているとき : SFERR_INVALID_STATE

解説

この関数は、SMTP メール受信の SSL 認証モードを設定します。

デフォルト値: SSL_TRUST_MODE_FAIL

設定可能な SSL 認証モードは以下の通りです(参照: BREW API ISSL_NegotiateV)。

  • SSL_TRUST_MODE_FAIL: トラストエラーがあると接続が失敗します。[デフォルト]
  • SSL_TRUST_MODE_CHECK: トラストエラーの場合、チェックまたは無視できるように中断します。
  • SSL_TRUST_MODE_IGNORE: すべてのトラストエラーを無視します。
  • SSL_TRUST_MODE_ALWAYS: トラストをチェックできるように常に中断します。
[Note] 注意

SFXSMTP::Connect 関数を使用して SMTP サーバーに接続する直前に、 この関数を呼び出して SSL 認証モードを設定します。

参照

SFXSMTP::GetTrustMode | SFXSMTP::Connect | SFXSSLSocket::SetTrustMode | BREW API ISSL_NegotiateV


SFXSMTP::AuthEnum
SMTP 認証方式を表す定数です。
enum AuthEnum {
    AUTH_NONE       =0,  // SMTP 認証を行いません。
    AUTH_PLAIN,          // PLAIN 認証を行います。
    AUTH_LOGIN,          // LOGIN 認証を行います。
    AUTH_CRAM_MD5,       // CRAM-MD5 認証を行います。
    AUTH_DIGEST_MD5      // DIGEST-MD5 認証を行います(現バージョンでは、DIGEST-MD5 認証は使用できません)。
};

解説

SMTP 認証方式を表す定数です。

SFXSMTP::SendAuthCommand 関数を使用して下記の SMTP 認証方式の定数を指定できます。

AUTH_NONE

SMTP 認証を行いません。

AUTH_PLAIN

PLAIN 認証を行います。

AUTH_LOGIN

LOGIN 認証を行います。

AUTH_CRAM_MD5

CRAM-MD5 認証を行います。

AUTH_DIGEST_MD5

DIGEST-MD5 認証を行います(現在のバージョンでは、サポートされていません)。

参照

SFXSMTP::SendAuthCommand


SFXSMTP::CallbackSPP
SMTP サーバー接続や SMTP コマンド発行の結果が通知されるコールバック関数の型です。
typedef Void(* SFXSMTP::CallbackSPP)(SFCError error, VoidPtr reference)

解説

SMTP サーバー接続や SMTP コマンド発行の結果が通知されるコールバック関数の型です。

このコールバック関数は、SFXSMTP::Connect 関数の spp 引数に指定します。 SMTP サーバー接続や SMTP コマンド発行の結果(エラー値)は、このコールバック関数に通知されます。

第 1 引数にエラーコード、 第 2 引数は SFXSMTP::Connect 関数で指定した引数(通常、SFXSMTP インスタンス: this)が渡されます。

参照

SFXSMTP::Connect