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

18.4. メール送受信

18.4.1. メール概要

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

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

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

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

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

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

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

18.4.2. メール送信

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

例 18.13. SMTP メール送信

class MyClass {
private:
    SFXSMTPSender _sender;
    CALLBACK_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,
        CALLBACK_FUNCTION(SMTPCallback))) != SFERR_NO_ERROR) {
        // error が SFERR_NO_ERROR でないとき、SMTPCallback 関数は呼び出されない
        // エラー処理をする
        ...
    }
}

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

18.4.3. メール受信

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

例 18.14. POP3 メール受信

class MyClass {
private:
    SFXPOP3Receiver _receiver;
    CALLBACK_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(CALLBACK_FUNCTION(POP3Callback)))
        != SFERR_NO_ERROR) {
        // error が SFERR_NO_ERROR でないとき、POP3Callback 関数は呼び出されない
        // エラー処理をする
        ...
    }
}

// メール受信の完了が通知されるコールバック関数
CALLBACK_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());

        }
    }
}

18.4.4. SSL メール送信

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

例 18.15. SSL メール送信

class MyClass {
private:
    SFXSMTPSender _sender;
    CALLBACK_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,
        CALLBACK_FUNCTION(SMTPCallback))) != SFERR_NO_ERROR) {
        // error が SFERR_NO_ERROR でないとき、SMTPCallback 関数は呼び出されない
        // エラー処理をする
        ...
    }
}

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

18.4.5. SSL メール受信

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

例 18.16. SSL メール受信

class MyClass {
private:
    SFXPOP3Receiver _receiver;
    CALLBACK_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(CALLBACK_FUNCTION(POP3Callback)))
        != SFERR_NO_ERROR) {
        // error が SFERR_NO_ERROR でないとき、POP3Callback 関数は呼び出されない
        // エラー処理をする
        ...
    }
}

// メール受信の完了が通知されるコールバック関数
CALLBACK_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());

        }
    }
}

18.4.6. メール メッセージ

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

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

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

SFXMailMessage message;

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

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

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

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

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

例 18.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();