前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク & XML ミドルウェア : SophiaFramework UNIVERSE 5.0

16.4. メール送受信

16.4.1. メール概要

メール送受信をするための基本的なクラスとして、以下の 3 種類のクラスが提供されます。

表 16.3. メール送受信クラス

クラス名 解説
SFXSMTPSender SMTP メール送信クラスです。
SFXPOP3Receiver POP3 メール受信クラスです。
SFXMailMessage メールメッセージを処理するためのクラスです。

SMTP や POP3 プロトコルを詳細なレベルで処理するには、以下のクラスを使います。

表 16.4. SMTP / POP3 プロトコルクラス

クラス名 解説
SFXSMTP SMTP プロトコルを処理するクラスです。
SFXPOP3 POP3 プロトコルを処理するクラスです。
SFXMailUtility メールメッセージを処理するためのユーティリティクラスです。
SFXMailField メールヘッダーのエンコードとデコードのためのクラスです。
[Caution] mif ファイルの設定

mif ファイルの特権レベル設定で「ネットワーク」の項目をオンにします。

16.4.2. メール送信

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

例 16.13. SMTP メール送信

class MyClass {
private:
    SFXSMTPSender _sender;
    XALLBACK_DECLARE_SFXSMTPSENDER(SMTPCallback)
public:
    Void Start(Void);
};

Void MyClass::Start(Void)
{
    SFCError error;
    SFXMailMessage message;

    // メールヘッダーに From フィールドを設定する
    message.SetFromField("fromaddress@example.com");

    // メールヘッダーに To アドレスを追加する
    message.AddToField("toaddress1@example.com");
    message.AddToField("toaddress2@example.com");

    // メールヘッダーに Subject フィールドを設定する
    message.SetSubjectField("Mail Subject");

    // メールメッセージの本文を設定する
    message.SetBody("Mail test\r\nThis mail is sent by SFXSMTPSender.\r\n");

    // SMTP サーバーの IP アドレスとポート番号を指定する ( ドメインは自動解決される )
    _sender.SetServer(SFXSocketAddress("smtpserver.example.com:25"));

    // SMTPCallback コールバック関数を登録し、メールを送信する
    // メール送信の完了は SMTPCallback 関数に通知される
    if ((error = _sender.SendMessage(&message,
        XALLBACK_FUNCTION(SMTPCallback))) != SFERR_NO_ERROR) {
        // error が SFERR_NO_ERROR でないとき、SMTPCallback 関数は呼び出されない
        // エラー処理をする
        ...
    }
}

// メール送信の完了が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXSMTPSENDER(MyClass, SMTPCallback, error)
{
    if (error == SFERR_NO_ERROR) {
        TRACE("メールを送信しました。");
    }
    else {
        TRACE("メール送信に失敗しました。 %d", error);
    }
}

16.4.3. メール受信

POP3 メール受信には SFXPOP3Receiver クラスを使います。

例 16.14. POP3 メール受信

class MyClass {
private:
    SFXPOP3Receiver _receiver;
    XALLBACK_DECLARE_SFXPOP3RECEIVER(POP3Callback)
public:
    Void Start(Void);
};

Void MyClass::Start(Void)
{
    // POP3 サーバーの IP アドレスとポート番号を指定する ( ドメインは自動解決される )
    _receiver.SetServer(SFXSocketAddress("pop3server.example.com:110"));

    // ユーザー名とパスワードを設定する
    _receiver.SetAccount("user", "password");

    // POP3Callback コールバック関数を登録し、メールを受信する
    // メール受信の完了は POP3Callback 関数に通知される
    if ((error = _receiver.Receive(XALLBACK_FUNCTION(POP3Callback)))
        != SFERR_NO_ERROR) {
        // error が SFERR_NO_ERROR でないとき、POP3Callback 関数は呼び出されない
        // エラー処理をする
        ...
    }
}

// メール受信の完了が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXPOP3RECEIVER(MyClass, POP3Callback, error)
{
    SInt32 i;

    if (error == SFERR_NO_ERROR) { 
        //受信に成功した場合

        // 受信したメールの配列 ( SFXArray ) を取得する
        const SFXArray<SFXPOP3Receiver::MailInfoPtr>& mailArray =
            receiver.GetReceivedMailArray();

        // メール数を表示する
        TRACE("received %d mails", mailArray.GetSize());

        for (i = 0; i < mailArray.GetSize() ; i++) {
            SFXPOP3Receiver::MailInfoPtr minfo = mailArray[i];

            //左から順に、メール サイズ、UIDL、メールヘッダーとメール本文を含むメールメッセージを表示する
            TRACE("%d, %s, %s", minfo->size, minfo->uidl.GetCString(), minfo->mail.GetCString());

        }
    }
}

16.4.4. SSL メール送信

通常のメール送信と SSL でのメール送信とで異なるのは、SetSSLMode 関数、SetTrustMode 関数、及び SetAuthorization 関数で SSL の設定をする部分だけです。

例 16.15. SSL メール送信

class MyClass {
private:
    SFXSMTPSender _sender;
    XALLBACK_DECLARE_SFXSMTPSENDER(SMTPCallback)
public:
    Void Start(Void);
};

