SophiaFramework UNIVERSE 5.3 |
SFXPOP3Receiver クラスは、 POP3 メール受信を行うクラスです。
注意 | |
---|---|
このクラスは、SFXPOP3 クラスを使用して実装されています。 |
POP3 メール受信の手順
タイムアウトの制御 | |
---|---|
タイムアウトの制御は、アプリケーション側で行います。 |
前提条件 | |
---|---|
UIDL コマンドを実装した POP3 サーバーが前提となります。 |
例 837. SFXPOP3Receiver クラスを使用してメールを受信する方法
class MyClass { private: SFXPOP3Receiver _receiver; XALLBACK_DECLARE_SFXPOP3RECEIVER(POP3Callback) public: Void Start(Void); }; Void MyClass::Start(Void) { // POP3 サーバーのドメイン名(または IP アドレス)とポート番号を指定する: ドメイン名は自動解決される _receiver.SetServer(SFXSocketAddress("pop3server.example.com:110")); // ユーザー名とパスワードを設定する _receiver.SetAccount("user", "password"); // 受信したメールを POP3 サーバーから削除する場合は以下のコードを追加する // ※デフォルト設定では、受信したメールは POP3 サーバーから削除されない // _receiver.SetAutoDelete(true); // メールを受信する // ※ メール受信の結果は POP3Callback 関数に通知される if ((error = _receiver.Receive(XALLBACK_INTERNAL(POP3Callback))) != SFERR_NO_ERROR) { // error が SFERR_NO_ERROR でない場合はコールバックが戻らないので、 // ここでエラー処理をする } } // メール受信の結果が通知されるコールバック関数 XALLBACK_IMPLEMENT_SFXPOP3RECEIVER(MyClass, POP3Callback, error) { SInt32 i; if (error == SFERR_NO_ERROR) { //受信に成功した場合 // 受信したメールメッセージの配列(MailArray)を取得する SFXPOP3Receiver::MailArrayConstRef mailArray = receiver.GetReceivedMailArray(); // メールメッセージの数を表示する TRACE("received %d mails", mailArray.GetSize()); for (i = 0; i < mailArray.GetSize() ; i++) { SFXPOP3Receiver::MailInfoPtr minfo = mailArray[i]; // メールメッセージのサイズ、一意識別子、ヘッダーと本文を表示する TRACE("%d, %s, %s", minfo->size, minfo->uidl.GetCString(), minfo->mail.GetCString()); } } }
コンストラクタ/デストラクタ |
---|
SFXPOP3Receiver( Void ) SFXPOP3Receiver クラスのコンストラクタです。
|
~SFXPOP3Receiver( Void ) SFXPOP3Receiver クラスのデストラクタです。
|
パブリック関数 | |
---|---|
Void |
Cancel( Void ) POP3 メール受信をキャンセルします。
|
Void |
Clear( Void ) SFXPOP3Receiver インスタンスの内部変数を初期化します。
|
SFCError |
Delete(
CallbackSPP spp
, VoidPtr reference
) メールメッセージを削除します。
|
SFCError |
Delete(
SFXAnsiStringConstRef uidl
, CallbackSPP spp
, VoidPtr reference
) メールメッセージを削除します。
|
SFCError |
Delete(
UidlArrayPtr targetUidlArray
, Bool invertTarget
, CallbackSPP spp
, VoidPtr reference
) メールメッセージを削除します。
|
Bool |
GetAutoDelete( Void ) メール受信時に POP3 サーバーからメールメッセージを削除するか否かを取得します。
|
ProgressEnum |
GetProgress( Void ) POP3 メール受信の進行状態を表す定数を取得します。
|
MailArrayConstRef |
GetReceivedMailArray( Void ) 受信したメールメッセージ情報の配列を取得します。
|
SFXPOP3Ref |
GetSFXPOP3( Void ) 内部で保持している SFXPOP3 インスタンスを取得します。
|
Bool |
GetSSLMode( Void ) SSL 接続モードを取得します。
|
UInt32 |
GetTrustMode( Void ) SSL 認証モードを取得します。
|
SFCError |
Receive(
CallbackSPP spp
, VoidPtr reference
) メールメッセージを受信します。
|
SFCError |
Receive(
SFXAnsiStringConstRef targetUidl
, CallbackSPP spp
, VoidPtr reference
) メールメッセージを受信します。
|
SFCError |
Receive(
UidlArrayPtr targetUidlArray
, Bool invertTarget
, CallbackSPP spp
, VoidPtr reference
) メールメッセージを受信します。
|
SFCError |
SetAccount(
SFXAnsiStringConstRef user
, SFXAnsiStringConstRef password
, AuthEnum auth = AUTH_APOP_AND_USERPASS
) アカウント情報(ユーザー名、パスワード、POP3 認証方式)を設定します。
|
Void |
SetAutoDelete(
Bool isAutoDelete
) メール受信時に POP3 サーバーからメールメッセージを削除するか否かを設定します。
|
Void |
SetLimit(
UInt32 limit
) 受信するメールメッセージの制限数を設定します。
|
Void |
SetNumberOfLines(
SInt32 number
) 受信するメールメッセージの制限行を設定します。
|
Void |
SetSSLMode(
Bool isSSL
) SSL 接続のモードを設定します。
|
Void |
SetServer(
SFXSocketAddressConstRef server
) POP3 サーバーのドメイン名(または IP アドレス)とポート番号を設定します。
|
Void |
SetTrustMode(
UInt32 sslTrustMode
) SSL 認証モードを設定します。
|
型 |
---|
AuthEnum POP3 認証方式を表す定数です。
|
CallbackSPP POP3 メール受信・削除の結果が通知されるコールバック関数の型です。
|
MailArray メールメッセージ情報の配列です。
|
MailInfo メールメッセージ情報を表す構造体です。
|
ProgressEnum POP3 メール受信の進行状態を表す定数です。
|
UidlArray メールメッセージの一意識別子の配列を表す型です。
|
[ public, explicit ] SFXPOP3Receiver(Void);
このコンストラクタは、以下の初期化処理を行います。
注意 | |
---|---|
このコンストラクタでは、 POP3 メール受信に必要なリソースは割り当てられていません。 POP3 メール受信に必要なリソースは SFXPOP3Receiver::Receive 関数、 または SFXPOP3Receiver::Delete 関数を呼び出して POP3 サーバーに接続するときに確保されます。 |
このコンストラクタの内部実装は以下の通りです。
/*public */SFXPOP3Receiver::SFXPOP3Receiver(Void) : _state(STATE_STANDBY), _progress(PROGRESS_NONE), _line(-1), _limit(0), _targetUidlArray(null), _isAutoDelete(false), _deleteCandNum(0), _noUidl(false), _auth(AUTH_NONE), _numSizeList(null), _numUidlList(null), _isSSL(false), _sslTrustMode(SSL_TRUST_MODE_FAIL) { }// SFXPOP3Receiver::SFXPOP3Receiver //
SFXPOP3Receiver::Receive | SFXPOP3Receiver::Delete | SFXPOP3Receiver::SetAutoDelete | SFXPOP3Receiver::SetAccount | SFXPOP3Receiver::SetLimit | SFXPOP3Receiver::SetNumberOfLines | SFXPOP3Receiver::SetSSLMode | SFXPOP3Receiver::SetTrustMode | SFXPOP3Receiver::ProgressEnum | SFXPOP3Receiver::AuthEnum
[ public ] ~SFXPOP3Receiver(Void);
このデストラクタは、SFXPOP3Receiver::Cancel 関数を呼び出して POP3 メール受信をキャンセルしてからインスタンスを破棄します。
このデストラクタの内部実装は以下の通りです。
/*public */SFXPOP3Receiver::~SFXPOP3Receiver(Void) { Cancel(); }// SFXPOP3Receiver::~SFXPOP3Receiver //
[ public ] Void Cancel(Void);
この関数は、POP3 メール受信をキャンセルします。
具体的には、以下の処理を行います。
注意 | |
---|---|
この関数は、内部的に SFXPOP3Receiver::~SFXPOP3Receiver デストラクタから呼び出されます。 |
この関数の内部実装は以下の通りです。
/*public */Void SFXPOP3Receiver::Cancel(Void) { _state = STATE_STANDBY; _progress = PROGRESS_NONE; _spp = null; _reference = null; _pop3.Close(); Clear(); return; }// SFXPOP3Receiver::Cancel //
SFXPOP3Receiver::Receive | SFXPOP3Receiver::Delete | SFXPOP3::Close | SFXPOP3Receiver::Clear | SFXPOP3Receiver::~SFXPOP3Receiver | SFXPOP3Receiver::CallbackSPP | SFXPOP3Receiver::ProgressEnum
[ public ] Void Clear(Void);
この関数は、SFXPOP3Receiver インスタンスの内部変数を初期化します。
具体的には、以下の処理を行います。
注意 | |
---|---|
この関数は、内部的に SFXPOP3Receiver::Cancel 関数から呼び出されます。 |
この関数の内部実装は以下の通りです。
/*public */Void SFXPOP3Receiver::Clear(Void) { MailArray::Iterator itor; SFXAnsiStringPtr string; MailInfoPtr minfo; _server.Set(0, 0); _user.Clear(); _password.Clear(); itor = _receivedMailArray.GetFirstIterator(); while (itor.HasNext()) { minfo = itor.GetNext(); ::delete minfo; } _receivedMailArray.Clear(); FreeSingleUidl(); FreeNumSizeList(); FreeNumUidlList(); return; }// SFXPOP3Receiver::Clear // /*private */Void SFXPOP3Receiver::FreeNumSizeList(Void) { if (_numSizeList != null) { ::delete [] _numSizeList; _numSizeList = null; _numSizeCount = 0; } return; }// SFXPOP3Receiver::FreeNumSizeList // /*private */Void SFXPOP3Receiver::FreeNumUidlList(Void) { if (_numUidlList != null) { ::delete [] _numUidlList; _numUidlList = null; _numUidlCount = 0; } return; }// SFXPOP3Receiver::FreeNumUidlList // /*private */Void SFXPOP3Receiver::FreeSingleUidl(Void) { UidlArray::Iterator itor; if (!.IsEmpty()) { itor = _singleUidlArray.GetFirstIterator(); while (itor.HasNext()) { ::delete itor.GetNext(); } _singleUidlArray.Clear(); } return; }// SFXPOP3Receiver::FreeSingleUidl //
[ public ] SFCError Delete( CallbackSPP spp // [入力] POP3 メール削除の結果が通知されるコールバック関数 VoidPtr reference // [入力] コールバック関数に渡すデータ(参照値) );
[ public ] SFCError Delete( SFXAnsiStringConstRef uidl // [入力] 削除するメールメッセージの一意識別子 CallbackSPP spp // [入力] POP3 メール削除完了が通知されるコールバック関数 VoidPtr reference // [入力] コールバック関数に渡すデータ(参照値) );
[ public ] SFCError Delete( UidlArrayPtr targetUidlArray // [入力] ターゲットとなるメールメッセージの一意識別子の配列 Bool invertTarget // [入力] targetUidlArray 引数に指定した以外のメールメッセージを削除するかどうか CallbackSPP spp // [入力] POP3 メール削除完了が通知されるコールバック関数 VoidPtr reference // [入力] コールバック関数に渡すデータ(参照値) );
削除するメールメッセージの一意識別子を指定します。
ターゲットとなるメールメッセージの一意識別子の配列を指定します。
null を指定した場合、POP3 サーバーにある全てのメールメッセージを指定したことになります。
デフォルトは null です。
targetUidlArray 引数に指定したメールメッセージ以外のメールメッセージを削除するかを指定します。
false の場合、targetUidlArray 引数に指定したメールメッセージを削除します。
true の場合、targetUidlArray 引数に指定した以外のメールメッセージを削除します。
デフォルトは false です。
POP3 メール削除完了が通知されるコールバック関数を指定します。
コールバック関数に渡すデータ(参照値)を指定します。
この関数は、引数に指定されたメールメッセージを POP3 サーバーから削除します。
POP3 メール削除処理の結果 | |
---|---|
POP3 メール削除処理の結果は、spp 引数に指定したコールバック関数に通知されます。 この関数の戻り値には反映されません。 |
メールメッセージの一意識別子について | |
---|---|
メールメッセージの一意識別子の詳細は RFC1939: UIDL Command を参照してください。 |
この関数の内部実装は以下の通りです。
/*public */SFCError SFXPOP3Receiver::Delete(UidlArrayPtr targetUidlArray, Bool invertTarget, CallbackSPP spp, VoidPtr reference) { SFCError error; if (_state == STATE_STANDBY) { _targetUidlArray = targetUidlArray; _invertTarget = invertTarget; _spp = spp; _reference = reference; _pop3.Close(); if ((error = _pop3.Open()) == SFERR_NO_ERROR) { _pop3.SetSSLMode(_isSSL); if ((error = _pop3.SetTrustMode(_sslTrustMode)) == SFERR_NO_ERROR) { if ((error = _pop3.Connect(_server, XALLBACK_INTERNAL(OnPOP3Delete))) == SFERR_NO_ERROR) { _state = STATE_RECEIVING; _progress = PROGRESS_CONNECT; } } if (error != SFERR_NO_ERROR) { _pop3.Close(); } } } else { error = SFERR_INVALID_STATE; } return error; }// SFXPOP3Receiver::Delete // /*private */XALLBACK_IMPLEMENT_SFXPOP3(SFXPOP3Receiver, OnPOP3Delete, error) { Bool next; if (error == SFERR_NO_ERROR) { switch (_progress) { case PROGRESS_CONNECT: error = ProceedConnect(); break; case PROGRESS_USER: error = ProceedUser(); break; case PROGRESS_PASS: error = ProceedPass(); break; case PROGRESS_LIST: error = ProceedList(); break; case PROGRESS_UIDL: error = ProceedUidl(false); break; case PROGRESS_DELE: if (_pop3.IsResponseOk()) { if ((error = DeleteNextMail(&next)) == SFERR_NO_ERROR) { if (!next) { _progress = PROGRESS_QUIT; error = _pop3.SendQuitCommand(); } } } else { error = SFERR_FAILED; } break; case PROGRESS_QUIT: if (_pop3.IsResponseOk()) { _progress = PROGRESS_DONE; Finish(SFERR_NO_ERROR); } else { error = SFERR_FAILED; } break; case PROGRESS_RETR: case PROGRESS_TOP: case PROGRESS_DONE: case PROGRESS_NONE: default: error = SFERR_FAILED; break; } } if (error != SFERR_NO_ERROR) { Finish(error); } return; }// XALLBACK_IMPLEMENT_SFXPOP3(SFXPOP3Receiver, OnPOP3, error) // /*private */SFCError SFXPOP3Receiver::ProceedConnect(Void) { SFCError error; if (_auth == AUTH_NONE || _user.IsEmpty() && _password.IsEmpty()) { // skip user authorization _progress = PROGRESS_LIST; error = _pop3.SendListCommand(); } else { error = SendAuthCommand(); } return error; }// SFXPOP3Receiver::ProceedConnect // /*private */SFCError SFXPOP3Receiver::ProceedUser(Void) { SFCError error; if (_pop3.IsResponseOk()) { _progress = PROGRESS_PASS; error = _pop3.SendPassCommand(_password); } else { error = SFERR_FAILED; } return error; }// SFXPOP3Receiver::ProceedUser // /*private */SFCError SFXPOP3Receiver::ProceedPass(Void) { SFCError error; if (_pop3.IsResponseOk()) { _progress = PROGRESS_LIST; error = _pop3.SendListCommand(); } else { if (_apop && _auth == AUTH_APOP_AND_USERPASS) { // The server does not support APOP. _apop = false; _progress = PROGRESS_USER; error = _pop3.SendUserCommand(_user); } else { error = SFERR_MAIL_INVALID_PASSWORD; } } return error; }// SFXPOP3Receiver::ProceedPass // /*private */SFCError SFXPOP3Receiver::ProceedList(Void) { SFCError error; if (_pop3.IsResponseOk()) { FreeNumSizeList(); if ((error = _pop3.GetListResponse(&_numSizeList, &_numSizeCount)) == SFERR_NO_ERROR) { if (_numSizeCount > 0) { _progress = PROGRESS_UIDL; error = _pop3.SendUidlCommand(); } else { _progress = PROGRESS_QUIT; error = _pop3.SendQuitCommand(); } } } else { error = SFERR_FAILED; } return error; }// SFXPOP3Receiver::ProceedList // /*private */SFCError SFXPOP3Receiver::ProceedUidl(Bool receiving) { SFCError error(SFERR_NO_ERROR); Bool nextMail(false); if (!_pop3.IsResponseOk()) { if (_targetUidlArray == null && !_invertTarget) { _noUidl = true; // The server is not support uidl command. } else { error = SFERR_MAIL_NOT_SUPPORT_UIDL; } } if (error == SFERR_NO_ERROR) { FreeNumUidlList(); if (!_noUidl) { error = _pop3.GetUidlResponse(&_numUidlList, &_numUidlCount); } else { _numUidlCount = _numSizeCount; } if (error == SFERR_NO_ERROR) { if (!receiving || _numUidlCount > 0) { _index = 0; _numSizeIndex = 0; error = (receiving) ? (ReceiveNextMail(&nextMail)) : (DeleteNextMail(&nextMail)); } if (error == SFERR_NO_ERROR) { if (!nextMail) { error = _pop3.SendQuitCommand(); } } } } return error; }// SFXPOP3Receiver::ProceedUidl // /*private */SFCError SFXPOP3Receiver::DeleteNextMail(BoolPtr next) { SFCError error(SFERR_NO_ERROR); SInt32 number; if ((number = FindNextTarget()) > -1) { _progress = PROGRESS_DELE; error = _pop3.SendDeleCommand(number); *next = true; } else { *next = false; } return error; }// SFXPOP3Receiver::DeleteNextMail // /*private */SFCError SFXPOP3Receiver::SendAuthCommand(Void) { SFCError error(SFERR_NO_ERROR); SFXAnsiString challenge; SInt32 start, end; switch (_auth) { case AUTH_APOP_AND_USERPASS: case AUTH_ONLY_APOP: _apop = true; _progress = PROGRESS_PASS; if ((error = challenge.Set(_pop3.GetResponseText())) == SFERR_NO_ERROR) { if ((start = challenge.FirstIndexOf('<')) >= 0) { if ((end = challenge.LastIndexOf('>')) >= 0) { error = _pop3.SendApopCommand(_user, _password, challenge.Substring(start, end)); } else { error = SFERR_FAILED; } } else { error = SFERR_FAILED; } } break; case AUTH_ONLY_USERPASS: _progress = PROGRESS_USER; error = _pop3.SendUserCommand(_user); break; case AUTH_NONE: default: break; } return error; }// SFXPOP3Receiver::SendAuthCommand // /*private */SFCError SFXPOP3Receiver::SetSingleUidl(SFXAnsiStringConstRef uidl) { SFCError error; SFXAnsiStringPtr string; FreeSingleUidl(); if ((string = ::new SFXAnsiString(uidl)) != null) { if ((error = _singleUidlArray.InsertLast(string)) != SFERR_NO_ERROR) { ::delete string; } } else { error = SFERR_NO_MEMORY; } return error; }// SFXPOP3Receiver::SetSingleUidl // /*private */Void SFXPOP3Receiver::Finish(SFCError error) { _state = STATE_STANDBY; FreeNumSizeList(); FreeNumUidlList(); _pop3.Close(); if (_spp != null) { _spp(error, _reference); } return; }// SFXPOP3Receiver::Finish //
[ public, const ] Bool GetAutoDelete(Void);
メール受信時に POP3 サーバーからメールメッセージを削除するか否か(Bool 値)
この関数は、メール受信時に POP3 サーバーからメールメッセージを削除するか否かを取得します。
注意 | |
---|---|
SFXPOP3Receiver::Receive 関数を使用して受信したメールメッセージを POP3 サーバーから削除するか否かを取得します。 |
この関数の内部実装は以下の通りです。
/*public */inline Bool SFXPOP3Receiver::GetAutoDelete(Void) const { return _isAutoDelete; }// SFXPOP3Receiver::GetAutoDelete //
[ public, const ] ProgressEnum GetProgress(Void);
POP3 メール受信の進行状態を表す定数(SFXPOP3Receiver::ProgressEnum の何れかの定数)。
この関数は、POP3 メール受信の進行状態を表す定数を取得します。
注意 | |
---|---|
POP3 メール受信が失敗したときにコールバック関数内でこの関数を呼び出すと、 エラーが発生した段階を取得できます。 |
この関数の内部実装は以下の通りです。
/*public */inline SFXPOP3Receiver::ProgressEnum SFXPOP3Receiver::GetProgress(Void) const { return _progress; }// SFXPOP3Receiver::GetProgress //
[ public, const ] MailArrayConstRef GetReceivedMailArray(Void);
受信したメールメッセージ情報の配列(SFXPOP3Receiver::MailArray)
この関数は、受信したメールメッセージ情報の配列(SFXPOP3Receiver::MailInfo へのポインタ) の配列(SFXPOP3Receiver::MailArray)を取得します。
注意 | |
---|---|
この関数は、SFXPOP3Receiver::Receive 関数の spp 引数に指定するメール受信完了が通知されるコールバック関数内で呼び出します。 |
この関数の内部実装は以下の通りです。
/*public */inline SFXPOP3Receiver::MailArrayConstRef SFXPOP3Receiver::GetReceivedMailArray(Void) const { return _receivedMailArray; }// SFXPOP3Receiver::GetReceivedMailArray //
[ public ] SFXPOP3Ref GetSFXPOP3(Void);
内部で保持している SFXPOP3 インスタンス
この関数は、内部で保持している SFXPOP3 インスタンスを取得します。
この関数の内部実装は以下の通りです。
/*public */inline SFXPOP3Ref SFXPOP3Receiver::GetSFXPOP3(Void) { return _pop3; }// SFXPOP3Receiver::GetSFXPOP3 //
[ public, const ] Bool GetSSLMode(Void);
この関数は、SSL 接続モードを取得します。
この関数の内部実装は以下の通りです。
/*public */inline Bool SFXPOP3Receiver::GetSSLMode(Void) const { return _isSSL; }// SFXPOP3Receiver::GetSSLMode //
[ public, const ] UInt32 GetTrustMode(Void);
SSL 認証モード
この関数は、POP3 メール受信の SSL 認証モードを取得します。
以下の 4 種類の SSL 認証モードの何れかが返却されます。
この関数の内部実装は以下の通りです。
/*public */inline UInt32 SFXPOP3Receiver::GetTrustMode(Void) const { return _sslTrustMode; }// SFXPOP3Receiver::GetTrustMode //
[ public ] SFCError Receive( CallbackSPP spp // [入力] POP3 メール受信の結果が通知されるコールバック関数 VoidPtr reference // [入力] コールバック関数に渡すデータ(参照値) );
[ public ] SFCError Receive( SFXAnsiStringConstRef targetUidl // [入力] 受信するメールメッセージの一意識別子 CallbackSPP spp // [入力] POP3 メール受信完了が通知されるコールバック関数 VoidPtr reference // [入力] コールバック関数に渡すデータ(参照値) );
[ public ] SFCError Receive( UidlArrayPtr targetUidlArray // [入力] ターゲットとなるメールメッセージの一意識別子の配列 Bool invertTarget // [入力] targetUidlArray 引数に指定した以外のメールメッセージを取得するかどうか CallbackSPP spp // [入力] POP3 メール受信完了が通知されるコールバック関数 VoidPtr reference // [入力] コールバック関数に渡すデータ(参照値) );
受信するメールメッセージの一意識別子を指定します。
ターゲットとなるメールメッセージの一意識別子の配列を指定します。
null を指定した場合、POP3 サーバーにある全てのメールメッセージを指定したことになります。
デフォルトは null です。
targetUidlArray 引数に指定したメールメッセージ以外のメールメッセージを受信するかを指定します。
false の場合、targetUidlArray 引数に指定したメールメッセージを受信します。
true の場合、targetUidlArray 引数に指定した以外のメールメッセージを受信します。
デフォルトは false です。
POP3 メール受信完了が通知されるコールバック関数を指定します。
コールバック関数に渡すデータ(参照値)を指定します。
この関数は、引数に指定されたメールメッセージを POP3 サーバーから受信します。
注意 | |
---|---|
受信したメールメッセージは、 SFXPOP3Receiver::GetReceivedMailArray 関数で得られる SFXPOP3Receiver::MailInfo の配列から取得します。 |
POP3 メール受信処理の結果 | |
---|---|
POP3 メール受信処理の結果は、spp 引数に指定されたコールバック関数に通知されます。 この関数の戻り値には反映されません。 |
メールメッセージの一意識別子について | |
---|---|
メールメッセージの一意識別子の詳細は RFC1939: UIDL Command を参照してください。 |
この関数の内部実装は以下の通りです。
/*public */SFCError SFXPOP3Receiver::Receive(UidlArrayPtr targetUidlArray, Bool invertTarget, CallbackSPP spp, VoidPtr reference) { SFCError error; if (_state == STATE_STANDBY) { _targetUidlArray = targetUidlArray; _invertTarget = invertTarget; _apop = false; _spp = spp; _reference = reference; _pop3.Close(); if ((error = _pop3.Open()) == SFERR_NO_ERROR) { _pop3.SetSSLMode(_isSSL); if ((error = _pop3.SetTrustMode(_sslTrustMode)) == SFERR_NO_ERROR) { if ((error = _pop3.Connect(_server, XALLBACK_INTERNAL(OnPOP3Receive))) == SFERR_NO_ERROR) { _state = STATE_RECEIVING; _progress = PROGRESS_CONNECT; } } if (error != SFERR_NO_ERROR) { _pop3.Close(); } } } else { error = SFERR_INVALID_STATE; } return error; }// SFXPOP3Receiver::Receive // /*private */XALLBACK_IMPLEMENT_SFXPOP3(SFXPOP3Receiver, OnPOP3Receive, error) { Bool next; if (error == SFERR_NO_ERROR) { switch (_progress) { case PROGRESS_CONNECT: error = ProceedConnect(); break; case PROGRESS_USER: error = ProceedUser(); break; case PROGRESS_PASS: error = ProceedPass(); break; case PROGRESS_LIST: error = ProceedList(); break; case PROGRESS_UIDL: error = ProceedUidl(true); break; case PROGRESS_RETR: case PROGRESS_TOP: error = ProceedReceivingRetr(); break; case PROGRESS_DELE: if (_pop3.IsResponseOk()) { if ((error = ReceiveNextMail(&next)) == SFERR_NO_ERROR) { if (!next) { _progress = PROGRESS_QUIT; error = _pop3.SendQuitCommand(); } } } else { error = SFERR_FAILED; } break; case PROGRESS_QUIT: if (_pop3.IsResponseOk()) { _progress = PROGRESS_DONE; Finish(SFERR_NO_ERROR); } else { error = SFERR_FAILED; } break; case PROGRESS_DONE: case PROGRESS_NONE: default: error = SFERR_FAILED; break; } } if (error != SFERR_NO_ERROR) { Finish(error); } return; }// XALLBACK_IMPLEMENT_SFXPOP3(SFXPOP3Receiver, OnPOP3, error) // /*private */SFCError SFXPOP3Receiver::ProceedConnect(Void) { SFCError error; if (_auth == AUTH_NONE || _user.IsEmpty() && _password.IsEmpty()) { // skip user authorization _progress = PROGRESS_LIST; error = _pop3.SendListCommand(); } else { error = SendAuthCommand(); } return error; }// SFXPOP3Receiver::ProceedConnect // /*private */SFCError SFXPOP3Receiver::ProceedUser(Void) { SFCError error; if (_pop3.IsResponseOk()) { _progress = PROGRESS_PASS; error = _pop3.SendPassCommand(_password); } else { error = SFERR_FAILED; } return error; }// SFXPOP3Receiver::ProceedUser // /*private */SFCError SFXPOP3Receiver::ProceedPass(Void) { SFCError error; if (_pop3.IsResponseOk()) { _progress = PROGRESS_LIST; error = _pop3.SendListCommand(); } else { if (_apop && _auth == AUTH_APOP_AND_USERPASS) { // The server does not support APOP. _apop = false; _progress = PROGRESS_USER; error = _pop3.SendUserCommand(_user); } else { error = SFERR_MAIL_INVALID_PASSWORD; } } return error; }// SFXPOP3Receiver::ProceedPass // /*private */SFCError SFXPOP3Receiver::ProceedList(Void) { SFCError error; if (_pop3.IsResponseOk()) { FreeNumSizeList(); if ((error = _pop3.GetListResponse(&_numSizeList, &_numSizeCount)) == SFERR_NO_ERROR) { if (_numSizeCount > 0) { _progress = PROGRESS_UIDL; error = _pop3.SendUidlCommand(); } else { _progress = PROGRESS_QUIT; error = _pop3.SendQuitCommand(); } } } else { error = SFERR_FAILED; } return error; }// SFXPOP3Receiver::ProceedList // /*private */SFCError SFXPOP3Receiver::ProceedUidl(Bool receiving) { SFCError error(SFERR_NO_ERROR); Bool nextMail(false); if (!_pop3.IsResponseOk()) { if (_targetUidlArray == null && !_invertTarget) { _noUidl = true; // The server is not support uidl command. } else { error = SFERR_MAIL_NOT_SUPPORT_UIDL; } } if (error == SFERR_NO_ERROR) { FreeNumUidlList(); if (!_noUidl) { error = _pop3.GetUidlResponse(&_numUidlList, &_numUidlCount); } else { _numUidlCount = _numSizeCount; } if (error == SFERR_NO_ERROR) { if (!receiving || _numUidlCount > 0) { _index = 0; _numSizeIndex = 0; error = (receiving) ? (ReceiveNextMail(&nextMail)) : (DeleteNextMail(&nextMail)); } if (error == SFERR_NO_ERROR) { if (!nextMail) { error = _pop3.SendQuitCommand(); } } } } return error; }// SFXPOP3Receiver::ProceedUidl // /*private */SFCError SFXPOP3Receiver::ProceedReceivingRetr(Void) { SFCError error(SFERR_NO_ERROR); MailInfoPtr minfo; Bool next; if (_pop3.IsResponseOk()) { if ((minfo = ::new MailInfo) != null) { if ((error = _receivedMailArray.InsertLast(minfo)) == SFERR_NO_ERROR) { minfo->size = _nextMailInfo.size; if ((error = minfo->uidl.Set(_nextMailInfo.uidl)) == SFERR_NO_ERROR) { if (_progress == PROGRESS_RETR) { error = _pop3.GetRetrResponse(&minfo->mail); } else { error = _pop3.GetTopResponse(&minfo->mail); } if (error == SFERR_NO_ERROR) { ++_index; if (_isAutoDelete) { _progress = PROGRESS_DELE; error = _pop3.SendDeleCommand(_deleteCandNum); } else { if ((error = ReceiveNextMail(&next)) == SFERR_NO_ERROR) { if (!next) { _progress = PROGRESS_QUIT; error = _pop3.SendQuitCommand(); } } } } } } if (error != SFERR_NO_ERROR) { ::delete minfo; } } else { error = SFERR_NO_MEMORY; } } else { error = SFERR_FAILED; } return error; }// SFXPOP3Receiver::ProceedReceivingRetr // /*private */SFCError SFXPOP3Receiver::ReceiveNextMail(BoolPtr next) { SFCError error(SFERR_NO_ERROR); SInt32 number; if (_limit > 0 && _index >= _limit) { *next = false; } else { if ((number = FindNextTarget()) > -1) { _deleteCandNum = number; if (_line < 0) { _progress = PROGRESS_RETR; error = _pop3.SendRetrCommand(number); } else { _progress = PROGRESS_TOP; error = _pop3.SendTopCommand(number, _line); } *next = true; } else { *next = false; } } return error; }// SFXPOP3Receiver::ReceiveNextMail // /*private */SFCError SFXPOP3Receiver::SendAuthCommand(Void) { SFCError error(SFERR_NO_ERROR); SFXAnsiString challenge; SInt32 start, end; switch (_auth) { case AUTH_APOP_AND_USERPASS: case AUTH_ONLY_APOP: _apop = true; _progress = PROGRESS_PASS; if ((error = challenge.Set(_pop3.GetResponseText())) == SFERR_NO_ERROR) { if ((start = challenge.FirstIndexOf('<')) >= 0) { if ((end = challenge.LastIndexOf('>')) >= 0) { error = _pop3.SendApopCommand(_user, _password, challenge.Substring(start, end)); } else { error = SFERR_FAILED; } } else { error = SFERR_FAILED; } } break; case AUTH_ONLY_USERPASS: _progress = PROGRESS_USER; error = _pop3.SendUserCommand(_user); break; case AUTH_NONE: default: break; } return error; }// SFXPOP3Receiver::SendAuthCommand // /*private */SFCError SFXPOP3Receiver::SetSingleUidl(SFXAnsiStringConstRef uidl) { SFCError error; SFXAnsiStringPtr string; FreeSingleUidl(); if ((string = ::new SFXAnsiString(uidl)) != null) { if ((error = _singleUidlArray.InsertLast(string)) != SFERR_NO_ERROR) { ::delete string; } } else { error = SFERR_NO_MEMORY; } return error; }// SFXPOP3Receiver::SetSingleUidl // /*private */Void SFXPOP3Receiver::Finish(SFCError error) { _state = STATE_STANDBY; FreeNumSizeList(); FreeNumUidlList(); _pop3.Close(); if (_spp != null) { _spp(error, _reference); } return; }// SFXPOP3Receiver::Finish //
SFXPOP3Receiver::GetReceivedMailArray | SFXPOP3Receiver::Delete | SFXPOP3Receiver::MailInfo | SFXPOP3Receiver::CallbackSPP | SFXPOP3Receiver::SFXPOP3Receiver | RFC1939: UIDL Command
[ public ] SFCError SetAccount( SFXAnsiStringConstRef user // [入力] ユーザー名 SFXAnsiStringConstRef password // [入力] パスワード AuthEnum auth = AUTH_APOP_AND_USERPASS // [入力] POP3 認証方式 );
ユーザー名を指定します。
パスワードを指定します。
POP3 認証方式を指定します。 デフォルトは AUTH_APOP_AND_USERPASS です。
この関数は、アカウント情報(ユーザー名、パスワード、認証方式)を設定します。
auth 引数に指定する POP3 認証方式のデフォルト値は、AUTH_APOP_AND_USERPASS です。 設定可能な値については、SFXPOP3Receiver::AuthEnum を参照してください。
注意 | |
---|---|
この関数は、 SFXPOP3Receiver::Receive 関数、または SFXPOP3Receiver::Delete 関数を呼び出す前に使います。 |
この関数の内部実装は以下の通りです。
/*public */SFCError SFXPOP3Receiver::SetAccount(SFXAnsiStringConstRef user, SFXAnsiStringConstRef password, AuthEnum auth) { SFCError error; if ((error = _user.Set(user)) == SFERR_NO_ERROR) { if ((error = _password.Set(password)) == SFERR_NO_ERROR) { _auth = auth; } } return error; }// SFXPOP3Receiver::SetAccount //
SFXPOP3Receiver::SetServer | SFXPOP3Receiver::Receive | SFXPOP3Receiver::Delete | SFXPOP3Receiver::AuthEnum
この関数は、メール受信時に POP3 サーバーからメールメッセージを削除するか否かを設定します。
デフォルト値: false(デフォルトの設定では、メール受信時に POP3 サーバーからメールメッセージは削除されません)。
注意 | |
---|---|
SFXPOP3Receiver::Receive 関数を使用して受信したメールメッセージを POP3 サーバーから削除するか否かを設定します。 |
この関数の内部実装は以下の通りです。
/*public */inline Void SFXPOP3Receiver::SetAutoDelete(Bool isAutoDelete) { _isAutoDelete = isAutoDelete; return; }// SFXPOP3Receiver::SetAutoDelete //
この関数は、受信するメールメッセージの制限数を設定します。
デフォルト値: 0(受信するメールメッセージの数を制限しない)
注意 | |
---|---|
この関数で制限した数までのメールメッセージを受信できます。 0 を設定した場合は、無制限にメールメッセージを受信できます。 |
この関数の内部実装は以下の通りです。
/*public */inline Void SFXPOP3Receiver::SetLimit(UInt32 limit) { _limit = limit; }// SFXPOP3Receiver::SetLimit //
この関数は、受信するメールメッセージの制限行を設定します。
デフォルト値: -1(行数を制限しない)
注意 | |
---|---|
先頭からこの関数で設定した行数だけメールメッセージを受信します。 -1 を設定した場合は、メールメッセージのすべての行を受信します。 |
この関数の内部実装は以下の通りです。
/*public */inline Void SFXPOP3Receiver::SetNumberOfLines(SInt32 number) { _line = number; }// SFXPOP3Receiver::SetNumberOfLines //
この関数は、SSL 接続モードを設定します。
デフォルト値: false(SSL 接続モードは OFF)
注意 | |
---|---|
SSL 接続モードを ON する場合、isSSL 引数に true を指定します。 |
この関数の内部実装は以下の通りです。
/*public */inline Void SFXPOP3Receiver::SetSSLMode(Bool isSSL) { _isSSL = isSSL; return; }// SFXPOP3Receiver::SetSSLMode //
[ public ] Void SetServer( SFXSocketAddressConstRef server // [入力] POP3 サーバーのドメイン名(または IP アドレス)とポート番号 );
POP3 サーバーのドメイン名(または IP アドレス)とポート番号を指定します。
この関数は、POP3 サーバーのドメイン名(または IP アドレス)とポート番号を設定します。
注意 | |
---|---|
この関数は SFXPOP3Receiver::Receive / SFXPOP3Receiver::Delete 関数よりも前に呼び出して POP3 サーバーのドメイン名(または IP アドレス)とポート番号を設定する必要があります。 ※ ドメイン名の解決は自動的に行われます。 |
この関数の内部実装は以下の通りです。
/*public */inline Void SFXPOP3Receiver::SetServer(SFXSocketAddressConstRef server) { _server.Set(server); }// SFXPOP3Receiver::SetServer //
SFXPOP3Receiver::Receive | SFXPOP3Receiver::Delete | SFXPOP3Receiver::SFXPOP3Receiver | SFXSocketAddress
以下の 4 種類の何れかの SSL 認証モードを指定します。
この関数は、POP3 メール受信の SSL 認証モードを設定します。
デフォルト値: SSL_TRUST_MODE_FAIL
設定可能な SSL 認証モードは、 以下の 4 種類です(参照: BREW API ISSL_NegotiateV)。
設定された値は、 SFXPOP3Receiver::Cancel 関数が呼び出されるまで有効です。
注意 | |
---|---|
詳細情報: BREW API ISSL_NegotiateV |
この関数の内部実装は以下の通りです。
/*public */inline Void SFXPOP3Receiver::SetTrustMode(UInt32 sslTrustMode) { _sslTrustMode = sslTrustMode; return; }// SFXPOP3Receiver::SetTrustMode //
SFXPOP3Receiver::Cancel | SFXPOP3Receiver::SFXPOP3Receiver | SFXSSLSocket::SetTrustMode | BREW API ISSL_NegotiateV
enum AuthEnum { AUTH_NONE = 0, // 認証を行いません。 AUTH_APOP_AND_USERPASS, // APOP 認証を行います。APOP 認証に失敗した場合は、通常の user-password 認証を行います。 AUTH_ONLY_APOP, // APOP 認証だけを行います。 AUTH_ONLY_USERPASS // 通常の user-password 認証だけを行います。 };
POP3 認証方式を表す定数です。
SFXPOP3Receiver::SetAccount 関数を使用して 以下の POP3 認証方式の定数を指定できます。 SFXPOP3Receiver::SetAccount 関数の auth 引数に何も指定しなかった場合は、 AUTH_APOP_AND_USERPASS が設定されます。
認証を行いません。
APOP 認証を行います。APOP 認証に失敗した場合は、通常の user-password 認証を行います。
APOP 認証だけを行います。
通常の user-password 認証だけを行います。
typedef Void(* SFXPOP3Receiver::CallbackSPP)(SFCError error, VoidPtr reference)
POP3 メール受信・削除の結果が通知されるコールバック関数の型です。
このコールバック関数は SFXPOP3Receiver::Receive または SFXPOP3Receiver::Delete 関数を使用して登録します。
POP3 メール受信・削除処理の結果は、このコールバック関数に通知されます。
第 1 引数の error には、 POP3 メール受信・削除に成功した場合は SFERR_NO_ERROR、失敗した場合はその他のエラーコードが渡されます。
第 2 引数の reference には、SFXPOP3Receiver::Receive または SFXPOP3Receiver::Delete 関数の reference 引数に指定した値 (通常、SFXPOP3Receiver インスタンス: this)が渡されます。
注意 | |
---|---|
受信したメール情報は、 このコールパック関数内で SFXPOP3Receiver::GetReceivedMailArray 関数を呼び出して取得します。 POP3 メール受信・削除処理のどの段階でエラーが発生したかは、 コールバック関数内で SFXPOP3Receiver::GetProgress 関数を使用して取得できます。 |
SFXPOP3Receiver | SFXPOP3Receiver::Receive | SFXPOP3Receiver::Delete | SFXPOP3Receiver::GetReceivedMailArray | SFXPOP3Receiver::GetProgress
SFMTYPEDEFALIAS(SFXArray<MailInfoPtr>, MailArray)
struct MailInfo { UInt32 size; // メールメッセージのサイズ SFXAnsiString uidl; // メールメッセージの一意識別子 SFXAnsiString mail; // メールメッセージのデータ };
メールメッセージ情報を表す構造体です。
size はメールメッセージのサイズ、uidl はメールメッセージの一意識別子、mail はメールメッセージのデータを表します。
mail に格納されるメールのデータ | |
---|---|
mail に格納されるメールメッセージのデータは、ヘッダーのフィールド値は B エンコードまたは Q エンコードされ、 本体、プリアンブル、エピローグ部分は JIS コードでエンコードされています。 マルチパートメッセージのそれら以外の本体部分は、Base64 または Quoted-Printable でエンコードされています。 SFXMailMessage::Parse 関数を使用してメールメッセージのデータを解析してから、 SFXMailMessage::GetSubjectField 関数や SFXMailMessage::GetBody 関数などを利用して件名や本文などを取得します (このとき、JIS コードから Shift_JIS コードへの文字コード変換は自動的に行われます)。 |
メールメッセージの一意識別子について | |
---|---|
メールメッセージの一意識別子の詳細は RFC1939: UIDL Command を参照してください。 |
SFXPOP3Receiver::GetReceivedMailArray | SFXMailMessage::Parse | SFXMailMessage | RFC1939: UIDL Command
enum ProgressEnum { PROGRESS_NONE, = 0, // 接続は開始されていません。 PROGRESS_CONNECT, // POP3 サーバーに接続中です。 PROGRESS_USER, // USER コマンドの応答を待っています。 PROGRESS_PASS, // PASS コマンドの応答を待っています。 PROGRESS_LIST, // LIST コマンドの応答を待っています。 PROGRESS_UIDL, // UIDL コマンドの応答を待っています。 PROGRESS_TOP, // TOP コマンドの応答を待っています。 PROGRESS_RETR, // RETR コマンドの応答を待っています。 PROGRESS_DELE, // DELE コマンドの応答を待っています。 PROGRESS_QUIT, // QUIT コマンドの応答を待っています。 PROGRESS_DONE // メール受信処理がすべて完了した状態です。 };
SFXPOP3Receiver クラスによる POP3 メール受信の進行状態を表す定数です。
SFXPOP3Receiver::GetProgress 関数を使用して以下の POP3 メール受信の進行状態を表す定数を取得できます。
接続は開始されていません。
POP3 サーバーに接続中です。
USER コマンドの応答を待っています。
PASS コマンドの応答を待っています。
LIST コマンドの応答を待っています。
UIDL コマンドの応答を待っています。
RETR コマンドの応答を待っています。
TOP コマンドの応答を待っています。
DELE コマンドの応答を待っています。
QUIT コマンドの応答を待っています。
メール受信処理がすべて完了した状態です。
SFMTYPEDEFALIAS(SFXArray<SFXAnsiStringPtr>, UidlArray)
メールメッセージの一意識別子の配列を表す型です。
注意 | |
---|---|
SFXArray<SFXAnsiStringPtr> と同じです。 |
メールメッセージの一意識別子について | |
---|---|
メールメッセージの一意識別子の詳細は RFC1939: UIDL Command を参照してください。 |
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |