ホーム > 製品情報 > SophiaFramework UNIVERSE > チュートリアル > BREW POP / SMTP メーラー

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 で表示します。