前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3
SFXSMTPSender
SMTP メール送信クラスです。
#include <SFXSMTPSender.h.hpp>
class SFXSMTPSender;
SFMTYPEDEFCLASS(SFXSMTPSender)

協調図

SFXSMTPSender クラスの協調図

解説

SFXSMTPSender クラスは、 SMTP メール送信を行うクラスです。

[Note] 注意

このクラスは、SFXSMTP クラスと SFXMailUtility クラスを使用して実装されています。

SFXSMTPSender クラスを使用してメールを送信する方法

  1. SFXMailMessage クラスを使用してメールメッセージを作成します。
  2. SFXSMTPSender インスタンスを作成します。
  3. SFXSMTPSender::SetServer 関数で SMTP サーバーのドメイン名(または IP アドレス)とポート番号を設定します(ドメイン名の解決は自動的に行われます)。
  4. メール送信の結果が通知されるコールバック関数を指定して SFXSMTPSender::SendMessage 関数を呼び出します。 この操作によりメール送信が開始します。

例 844. SMTP メール送信

class MyClass {
private:
    SFXSMTPSender _sender;
    XALLBACK_DECLARE_SFXSMTPSENDER(SMTPCallback)
public:
    Void Start(Void);
};

Void MyClass::Start(Void)
{
    SFCError error;
    SFXMailMessage message;

    // メールヘッダーに From フィールドを設定する
    message.SetFromField("fromaddress@example.com");

    // メールヘッダーに To アドレスを追加する
    message.AddToField("toaddress1@example.com");
    message.AddToField("toaddress2@example.com");

    // メールヘッダーに Subject フィールドを設定する
    message.SetSubjectField("Mail Subject");

    // メールメッセージの本文を設定する
    message.SetBody("Mail test\r\nThis mail is sent by SFXSMTPSender.\r\n");

    // SMTP サーバーのドメイン名(または IP アドレス)とポート番号を指定する: ドメイン名は自動解決される
    _sender.SetServer(SFXSocketAddress("smtpserver.example.com:25"));

    // SMTPCallback コールバック関数を登録し、メールメッセージを送信する
    // ※ メール送信の結果は SMTPCallback 関数に通知される
    if ((error = _sender.SendMessage(&message, XALLBACK_INTERNAL(SMTPCallback))) != SFERR_NO_ERROR) {

        // SMTP クライアント内でエラーが発生したとき
        // ※ SMTPCallback 関数は呼び出されない
        ...
    }
}

// メール送信の結果が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXSMTPSENDER(MyClass, SMTPCallback, error)
{
    if (error == SFERR_NO_ERROR) {
        TRACE("メールを送信しました。");
    }
    else {
        TRACE("メール送信に失敗しました。エラーコード: %d", error);
    }
}

SFXMailMessage インスタンスのプロパティとして From フィールドと To フィールドは必ず設定しなければいけません。 Cc フィールド、Bcc フィールドは必要に応じて設定します。

[Note] 注意

SFXSMTPSender::SendText 関数を使用してメール送信することも可能ですが、 エンコードされたメールヘッダーとメール本文からなるメールメッセージを開発者が作成する必要があります。

※ 通常、エンコードなどの処理を自動的に行ってくれる SFXMailMessage クラスを利用してメールメッセージを作成します。

[Caution] タイムアウトの制御

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

参照

SFXMailMessage | SFXSMTP | SFXMailUtility | SFXSMTPSender::SendText | メール送受信

メンバ

