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)); }