前のページ次のページ上に戻るホーム BREW C++ ライブラリ & GUI フレームワーク : SophiaFramework 3.0

13.3. メール関係クラス

メールの送受信を行うのに必要なクラスです。

13.3.1. メール関係クラス

通常、メールの送受信を行うのに必要なクラスは次の3つです。

表 13.1. メール関係クラス(通常版)

SFUSmtpSender メール送信を行うクラス
SFUPop3Receiver メール受信を行うクラス
SFUMailMessage メールヘッダ、メール本文、添付ファイルを扱うクラス

SMTP や POP3 プロトコルをより詳細に扱う場合は、以下のクラスも用います。

表 13.2. メール関係クラス(詳細版)

SFUSmtp SMTPプロトコルを扱うクラス
SFUPop3 POP3 プロトコルを扱うクラス
SFUMailField メールヘッダのエンコード、デコードを行うクラス
SFUMailUtil メールヘッダ解析のための補助クラス
SFUBase64 Base64のエンコード、デコードを行うクラス
SFUQuotedPrintable QuotedPrintableのエンコード、デコードを行うクラス

詳しい使い方はそれぞれのクラスのリファレンスを参照してください。 以下では最低限の使い方のみ説明します。

13.3.2. メールの送信

SFUSmtpSender クラスを用いることで、SMTP プロトコルの詳細を知らずにメールを送信することができます。SMTP プロトコルを直に扱う場合はSFUSmtp クラスを使います。

SFUSmtpSender クラスは次のように使います。

SFUSmtpSender sender;

// あるクラス MyClass中での処理
Void MyClass::func() {

    sender.Open(OnNotifyEntry, this);

    // SMTP認証を用いる場合、SetAuthorization を呼び出す。
    // (通常のSMTP通信で、SMTP認証を使う機会はあまりありません)
    sender.SetAuthorization(SFUSmtpSender::AUTH_CRAM_MD5, "username", "password");

    // 送信用メールサーバとポート番号を指定。
    SFUIPEndpoint endpoint("127.0.0.1:25");
    sender.SetServer(endpoint);
    {
        SFBNetMgrSmp netmgr = SFBNetMgr::NewInstance();
        INAddr addr = netmgr->GetMyIPAddr();    //自分自身のアドレスを取得
        SFUIPEndpoint ep(addr);
        sender.SetHostName(ep.ToString());
    }

    sender.SetFrom("<fromaddress@example.com>");   // Fromアドレス
    sender.AddTo("<toaddress1@example.com>");      // Toアドレス
    sender.AddTo("<toaddress2@example.com>");      // Toアドレスは複数指定可。

    //メール本文
    sender.SetMessage("Mail test\r\nThis mail is sent by SFUSmtpSender.\r\n");
    sender.Send();    //送信
}

// static関数(メールの送信に成功 or 失敗した場合、↓が実行されます)
Void MyClass::OnNotifyEntry(SFUSmtpSender::NotifyEnum notify, SFCError err, VoidPtr data) {
    MyClass(data)->OnNotify(notify, err);
}

Void MyClass::OnNotify(SFUSmtpSender::NotifyEnum notify, SFCError err){
    if (err == SFERR_NO_ERROR) { //送信に成功した場合
        //処理
    }
    sender.Close();
}

13.3.3. メールの受信

SFUPop3Receiver クラスを用いることで、POP3プロトコルの詳細を知らずにメールを受信することができます。POP3プロトコルを直に扱う場合は SFUPop3 クラスを使います。

SFUPop3Receiver クラスは次のように使います。

// あるクラス MyClass中での処理
SFUPop3Receiver receiver;

Void MyClass::func() {
    receiver.Open(OnNotifyEntry, this);
    SFUIPEndpoint endpoint("127.0.0.1:110");     // 受信用メールサーバとポート番号を指定。
    receiver.SetServer(endpoint);
    receiver.SetAccount("user", "password");    //ユーザ、パスワードを設定
    receiver.Receive(-1, -1);    //全メールの全文を取得
}
//-----------------------------------------------------------------
//static関数(メールの送信に成功 or 失敗した場合、↓が実行されます)
Void MyClass::OnNotifyEntry(SFUPop3Receiver::NotifyEnum notify, SFCError err, VoidPtr data) {
    MyClass(data)->OnNotify(notify, err);
}
//-----------------------------------------------------------------
Void MyClass::OnNotify(SFUPop3Receiver::NotifyEnum notify, SFCError err){
    if (err == SFERR_NO_ERROR) { //受信に成功した場合
        //処理
        //下の例では全受信メールをDBGPRINTFで表示
        SInt32 i;
        SFXArray<SFUPop3Receiver::MailInfoPtr> mailArray = receiver.GetReceivedMailArray();
        DBGPRINTF("received %d mails", mailArray.GetSize()); //数を表示
        for (i = 0; i < mailArray.GetSize() ; i++) {
            SFUPop3Receiver::MailInfoPtr minfo = mailArray[i];
            DBGPRINTF("%d, %s, %s",minfo->size, minfo->uidl.GetCString(), minfo->mail.GetCString());
            //左から順に、メールサイズ、UIDL、メール本体(ヘッダ含む)
        }
    }
    receiver.Close();
}

13.3.4. メールメッセージの扱い

SFUMailMessage クラスはメールメッセージ(ヘッダと本文)を扱うクラスです。 受信したメールのヘッダ解析や、送信メッセージのヘッダ作成などを行います。 添付ファイルを扱うこともできます。

以下のソースコードは受信したメールのヘッダ解析を行っています。

//SFXAnsiString str に受信したメールメッセージ(ヘッダ+本文)が入っているとします。
SFUMailMessage mailmsg;
mailmsg.Parse(str);
SFXAnsiString from = mailmsg.GetFromField();  //ヘッダのFrom: を取得
SFXAnsiString to = mailmsg.GetToField();      //ヘッダのTo: を取得
SFXAnsiString subject = mailmsg.GetSubjectField();    //ヘッダのSubject: を取得
SFXDate date = mailmsg.GetDateField();    //ヘッダのDate: をSFXDate形式で取得
SFXAnsiString body = mailmsg.GetBody();       //メール本文を取得(添付ファイルの扱いは省略)

以下のソースコードは送信のためのヘッダ作成を行っています。

SFUMailMessage mailmsg;
mailmsg.ReplaceFromField("fromaddress@example.com");  //ヘッダのFrom: をセット
mailmsg.AddToField("toaddress1@example.com");      //ヘッダのTo: をセット(複数回呼び出し可)
mailmsg.ReplaceSubjectField("title");    //ヘッダのSubject: をセット
mailmsg.SetBody("本文");       //メール本文をセット
SFXAnsiString sendStr = mailmsg.Write();
//sendStrをSFUSmtp(Sender)を用いて送信する