コンストラクタ/デストラクタ
SFXSMTPSender( Void )
SFXSMTPSender クラスのコンストラクタです。
~SFXSMTPSender( Void )
SFXSMTPSender クラスのデストラクタです。
パブリック関数
SFCError AddTo( SFXAnsiStringConstRef to )
送信先メールアドレスを追加します。
Void Cancel( Void )
SMTP メール送信をキャンセルします。
Void ClearTo( Void )
送信先メールアドレスの設定をクリアします。
ProgressEnum GetProgress( Void )
SMTP メール送信の進行状態を表す定数を取得します。
SFXSMTPRef GetSFXSMTP( Void )
内部で保持している SFXSMTP インスタンスを取得します。
Bool GetSSLMode( Void )
SSL 接続モードを取得します。
UInt32 GetTrustMode( Void )
SSL 認証モードを取得します。
Bool IsQuit( Void )
QUIT コマンドを発行したかどうかを判定します。
SFCError SendMessage( SFXMailMessagePtr message , CallbackSPP spp , VoidPtr reference )
メールメッセージを送信します。
SFCError SendText( SFXAnsiStringConstRef text , CallbackSPP spp , VoidPtr reference )
ヘッダーと本文からなるメールメッセージのテキストを送信します。
SFCError SetAuthorization( AuthEnum auth , SFXAnsiStringConstRef user , SFXAnsiStringConstRef password )
SMTP 認証方式、ユーザー名、パスワードを設定します。
SFCError SetFrom( SFXAnsiStringConstRef from )
送信元メールアドレスを設定します。
SFCError SetHostName( SFXAnsiStringConstRef host )
送信元ホストネームを設定します。
Void SetSSLMode( Bool isSSL )
SSL 接続モードを設定します。
SFCError SetServer( SFXSocketAddressConstRef server )
SMTP サーバーのドメイン名(または IP アドレス)とポート番号を設定します。
Void SetTrustMode( UInt32 sslTrustMode )
SSL 認証モードを設定します。
AuthEnum
SMTP 認証方式を表す定数です。
CallbackSPP
SMTP メール送信の結果が通知されるコールバック関数の型です。
ProgressEnum
SMTP メール送信の進行状態を表す定数です。

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

解説

このコンストラクタは、以下の初期化処理を行います。

  1. SMTP メール送信の進行状態を PROGRESS_NONE(SFXSMTPSender::ProgressEnum)に初期化します。
  2. SMTP 認証方式を AUTH_NONE に設定します(参照: SFXSMTPSender::SetAuthorization)。
  3. SSL 接続を使用しない設定にします(参照: SFXSMTPSender::SetSSLMode)。
  4. SSL 認証モードを SSL_TRUST_MODE_FAIL に設定します(参照: SFXSMTPSender::SetTrustMode)。
[Note] 注意

このコンストラクタでは、 SMTP メール送信に必要なリソースは割り当てられていません。

SMTP メール送信に必要なリソースは SFXSMTPSender::SendMessage 関数、 または SFXSMTPSender::SendText 関数を呼び出して SMTP サーバーに接続するときに確保されます。

内部実装

このコンストラクタの内部実装は以下の通りです。

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

参照

SFXSMTPSender::SetAuthorization | SFXSMTPSender::SetSSLMode | SFXSMTPSender::SetTrustMode | SFXSMTPSender::SendMessage | SFXSMTPSender::SendText


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

解説

このデストラクタは、 SFXSMTPSender::Cancel 関数を呼び出して SMTP メール送信をキャンセルしてからインスタンスを破棄します。

内部実装

このデストラクタの内部実装は以下の通りです。

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

参照

SFXSMTPSender::Cancel


SFXSMTPSender::AddTo
送信先メールアドレスを追加します。
[ public ]
SFCError AddTo(
    SFXAnsiStringConstRef to   // [入力] 送信先メールアドレス
);

引数

to

追加する送信先メールアドレスを指定します。

メールアドレスは、"<" と ">" で囲む必要があります。

(例)user@exapmle.com の場合は、<user@example.com> です。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • メモリ不足のとき: SFERR_NO_MEMOERY

解説

この関数は、送信先メールアドレスを追加します。

※ この関数は、SFXSMTPSender::SendText 関数によりメール送信を行う場合に使用します。

[Note] 注意

複数の送信先メールアドレスを設定するには、 この関数を複数回呼び出します。

この関数は SFXSMTPSender::SendText 関数よりも前に呼び出す必要があります。

内部実装

この関数の内部実装は以下の通りです。

