BREW メーラー 〜 BREW C++ POP/SMTP プログラミング 〜
メールの受信
メールを受信するには SFXPOP3Receiver クラスを使います。
メールの受信は MainWindow の「メール受信」ボタンのハンドラで処理します。
アカウントとサーバを設定してから、Receive 関数でメールを受信します。
メールの受信と削除を同時に行う場合は ReceiveAndDelete 関数を使います。
Receive 関数、または ReceiveAndDelete 関数のパラメーターには、受信完了時に呼び出されるコールバック関数 ( POP3Callback ) を設定します。
HANDLER_IMPLEMENT_VOIDCONTROL(MainWindow, OnButtonControl2, result, control) { // メールの受信準備と受信開始 SFCError error; SFXConfigPtr option = SimpleMailer::GetOption(); // アカウント (ユーザーとパスワード) の設定 _receiver.SetAccount(option->ReadSFXAnsiString(OPTION_USER, ""), option->ReadSFXAnsiString(OPTION_PASSWORD, "") ,SFXPOP3Receiver::AUTH_ONLY_USERPASS );
//SFXPOP3Receiver::AUTH_ONLY_USERPASS はパスワード認証方法、サーバによって違います。
//この例は yahoo.co.jp のメールサーバです // 受信用メールサーバとポート番号の指定 (ドメインは自動解決) _receiver.SetServer(SFXSocketAddress( option->ReadSFXAnsiString(OPTION_POP3SERVER, ""), option->ReadUInt16(OPTION_POP3PORT, 110))); // メールを受信 & コールバック関数 POP3Callback を登録 // SSL接続使用、認証方法設定
Bool UseSSL=option->ReadBool(OPTION_USESSL, false);
_receiver.SetSSLMode(UseSSL);
if (UseSSL)
{
SInt16 trustmode=option->ReadSInt16(OPTION_SSLTRUSTMODE,0);
switch (trustmode)
{
case 0:
default:
_receiver.SetTrustMode(SSL_TRUST_MODE_FAIL);
break;
case 1:
_receiver.SetTrustMode(SSL_TRUST_MODE_CHECK);
break;
case 2:
_receiver.SetTrustMode(SSL_TRUST_MODE_IGNORE);
break;
case 3:
_receiver.SetTrustMode(SSL_TRUST_MODE_ALWAYS);
break;
}
} // 受信したメールを削除するかどうか if (option->ReadBool(OPTION_ERASEMAIL, false)) { // 受信 error = _receiver.Receive(CALLBACK_FUNCTION(POP3Callback)); } else { // 受信と削除 error = _receiver.ReceiveAndDelete(CALLBACK_FUNCTION(POP3Callback)); } if (error == SFERR_NO_ERROR) { // エラーが起きなければ // ダイアログの作成 _dialog = ::new SFRMessageDialog(SFXGraphics::GetDeviceRectangle() .Deflate(20, 100), "受信中…", ""); } else { // ダイアログの作成 _dialog = ::new SFRMessageDialog(SFXGraphics::GetDeviceRectangle() .Deflate(20, 100), "受信に失敗しました。", "OK"); } }
受信完了時に呼び出される POP3Callback コールバック関数の宣言と定義
宣言
class MainWindow : public SFRTitleWindow { private: ... 略 ... CALLBACK_DECLARE_SFXPOP3RECEIVER(POP3Callback) ... 略 ... }
定義
受信したメールは、MailInfo 構造体へのポインタの Array で格納されています。
MailInfo 構造体の定義は
struct MailInfo { UInt32 size; //メールのサイズ SFXAnsiString uidl; //メールのUIDL SFXAnsiString mail; //メールのデータ(ヘッダ+本文) };
です。( i 番目のメッセージは mailArray[i]->mail で取得します。)
CALLBACK_IMPLEMENT_SFXPOP3RECEIVER(MainWindow, POP3Callback, error) { SFXWideString message; SFXPropertyPtr mail; SInt32 i; if (_dialog != null) { // 「受信中…」ダイアログを閉じる _dialog->Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE, SRP16_TERMINATE_INVOKE, true)); } if (error == SFERR_NO_ERROR) { message.Set("受信に成功しました。"); } else { message.Set("受信に失敗しました。"); } // ダイアログの作成 _dialog = ::new SFRMessageDialog(SFXGraphics::GetDeviceRectangle() .Deflate(20, 100), message, "OK"); if (error == SFERR_NO_ERROR) { // 成功した場合はハンドラを登録 if (_dialog != null) { // ダイアログハンドラの登録 _dialog->RegisterHandler(SREVT_DIALOG, HANDLER_BEFORE, HANDLER_FUNCTION(OnDialog)); } mail = SimpleMailer::GetMail(); // 受信したメールをコピー const SFXArray<SFXPOP3Receiver::MailInfoPtr>& mailArray = _receiver.GetReceivedMailArray(); for (i = 0; i < mailArray.GetSize(); ++i) { SFXPOP3Receiver::MailInfoPtr minfo = mailArray[i]; mail->Set(minfo->uidl, minfo->mail); } } // 再描画 SFRApplication::GetInstance()->Invoke( SFXEvent(SREVT_RESPONDER_RENDER, SRP16_RENDER_INVOKE, false)); }
受信したメールの表示
受信したメールは ReceivedWindow で表示します。