// 太字の部分を追加
Void MyClass::Start(Void)
{
    SFCError error;
    SFXMailMessage message;

    // メールヘッダーに From フィールドを設定する
    message.SetFromField("fromaddress@example.com");

    // メールヘッダーに To フィールドを追加する
    message.AddToField("toaddress1@example.com");
    message.AddToField("toaddress2@example.com");

    // メールヘッダーに Subject フィールドを設定する
    message.SetSubjectField("Mail Subject");

    // メールメッセージの本文を設定する
    message.SetBody("Mail test\r\nThis mail is sent by SFXSMTPSender.\r\n");

    // SMTP サーバーの IP アドレスとポート番号を指定する ( ドメインは自動解決される )
    _sender.SetServer(SFXSocketAddress("smtpserver.example.com:465"));

    // SSL メール送信の設定
    _sender.SetSSLMode(true); // SSL 接続モードの設定
    _sender.SetTrustMode(SSL_TRUST_MODE_FAIL); // 証明書の検証モードの設定
    _sender.SetAuthorization(AUTH_CRAM_MD5,"username","password"); // SMTP 認証モードの設定 

    // SMTPCallback コールバック関数を登録し、メールを送信する
    // メール送信の完了は SMTPCallback 関数に通知される
    if ((error = _sender.SendMessage(&message,
        XALLBACK_FUNCTION(SMTPCallback))) != SFERR_NO_ERROR) {
        // error が SFERR_NO_ERROR でないとき、SMTPCallback 関数は呼び出されない
        // エラー処理をする
        ...
    }
}

// メール送信の完了が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXSMTPSENDER(MyClass, SMTPCallback, error)
{
    if (error == SFERR_NO_ERROR) {
        TRACE("メールを送信しました。");
    }
    else {
        TRACE("メール送信に失敗しました。 %d", error);
    }
}

16.4.5. SSL メール受信

通常のメール受信と SSL でのメール受信とで異なるのは、SetSSLMode 関数と SetTrustMode 関数で SSL の設定をする部分だけです。

例 16.16. SSL メール受信

class MyClass {
private:
    SFXPOP3Receiver _receiver;
    XALLBACK_DECLARE_SFXPOP3RECEIVER(POP3Callback)
public:
    Void Start(Void);
};

// 太字の部分を追加
Void MyClass::Start(Void)
{
    // ユーザー名とパスワードを設定する
    _receiver.SetAccount("user", "password");

    // POP3 サーバーの IP アドレスとポート番号を指定する ( ドメインは自動解決される )
    _receiver.SetServer(SFXSocketAddress("pop3server.example.com:995"));

   // SSL メール受信の設定
   _receiver.SetSSLMode(true); // SSL 接続モードの設定
   _receiver.SetTrustMode(SSL_TRUST_MODE_FAIL); // 証明書の検証モードの設定
 
    // POP3Callback コールバック関数を登録し、メールを受信する
    // メール受信の完了は POP3Callback 関数に通知される
    if ((error = _receiver.Receive(XALLBACK_FUNCTION(POP3Callback)))
        != SFERR_NO_ERROR) {
        // error が SFERR_NO_ERROR でないとき、POP3Callback 関数は呼び出されない
        // エラー処理をする
        ...
    }
}

// メール受信の完了が通知されるコールバック関数
XALLBACK_IMPLEMENT_SFXPOP3RECEIVER(MyClass, POP3Callback, error)
{
    SInt32 i;

    if (error == SFERR_NO_ERROR) { 
        //受信に成功した場合

        // 受信したメールの配列 ( SFXArray ) を取得する
        const SFXArray<SFXPOP3Receiver::MailInfoPtr>& mailArray =
            receiver.GetReceivedMailArray();

        // メール数を表示する
        TRACE("received %d mails", mailArray.GetSize());

        for (i = 0; i < mailArray.GetSize() ; i++) {
            SFXPOP3Receiver::MailInfoPtr minfo = mailArray[i];

            //左から順に、メール サイズ、UIDL、メールヘッダーとメール本文を含むメールメッセージを含むメール本体を表示する
            TRACE("%d, %s, %s", minfo->size, minfo->uidl.GetCString(), minfo->mail.GetCString());

        }
    }
}

16.4.6. メールメッセージ

メールメッセージとは、メールヘッダーとメール本文からなる文字列のことで、SFXMailMessage クラスを使って処理します。

SFXMailMessage クラスでは、 メール送信のためのメールメッセージや添付ファイルの作成 それから受信したメールのヘッダー解析などができます。

例 16.17. メールメッセージの作成

SFXMailMessage message;

// メールヘッダーに From フィールドを設定する
message.ReplaceFromField("fromaddress@example.com");

// メールヘッダーに To フィールドを追加する( 複数回の呼び出しも可能 )
message.AddToField("toaddress1@example.com");

// メールヘッダーに Subject フィールドを設定する
message.ReplaceSubjectField("title");

// メール本文を設定する
message.SetBody("メール本文");

// メールを送信する
smtpSender.SendMessage(&message, XALLBACK_FUNCTION(SMTPCallback));

例 16.18. 受信メールメッセージの解析

// 受信したメールメッセージ
SFXAnsiString receivedString =
    "From: Albert Einstein <einstein@example.com>\r\n"
    "To: Isaac Newton <newton@example.com>\r\n"
    "Subject: untitled\r\n"
    "Date: Sat, 08 Mar 2008 20:37:58 +0900\r\n"
    "\r\n"
    "This is a mail body.\r\n";

SFXMailMessage message;

// メールメッセージを解析する
message.Parse(receivedString);

// メールヘッダーの From フィールドを取得する
// fromString は "Albert Einstein <einstein@example.com>" になる
SFXAnsiString fromString = message.GetFromField();

// メールヘッダーの To フィールドを取得する
// toString は "Isaac Newton <newton@example.com>" になる
SFXAnsiString toString = message.GetToField();

// メールヘッダーの Subject フィールドを取得する
// subjectStringは "untitled" になる
SFXAnsiString subjectString = message.GetSubjectField();

// メールヘッダーの Date フィールドを取得する
// date は "Sat, 08 Mar 2008 20:37:58 +0900" になる

SFXDate date = message.GetDateField();

// メール本文を取得する
// bodyString は "This is a mail body.\r\n"; になる
SFXAnsiString bodyString = message.GetBody();