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



















