前のページ次のページ上に戻るホーム SophiaFramework UNIVERSE 5.3

16.4. メール送受信

16.4.1. メール概要

メール送受信をするための基本的なクラスとして、以下の 3 種類のクラスが提供されます。 通常は、これらのクラスを利用してメールの送受信を行います。

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

クラス名 解説
SFXSMTPSender SMTP メール送信クラスです。
SFXPOP3Receiver POP3 メール受信クラスです。
SFXMailMessage メールメッセージを処理するためのクラスです。
[Caution] mif ファイルの設定

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

SMTP / POP3 プロトコルレベルで制御を行いたい場合は、 上表のメール送受信クラスを実装している以下クラスを使用します。

表 16.4. メール送受信クラス内部実装クラス

クラス名 解説
SFXSMTP [内部的に利用されるクラスです] SMTP プロトコルを処理するクラスです。
SFXPOP3 [内部的に利用されるクラスです] POP3 プロトコルを処理するクラスです。
SFXMailUtility [内部的に利用されるクラスです] メールメッセージ作成・メール送信用ユーティリティクラスです。
SFXMailField [内部的に利用されるクラスです] メールヘッダーのフィールド値をデコード/エンコードするのためのクラスです。
[Note] 内部実装

SFXSMTPSender / SFXPOP3Receiver / SFXMailMessage クラスは、内部的に下表のクラスを使用して実装されています。

16.4.2. SMTP メール送信

SFXSMTPSender クラスを使用してメールを送信する方法は以下の通りです。

  1. SFXMailMessage クラスを使用してメールメッセージを作成します。
  2. SFXSMTPSender インスタンスを作成します。
  3. SFXSMTPSender::SetServer 関数で SMTP サーバーのドメイン名(または IP アドレス)とポート番号を設定します(ドメイン名の解決は自動的に行われます)。
  4. メール送信の結果が通知されるコールバック関数を指定して SFXSMTPSender::SendMessage 関数を呼び出します。 この操作により、メール送信が開始します。

例 16.16. 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_INTERNAL(SMTPCallback))) != SFERR_NO_ERROR) {

        // SMTP クライアント内でエラーが発生したとき
        // ※ SMTPCallback 関数は呼び出されない
        ...
    }
}

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

16.4.3. POP3 メール受信

SFXPOP3Receiver クラスを使用してメールを受信する方法は以下の通りです。

  1. SFXPOP3Receiver インスタンスを作成します。
  2. SFXPOP3Receiver::SetServer 関数で POP3 サーバーのドメイン名(または IP アドレス)とポート番号を設定します(ドメイン名の解決は自動的に行われます)。
  3. SFXPOP3Receiver::SetAccount 関数でアカウント情報(ユーザー名、パスワード、認証方式)を設定します。
  4. メールを受信した後で POP サーバーから削除する場合は、 引数に true を指定して SFXPOP3Receiver::SetAutoDelete 関数を呼び出します。
  5. メール受信の結果が通知されるコールバック関数を指定して SFXPOP3Receiver::Receive 関数を呼び出します。 この操作により、メール受信が開始します。
[Caution] 前提条件

UIDL コマンドを実装した POP3 サーバーが前提となります。

例 16.17. 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");

    // 受信したメールメッセージを POP3 サーバーから削除する場合は以下のコードを追加する
    // ※デフォルト設定では、受信したメールメッセージは POP3 サーバーから削除されない
    // _receiver.SetAutoDelete(true);

    // POP3Callback コールバック関数を登録し、メールメッセージを受信する
    // メール受信の結果は POP3Callback 関数に通知される
    if ((error = _receiver.Receive(XALLBACK_INTERNAL(POP3Callback))) != SFERR_NO_ERROR) {

        // エラーが発生したとき
        // ※ POP3Callback 関数は呼び出されない
        ...
    }
}

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

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

        // 受信したメールメッセージの配列(MailArray)を取得する
        SFXPOP3Receiver::MailArrayConstRef mailArray = receiver.GetReceivedMailArray();

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

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

            // メールメッセージのサイズ、一意識別子、ヘッダーと本文を表示する
            TRACE("%d, %s, %s", minfo->size, minfo->uidl.GetCString(), minfo->mail.GetCString());

        }
    }
}

16.4.4. SSL や SMTP 認証を使用する SMTP メール送信

SSL を使用する SMTP メール送信では、 SFXSMTPSender::SetSSLMode / SFXSMTPSender::SetTrustMode 関数で SSL の設定をする処理が追加で必要になります。

また、SMTP 認証を使用する SMTP メール送信では、 SFXSMTPSender::SetAuthorization 関数で認証方式を設定する処理が追加で必要になります。

例 16.18. SSL と SMTP 認証を使用する 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:465"));

     // SSL の設定
    _sender.SetSSLMode(true); // SSL 接続モードを ON に設定する
    _sender.SetTrustMode(SSL_TRUST_MODE_FAIL); // SSL 認証モードを SSL_TRUST_MODE_FAIL に設定する

     // SMTP 認証方式の設定
    _sender.SetAuthorization(AUTH_CRAM_MD5,"username","password"); // SMTP 認証方式を CRAM-MD5 認証に設定する

    // SMTPCallback コールバック関数を登録し、メールを送信する
    // メール送信の結果は SMTPCallback 関数に通知される
    if ((error = _sender.SendMessage(&message, XALLBACK_INTERNAL(SMTPCallback))) != SFERR_NO_ERROR) {

        // エラーが発生したとき
        // ※ SMTPCallback 関数は呼び出されない
        ...
    }
}

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

16.4.5. SSL を使用する POP3 メール受信

SSL を使用する POP3 メール受信では、 SFXPOP3Receiver::SetSSLMode / SFXPOP3Receiver::SetTrustMode 関数で SSL の設定をする処理が追加で必要になります。

例 16.19. 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 接続モードを ON に設定する
   _receiver.SetTrustMode(SSL_TRUST_MODE_FAIL); // SSL 認証モードを SSL_TRUST_MODE_FAIL に設定する
 
    // POP3Callback コールバック関数を登録し、メールを受信する
    // メール受信の結果は POP3Callback 関数に通知される
    if ((error = _receiver.Receive(XALLBACK_INTERNAL(POP3Callback))) != SFERR_NO_ERROR) {
 
        // エラーが発生したとき
        // ※ POP3Callback 関数は呼び出されない
        ...
    }
}

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

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

        // 受信したメールメッセージの配列(MailArray)を取得する
        SFXPOP3Receiver::MailArrayConstRef mailArray = receiver.GetReceivedMailArray();

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

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

            // メールメッセージのサイズ、一意識別子、ヘッダーと本文を表示する
            TRACE("%d, %s, %s", minfo->size, minfo->uidl.GetCString(), minfo->mail.GetCString());

        }
    }
}

16.4.6. メールメッセージ

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

SFXMailMessage クラスでは、 送信するメールメッセージや添付ファイルの作成、 受信したメールメッセージの解析を行えます。

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

SFXMailMessage message;

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

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

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

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

// メールメッセージを送信する
smtpSender.SendMessage(&message, XALLBACK_INTERNAL(SMTPCallback));

例 16.21. 受信したメールメッセージの解析

// 受信したメールメッセージ
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();