/*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 //

参照

SFXSMTPSender::ClearTo | SFXSMTPSender::SendText


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

解説

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

具体的には、以下の処理を行います。

  1. SMTP メール送信を中断・終了します(参照: SFXSMTP::Close)。
  2. 確保したリソースを解放します。
  3. メール送信の結果を通知するコールバックの登録(SFXSMTPSender::CallbackSPP)を解除します。
  4. SMTP メール送信の進行状態を PROGRESS_NONE(SFXSMTPSender::ProgressEnum)に初期化します。
  5. From フィールド(送信元メールアドレス)と To フィールド(送信先メールアドレス)の設定をクリアします。
  6. その他、内部変数の値を初期化します。
[Note] 注意

この関数は、内部的に 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 //

参照

SFXSMTPSender::SendMessage | SFXSMTPSender::SendText | SFXSMTPSender::ClearTo | SFXSMTPSender::AddTo | SFXSMTPSender::SetFrom | SFXSMTPSender::~SFXSMTPSender | SFXSMTP::Close | SFXSMTPSender::CallbackSPP | SFXSMTPSender::ProgressEnum


SFXSMTPSender::ClearTo
送信先メールアドレスの設定をクリアします。
[ public ]
Void ClearTo(Void);

解説

この関数は、SFXSMTPSender::AddTo 関数で設定した送信先メールアドレスの設定をクリアします。

※ この関数は、SFXSMTPSender::SendText 関数によりメール送信を行う場合に使用します。

内部実装

この関数の内部実装は以下の通りです。

/*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 //

参照

SFXSMTPSender::AddTo | SFXSMTPSender::SendText


SFXSMTPSender::GetProgress
SMTP メール送信の進行状態を表す定数を取得します。
[ public, const ]
ProgressEnum GetProgress(Void);

戻り値

SMTP メール送信の進行状態を表す定数(SFXSMTPSender::ProgressEnum の何れかの定数)。

解説

この関数は、SMTP メール送信の進行状態を表す定数を取得します。

[Note] 注意

SMTP メール送信に失敗したときにコールバック関数内でこの関数を呼び出すと、 エラーが発生した段階を取得できます。

内部実装

この関数の内部実装は以下の通りです。

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

参照

SFXSMTPSender::ProgressEnum | SFXSMTPSender::SendMessage | SFXSMTPSender::SendText


SFXSMTPSender::GetSFXSMTP
内部で保持している SFXSMTP インスタンスを取得します。
[ public ]
SFXSMTPRef GetSFXSMTP(Void);

戻り値

内部で保持している SFXSMTP インスタンス

解説

この関数は、内部で保持している SFXSMTP インスタンスを取得します。

内部実装

この関数の内部実装は以下の通りです。

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

参照

SFXSMTP


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

戻り値

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

解説

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

内部実装

この関数の内部実装は以下の通りです。

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

参照

SFXSMTPSender::SetSSLMode


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

戻り値

SMTP メール送信の SSL 認証モード

解説

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

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

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

内部実装

この関数の内部実装は以下の通りです。

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

参照

SFXSMTPSender::SetTrustMode | BREW API ISSL_NegotiateV


SFXSMTPSender::IsQuit
QUIT コマンドを発行したかどうかを判定します。
[ public ]
Bool IsQuit(Void);

戻り値

  • QUIT コマンドを発行したとき: true
  • そうでないとき: false

解説

この関数は、QUIT コマンドを発行したかどうかを判定します。

[Note] QUIT コマンド

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

内部実装

この関数の内部実装は以下の通りです。

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

参照

SFXSMTP::SendQuitCommand


SFXSMTPSender::SendMessage
メールメッセージを送信します。
[ public ]
SFCError SendMessage(
    SFXMailMessagePtr message   // [入力] 送信するメールメッセージ
    CallbackSPP spp             // [入力] SMTP メール送信の結果が通知されるコールバック関数
    VoidPtr reference           // [入力] コールバック関数に渡されるデータ(参照値)
);

引数

message

送信するメールメッセージを指定します。

spp

SMTP メール送信完了が通知されるコールバック関数を指定します。

spp

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

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • メールメッセージの内容が正しくないとき(送信先メールアドレスまたは送信元メールアドレスが設定されていないとき): SFERR_INVALID_PARAM
  • ソケットが既に開いているとき、または接続の確立に失敗したとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY
  • ソケットの作成に失敗したとき: AEE_NET_ERROR

解説

この関数は、メールメッセージを送信します。

[Note] 注意

この関数を呼び出す前に SMTP サーバーを SFXSMTPSender::SetServer 関数で設定します。

送信元のホスト名は自動的に取得されますが、SFXSMTPSender::SetHostName 関数で設定することも可能です。

送信元メールアドレスは、メールメッセージのヘッダーに含まれる From フィールドです。

送信先メールアドレスは、メールメッセージのヘッダーに含まれる To / Cc / Bcc フィールドです。 Bcc フィールドは削除してから送信します。

Shift_JIS コードでエンコードされたヘッダーは Base64 エンコードされて送信されます。 また、Shift_JIS コードでエンコードされたメールメッセージの本文は JIS コード(ISO-2022-JP)でエンコードされて送信されます

[Caution] SMTP メール送信の結果

SMTP メール送信の結果は、spp 引数に指定したコールバック関数に通知されます。 この関数の戻り値には反映されません。

[Note] メールメッセージのエンコード

送信するメールメッセージは、 ヘッダーのフィールド値に含まれる日本語は JIS コードでエンコードされ、 更に B エンコードまたは Q エンコードされている必要があります。 また、メール本文は JIS コードでエンコードされている必要があります。

マルチパートメッセージの場合、 メール本文、プリアンブルテキスト、エピローグテキストは、JIS コードでエンコードされている必要があります。 更に、添付ファイルのパートは Base64 エンコードまたは Quoted-Printable エンコードされている必要があります。

また、1 行の長さは行末の改行文字「 CRLF(\r\n)」を除き、4 文字以上 998 文字以下でなければいけません。

以上のエンコードは、この関数が内部的に SFXMailMessage クラスを利用して行いますので、 開発者はエンコード処理を記述する必要はありません。

内部実装

この関数の内部実装は以下の通りです。

#define     XALLBACK_IMPLEMENT_SFXSMTP(TYPE, FUNCTION, ERROR)                   XALLBACK_IMPLEMENT_SFAMAILPROTOCOL(TYPE, FUNCTION, ERROR)
#define     XALLBACK_IMPLEMENT_SFAMAILPROTOCOL(TYPE, FUNCTION, ERROR)           XALLBACK_IMPLEMENT_SFXSSLSOCKET(TYPE, FUNCTION, ERROR)
#define     XALLBACK_IMPLEMENT_SFXSSLSOCKET(TYPE, FUNCTION, ERROR)              XALLBACK_IMPLEMENT_SFXSTORAGE(TYPE, FUNCTION, ERROR)
#define     XALLBACK_IMPLEMENT_SFXSTORAGE(TYPE, FUNCTION, ERROR) \
Void XALLBACK_FUNCTION(TYPE::FUNCTION)(SFCError error, VoidPtr reference) \
{ \
    static_cast<TYPE*>(reference)->FUNCTION(error); \
    return; \
} \
\
Void TYPE::FUNCTION(SFCError ERROR)

/*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 //

/*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::SetServer | SFXSMTPSender::SetHostName | SFXSMTPSender::SetFrom | SFXSMTPSender::AddTo | SFXSMTPSender::ClearTo | SFXSMTPSender::Cancel | SFXSMTPSender::SendText | SFXSMTPSender::SFXSMTPSender | SFXSMTPSender::CallbackSPP | SFXMailMessage


SFXSMTPSender::SendText
ヘッダーと本文からなるメールメッセージのテキストを送信します。
[ public ]
SFCError SendText(
    SFXAnsiStringConstRef text   // [入力] 送信するテキスト
    CallbackSPP spp              // [入力] SMTP メール送信の結果が通知されるコールバック関数
    VoidPtr reference            // [入力] コールバック関数に渡されるデータ(参照値)
);

引数

text

送信するテキストを指定します。

spp

SMTP メール送信完了が通知されるコールバック関数を指定します。

spp

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

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • 送信元ホスト名、送信元メールアドレス、送信先メールアドレスのいずれかを設定していないとき: SFERR_INVALID_PARAM
  • ソケットが既に開いているとき、または接続の確立に失敗したとき: SFERR_INVALID_STATE
  • メモリ不足のとき: SFERR_NO_MEMORY
  • ソケットの作成に失敗したとき: AEE_NET_ERROR

解説

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

[Note] text 引数に指定するテキストのエンコード

text 引数に指定するメールテキストは、 ヘッダーのフィールド値に含まれる日本語は JIS コードでエンコードされ、 更に B エンコードまたは Q エンコードされている必要があります。 また、メール本文は JIS コードでエンコードされている必要があります。

また、1 行の長さは行末の改行文字「 CRLF(\r\n)」を除き、4 文字以上 998 文字以下でなければいけません。

※ 通常、エンコードなどの処理を自動的に行ってくれる SFXMailMessage クラスを利用してメールメッセージを作成します。

[Note] 使用方法

この関数を呼び出す前に SFXSMTPSender::SetServer / SFXSMTPSender::SetHostName / SFXSMTPSender::SetFrom / SFXSMTPSender::AddTo 関数を使用して、 SMTP サーバー、送信元ホスト名、送信元メールアドレス、送信先メールアドレスを設定します。

この関数の呼び出すと、メール送信が開始します。

[Caution] SMTP メール送信の結果

SMTP メール送信の結果は、spp 引数に指定したコールバック関数に通知されます。 この関数の戻り値には反映されません。

内部実装

この関数の内部実装は以下の通りです。

#define     XALLBACK_IMPLEMENT_SFXSMTP(TYPE, FUNCTION, ERROR)                   XALLBACK_IMPLEMENT_SFAMAILPROTOCOL(TYPE, FUNCTION, ERROR)
#define     XALLBACK_IMPLEMENT_SFAMAILPROTOCOL(TYPE, FUNCTION, ERROR)           XALLBACK_IMPLEMENT_SFXSSLSOCKET(TYPE, FUNCTION, ERROR)
#define     XALLBACK_IMPLEMENT_SFXSSLSOCKET(TYPE, FUNCTION, ERROR)              XALLBACK_IMPLEMENT_SFXSTORAGE(TYPE, FUNCTION, ERROR)
#define     XALLBACK_IMPLEMENT_SFXSTORAGE(TYPE, FUNCTION, ERROR) \
Void XALLBACK_FUNCTION(TYPE::FUNCTION)(SFCError error, VoidPtr reference) \
{ \
    static_cast<TYPE*>(reference)->FUNCTION(error); \
    return; \
} \
\
Void TYPE::FUNCTION(SFCError ERROR)

/*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::SetServer | SFXSMTPSender::SetHostName | SFXSMTPSender::SetFrom | SFXSMTPSender::AddTo | SFXSMTPSender::ClearTo | SFXSMTPSender::Cancel | SFXSMTPSender::SendMessage | SFXSMTPSender::SFXSMTPSender | SFXSMTPSender::CallbackSPP | SFXMailMessage::Write | SFXMailMessage


SFXSMTPSender::SetAuthorization
SMTP 認証方式、ユーザー名、パスワードを設定します。
[ public ]
SFCError SetAuthorization(
    AuthEnum auth                    // [入力] 認証方式
    SFXAnsiStringConstRef user       // [入力] ユーザー名
    SFXAnsiStringConstRef password   // [入力] パスワード
);

引数

auth

SMTP 認証方式を指定します。

参照: SFXSMTPSender::AuthEnum 定数

user

ユーザー名を指定します。

password

パスワードを指定します。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • メモリ不足のとき: SFERR_NO_MEMOERY

解説

この関数は、SMTP 認証方式、ユーザー名、パスワードを設定します。

[Note] 注意

この関数を実行する前に SFXSMTPSender::SFXSMTPSender コンストラクタ内で SMTP 認証方式は SFXSMTPSender::AUTH_NONE に初期化されています。

[Note] 設定可能な認証方式

設定可能な認証方式は以下の通りです(SFXSMTPSender::AuthEnum)。

  • AUTH_NONE: SMTP 認証を行いません。
  • AUTH_PLAIN: PLAIN 認証を行います。
  • AUTH_LOGIN: LOGIN 認証を行います。
  • AUTH_CRAM_MD5: CRAM-MD5 認証を行います。
  • AUTH_DIGEST_MD5: DIGEST-MD5 認証を行います(現バージョンでは、DIGEST-MD5 認証は使用できません)。

使用例

以下は、LOGIN 認証を行うコードです。

SFXSMTPSender sender;
SFCError error;

// LOGIN 認証を行う
error = _sender.SetAuthorization(SFXSMTPSender::AUTH_LOGIN , "user" , "password");
if (error != SFERR_NO_ERROR) {
     TRACE("Authorization error : %d", error);
}

内部実装

この関数の内部実装は以下の通りです。

/*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 //

参照

SFXSMTPSender::AuthEnum | SFXSMTPSender::SendMessage | SFXSMTPSender::SendText | SFXSMTPSender::SFXSMTPSender


SFXSMTPSender::SetFrom
送信元メールアドレスを設定します。
[ public ]
SFCError SetFrom(
    SFXAnsiStringConstRef from   // [入力] 送信元メールアドレス
);

引数

from

送信元メールアドレスを指定します。

メールアドレスは、"<" と ">" で囲まなくてはなりません。

(例)user@exapmle.com の場合は、<user@example.com> です。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • メモリ不足のとき: SFERR_NO_MEMOERY

解説

この関数は、送信元メールアドレスを設定します。

※ この関数は、SFXSMTPSender::SendText 関数によりメール送信を行う場合に使用します。

[Note] 注意

この関数は SFXSMTPSender::SendText 関数よりも前に呼び出す必要があります。

内部実装

この関数の内部実装は以下の通りです。

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

参照

SFXSMTPSender::SendText


SFXSMTPSender::SetHostName
送信元ホストネームを設定します。
[ public ]
SFCError SetHostName(
    SFXAnsiStringConstRef host   // [入力] 送信元ホストネーム
);

引数

hostName

送信元ホストネームを指定します。

空文字列は使えません。

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • メモリ不足のとき: SFERR_NO_MEMOERY

解説

この関数は、送信元ホストネームを設定します。

※ この関数は、SFXSMTPSender::SendText 関数によりメール送信を行う場合に使用します。

[Note] 注意

この関数は SFXSMTPSender::SendText 関数よりも前に呼び出す必要があります。

この関数で設定したホストネームは、 SMTP プロトコルの EHLO ( もしくは HELO )コマンドの引数として使われます。

内部実装

この関数の内部実装は以下の通りです。

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

参照

SFXSMTPSender::SendText


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

解説

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

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

[Note] 注意

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

内部実装

この関数の内部実装は以下の通りです。

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

参照

SFXSMTPSender::GetSSLMode | SFXSMTPSender::SFXSMTPSender


SFXSMTPSender::SetServer
SMTP サーバーのドメイン名(または IP アドレス)とポート番号を設定します。
[ public ]
SFCError SetServer(
    SFXSocketAddressConstRef server   // [入力] SMTP サーバーのドメイン名(または IP アドレス)とポート番号
);

引数

server

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

戻り値

  • 成功したとき: SFERR_NO_ERROR
  • メモリ不足のとき: SFERR_NO_MEMOERY

解説

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

[Note] 注意

この関数は SFXSMTPSender::SendMessage / SFXSMTPSender::SendText 関数よりも前に呼び出して SMTP サーバーのドメイン名(または IP アドレス)とポート番号を設定する必要があります。

※ ドメイン名の解決は自動的に行われます。

内部実装

この関数の内部実装は以下の通りです。

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

参照

SFXSMTPSender::SendMessage | SFXSMTPSender::SendText | SFXSMTPSender::SFXSMTPSender | SFXSocketAddress


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

引数

sslTrustMode

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

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

解説

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

デフォルト値: SSL_TRUST_MODE_FAIL

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

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

設定された値は、 SFXSMTPSender::Cancel 関数が呼び出されるまで有効です。

[Note] 注意

詳細情報: BREW API ISSL_NegotiateV

内部実装

この関数の内部実装は以下の通りです。

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

参照

SFXSMTPSender::GetTrustMode | SFXSSLSocket::SetTrustMode | SFXSMTPSender::SFXSMTPSender | BREW API ISSL_NegotiateV


SFXSMTPSender::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 認証方式を表す定数です。

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

AUTH_NONE

SMTP 認証を行いません。

AUTH_PLAIN

PLAIN 認証を行います。

AUTH_LOGIN

LOGIN 認証を行います。

AUTH_CRAM_MD5

CRAM-MD5 認証を行います。

AUTH_DIGEST_MD5

DIGEST-MD5 認証を行います(現バージョンでは、DIGEST-MD5 認証は使用できません)。

参照

SFXSMTPSender::SetAuthorization | SFXSMTP::SendAuthCommand | SFXSMTPSender::SFXSMTPSender


SFXSMTPSender::CallbackSPP
SMTP メール送信の結果が通知されるコールバック関数の型です。
typedef Void(* SFXSMTPSender::CallbackSPP)(SFCError error, VoidPtr reference)

解説

SMTP メール送信の結果が通知されるコールバック関数の型です。

このコールバック関数は、 SFXSMTPSender::SendMessage または SFXSMTPSender::SendText 関数を使用して登録します。

メール送信処理の結果は、このコールバック関数に通知されます。

第 1 引数の error には、SMTP メール送信に成功した場合は SFERR_NO_ERROR、 失敗した場合はその他のエラーコードが渡されます。

第 2 引数の reference には、 SFXSMTPSender::SendMessage または SFXSMTPSender::SendText 関数の reference 引数に指定した値 (通常、SFXSMTPSender インスタンス: this)が渡されます。

[Note] 注意

SMTP メール送信処理のどの段階でエラーが発生したかは、 SFXPOP3Receiver::Delete コールバック関数内で SFXSMTPSender::GetProgress 関数を使用して取得できます。

参照

SFXSMTPSender::SendMessage | SFXSMTPSender::SendText | SFXSMTPSender::GetProgress


SFXSMTPSender::ProgressEnum
SMTP メール送信の進行状態を表す定数です。
enum ProgressEnum {
    PROGRESS_NONE,      = 0  // 接続は開始されていません。
    PROGRESS_CONNECT,        // SMTP サーバーに接続中です。
    PROGRESS_EHLO,           // EHLO コマンドの応答を待っています。
    PROGRESS_HELO,           // HELO コマンドの応答を待っています。
    PROGRESS_AUTH,           // AUTH コマンドの応答を待っています。
    PROGRESS_AUTHRESP1,      // SMTP 認証の 1 回目のコマンドに対する応答を待っています。
    PROGRESS_AUTHRESP2,      // SMTP 認証の 2 回目のコマンドに対する応答を待っています。
    PROGRESS_MAIL,           // MAIL コマンドの応答を待っています。
    PROGRESS_RCPT,           // RCPT コマンドの応答を待っています。
    PROGRESS_DATA,           // DATA コマンドの応答を待っています。
    PROGRESS_DATATEXT,       // DATA コマンドに続くメッセージテキストの応答を待っています。
    PROGRESS_QUIT,           // QUIT コマンドの応答を待っています。
    PROGRESS_ERRORQUIT,      // メール送信が失敗した状態です。
    PROGRESS_DONE            // メール送信処理がすべて完了した状態です。
};

解説

SFXSMTPSender クラスによる SMTP メール送信の進行状態を表す定数です。

SFXSMTPSender::GetProgress 関数を使用して以下の SMTP メール送信の進行状態を表す定数を取得できます。

PROGRESS_NONE

接続は開始されていません。

PROGRESS_CONNECT

SMTP サーバーに接続中です。

PROGRESS_EHLO

EHLO コマンドの応答を待っています。

PROGRESS_HELO

HELO コマンドの応答を待っています。

PROGRESS_AUTH

AUTH コマンドの応答を待っています。

PROGRESS_AUTHRESP1

SMTP 認証の 1 回目のコマンドに対する応答を待っています。

PROGRESS_AUTHRESP2

SMTP 認証の 2 回目のコマンドに対する応答を待っています。

PROGRESS_MAIL

MAIL コマンドの応答を待っています。

PROGRESS_RCPT

RCPT コマンドの応答を待っています。

PROGRESS_DATA

DATA コマンドの応答を待っています。

PROGRESS_DATATEXT

DATA コマンドに続くメッセージテキストの応答を待っています。

PROGRESS_QUIT

QUIT コマンドの応答を待っています。

PROGRESS_ERRORQUIT

メール送信が失敗した状態です。

PROGRESS_DONE

メール送信処理がすべて完了した状態です。

参照

SFXSMTPSender::GetProgress | SFXSMTPSender::SFXSMTPSender