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



















