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

BREW メーラー 〜 BREW C++ POP/SMTP プログラミング 〜

メールの送信

メールを送信するには SFXSMTPSender クラスを使います。

class SendingWindow : public SFRTitleWindow {

private:

    SFXSMTPSender _sender;
    ...
}

SendingWindow の送信ボタンのハンドラ

SFXMailMessage クラスでメール メッセージを作成します。

SetServer 関数で SMTP サーバを設定し、SendMessage 関数で送信します。

SendMessage 関数のパラメーターには、送信処理完了時のコールバック関数( SMTPCallback ) を設定します。

HANDLER_IMPLEMENT_VOIDCONTROL(SendingWindow, OnButtonControlOk, result, control)
{
    SFCError error;
    // アプリクラスから設定データを取得
    SFXConfigPtr option = SimpleMailer::GetOption();

    // メール メッセージを表すクラス
    SFXMailMessage message;

    // From アドレスを設定 (テキスト コントロールから取得)
    message.SetFromField(_textControlFrom->GetText());

    // To アドレスを設定
    message.AddToField(_textControlTo->GetText());

    // タイトルを設定
    message.SetSubjectField(_textControlSubject->GetText());

    // 本文を設定
    message.SetBody(_textControlBody->GetText());

    // 送信用メールサーバとポート番号を指定 (ドメインは自動解決)
    _sender.SetServer(SFXSocketAddress(
        option->ReadSFXAnsiString(OPTION_SMTPSERVER, ""),
        option->ReadUInt16(OPTION_SMTPPOPT, 25)));

    //SSL接続使用、認証方法設定
    
    Bool UseSSL=option->ReadBool(OPTION_USESSL, false);
if ( UseSSL == true ) {
_sender.SetSSLMode(UseSSL);
SInt16 trustmode=option->ReadSInt16(OPTION_SSLTRUSTMODE,0);
switch (trustmode) {
case 0:
default:
_sender.SetTrustMode(SSL_TRUST_MODE_FAIL);
break;
case 1:
_sender.SetTrustMode(SSL_TRUST_MODE_CHECK);
break;
case 2:
_sender.SetTrustMode(SSL_TRUST_MODE_IGNORE);
break;
case 3:
_sender.SetTrustMode(SSL_TRUST_MODE_ALWAYS);
break;
}
}
// SMTP認証方法設定
SInt16 smtpauth=option->ReadSInt16(OPTION_SMTPAUTHMODE,0);
switch (smtpauth) {
case 0:
default:
error=_sender.SetAuthorization(SFXSMTPSender::AUTH_NONE,"","");
break;
case 1:
error=_sender.SetAuthorization(SFXSMTPSender::AUTH_PLAIN,
option->ReadSFXAnsiString(OPTION_USER, ""),
option->ReadSFXAnsiString(OPTION_PASSWORD, ""));
break;
case 2:
error=_sender.SetAuthorization(SFXSMTPSender::AUTH_LOGIN,
option->ReadSFXAnsiString(OPTION_USER, ""),"");
break;
case 3:
error= _sender.SetAuthorization(SFXSMTPSender::AUTH_CRAM_MD5,
option->ReadSFXAnsiString(OPTION_USER, ""),
option->ReadSFXAnsiString(OPTION_PASSWORD, ""));
break;
case 4:
// DIGEST_MD5 is not supported yet.
error= _sender.SetAuthorization(SFXSMTPSender::AUTH_NONE,"","");
break;
}
if (error != SFERR_NO_ERROR) {
_sender.Cancel();
} // メールを送信 & コールバック関数 SMTPCallback を登録 error = _sender.SendMessage(&message, CALLBACK_FUNCTION(SMTPCallback)); if (error == SFERR_NO_ERROR) { // エラーが起きなければ // ダイアログの作成 _dialog = ::new SFRMessageDialog(SFXGraphics::GetDeviceRectangle() .Deflate(20, 100), "送信中…", ""); } else { // ダイアログの作成 _dialog = ::new SFRMessageDialog(SFXGraphics::GetDeviceRectangle() .Deflate(20, 100), "送信に失敗しました。", "OK"); if (_dialog != null) { // ダイアログハンドラの登録 _dialog->RegisterHandler(SREVT_DIALOG, HANDLER_BEFORE, HANDLER_FUNCTION(OnDialog)); } } }

送信完了時に呼び出される SMTPCallback コールバック関数の宣言と定義

宣言

class SendingWindow : public SFRTitleWindow {

private:

    ... 略 ...
    
    CALLBACK_DECLARE_SFXSMTPSENDER(SMTPCallback) 
    
    ... 略 ...
}

定義

CALLBACK_IMPLEMENT_SFXSMTPSENDER(SendingWindow, SMTPCallback, error)
{
    SFXWideString message;

    if (error == SFERR_NO_ERROR) {
        message.Set("送信に成功しました。");
    }
    else {
        message.Set("送信に失敗しました。");
    }
    if (_dialog != null) {
        // 「送信中…」ダイアログを閉じる
        _dialog->Invoke(SFXEvent(SREVT_RESPONDER_TERMINATE,
            SRP16_TERMINATE_INVOKE, true));
    }
    // ダイアログの作成
    _dialog = ::new SFRMessageDialog(SFXGraphics::GetDeviceRectangle()
        .Deflate(20, 100), message, "OK");
    if (_dialog != null) {
        // ダイアログハンドラの登録
        _dialog->RegisterHandler(SREVT_DIALOG, HANDLER_BEFORE,
            HANDLER_FUNCTION(OnDialog));
    }
    // 再描画
    SFRApplication::GetInstance()->Invoke(
        SFXEvent(SREVT_RESPONDER_RENDER, SRP16_RENDER_INVOKE, false));
}