SophiaFramework UNIVERSE 5.3 |
SFXSMTPSender クラスは、 SMTP メール送信を行うクラスです。
注意 | |
---|---|
このクラスは、SFXSMTP クラスと SFXMailUtility クラスを使用して実装されています。 |
SFXSMTPSender クラスを使用してメールを送信する方法
例 844. 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("[email protected]"); // メールヘッダーに To アドレスを追加する message.AddToField("[email protected]"); message.AddToField("[email protected]"); // メールヘッダーに 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); } }
SFXMailMessage インスタンスのプロパティとして From フィールドと To フィールドは必ず設定しなければいけません。 Cc フィールド、Bcc フィールドは必要に応じて設定します。
注意 | |
---|---|
SFXSMTPSender::SendText 関数を使用してメール送信することも可能ですが、 エンコードされたメールヘッダーとメール本文からなるメールメッセージを開発者が作成する必要があります。 ※ 通常、エンコードなどの処理を自動的に行ってくれる SFXMailMessage クラスを利用してメールメッセージを作成します。 |
タイムアウトの制御 | |
---|---|
タイムアウトの制御は、アプリケーション側で行います。 |
コンストラクタ/デストラクタ |
---|
SFXSMTPSender( Void ) SFXSMTPSender クラスのコンストラクタです。
|
~SFXSMTPSender( Void ) SFXSMTPSender クラスのデストラクタです。
|
パブリック関数 | |
---|---|
SFCError |
AddTo(
SFXAnsiStringConstRef to
) 送信先メールアドレスを追加します。
|
Void |
Cancel( Void ) SMTP メール送信をキャンセルします。
|
Void |
ClearTo( Void ) 送信先メールアドレスの設定をクリアします。
|
ProgressEnum |
GetProgress( Void ) SMTP メール送信の進行状態を表す定数を取得します。
|
SFXSMTPRef |
GetSFXSMTP( Void ) 内部で保持している SFXSMTP インスタンスを取得します。
|
Bool |
GetSSLMode( Void ) SSL 接続モードを取得します。
|
UInt32 |
GetTrustMode( Void ) SSL 認証モードを取得します。
|
Bool |
IsQuit( Void ) QUIT コマンドを発行したかどうかを判定します。
|
SFCError |
SendMessage(
SFXMailMessagePtr message
, CallbackSPP spp
, VoidPtr reference
) メールメッセージを送信します。
|
SFCError |
SendText(
SFXAnsiStringConstRef text
, CallbackSPP spp
, VoidPtr reference
) ヘッダーと本文からなるメールメッセージのテキストを送信します。
|
SFCError |
SetAuthorization(
AuthEnum auth
, SFXAnsiStringConstRef user
, SFXAnsiStringConstRef password
) SMTP 認証方式、ユーザー名、パスワードを設定します。
|
SFCError |
SetFrom(
SFXAnsiStringConstRef from
) 送信元メールアドレスを設定します。
|
SFCError |
SetHostName(
SFXAnsiStringConstRef host
) 送信元ホストネームを設定します。
|
Void |
SetSSLMode(
Bool isSSL
) SSL 接続モードを設定します。
|
SFCError |
SetServer(
SFXSocketAddressConstRef server
) SMTP サーバーのドメイン名(または IP アドレス)とポート番号を設定します。
|
Void |
SetTrustMode(
UInt32 sslTrustMode
) SSL 認証モードを設定します。
|
型 |
---|
AuthEnum SMTP 認証方式を表す定数です。
|
CallbackSPP SMTP メール送信の結果が通知されるコールバック関数の型です。
|
ProgressEnum SMTP メール送信の進行状態を表す定数です。
|
[ public, explicit ] SFXSMTPSender(Void);
このコンストラクタは、以下の初期化処理を行います。
注意 | |
---|---|
このコンストラクタでは、 SMTP メール送信に必要なリソースは割り当てられていません。 SMTP メール送信に必要なリソースは SFXSMTPSender::SendMessage 関数、 または SFXSMTPSender::SendText 関数を呼び出して SMTP サーバーに接続するときに確保されます。 |
このコンストラクタの内部実装は以下の通りです。
/*public */SFXSMTPSender::SFXSMTPSender(Void) : _state(STATE_STANDBY), _progress(PROGRESS_NONE), _auth(AUTH_NONE), _quit(false), _isSSL(false), _sslTrustMode(SSL_TRUST_MODE_FAIL) { }// SFXSMTPSender::SFXSMTPSender //
SFXSMTPSender::SetAuthorization | SFXSMTPSender::SetSSLMode | SFXSMTPSender::SetTrustMode | SFXSMTPSender::SendMessage | SFXSMTPSender::SendText
[ public ] ~SFXSMTPSender(Void);
このデストラクタは、 SFXSMTPSender::Cancel 関数を呼び出して SMTP メール送信をキャンセルしてからインスタンスを破棄します。
このデストラクタの内部実装は以下の通りです。
/*public */SFXSMTPSender::~SFXSMTPSender(Void) { Cancel(); }// SFXSMTPSender::~SFXSMTPSender //
[ public ] SFCError AddTo( SFXAnsiStringConstRef to // [入力] 送信先メールアドレス );
追加する送信先メールアドレスを指定します。
メールアドレスは、"<" と ">" で囲む必要があります。
(例)[email protected] の場合は、<[email protected]> です。
この関数は、送信先メールアドレスを追加します。
※ この関数は、SFXSMTPSender::SendText 関数によりメール送信を行う場合に使用します。
注意 | |
---|---|
複数の送信先メールアドレスを設定するには、 この関数を複数回呼び出します。 この関数は SFXSMTPSender::SendText 関数よりも前に呼び出す必要があります。 |
この関数の内部実装は以下の通りです。
/*public */SFCError SFXSMTPSender::AddTo(SFXAnsiStringConstRef to) { SFCError error; SFXAnsiStringPtr string; if ((string = ::new SFXAnsiString(to)) != null) { error = _toList.InsertLast(string); } else { error = SFERR_NO_MEMORY; } return error; }// SFXSMTPSender::AddTo //
[ public ] Void Cancel(Void);
この関数は、SMTP メール送信をキャンセルします。
具体的には、以下の処理を行います。
注意 | |
---|---|
この関数は、内部的に SFXSMTPSender::~SFXSMTPSender デストラクタから呼び出されます。 |
この関数の内部実装は以下の通りです。
/*public */Void SFXSMTPSender::Cancel(Void) { _state = STATE_STANDBY; _progress = PROGRESS_NONE; _spp = null; _reference = null; _server.Set(0, 0); _from.Clear(); ClearTo(); _message.Clear(); _smtp.Close(); }// SFXSMTPSender::Cancel //
SFXSMTPSender::SendMessage | SFXSMTPSender::SendText | SFXSMTPSender::ClearTo | SFXSMTPSender::AddTo | SFXSMTPSender::SetFrom | SFXSMTPSender::~SFXSMTPSender | SFXSMTP::Close | SFXSMTPSender::CallbackSPP | SFXSMTPSender::ProgressEnum
[ public ] Void ClearTo(Void);
この関数は、SFXSMTPSender::AddTo 関数で設定した送信先メールアドレスの設定をクリアします。
※ この関数は、SFXSMTPSender::SendText 関数によりメール送信を行う場合に使用します。
この関数の内部実装は以下の通りです。
/*public */Void SFXSMTPSender::ClearTo(Void) { SFXArray<SFXAnsiStringPtr>::Iterator itor; SFXAnsiStringPtr string; itor = _toList.GetFirstIterator(); while (itor.HasNext()) { string = itor.GetNext(); ::delete string; } _toList.Clear(); }// SFXSMTPSender::ClearTo //
[ public, const ] ProgressEnum GetProgress(Void);
SMTP メール送信の進行状態を表す定数(SFXSMTPSender::ProgressEnum の何れかの定数)。
この関数は、SMTP メール送信の進行状態を表す定数を取得します。
注意 | |
---|---|
SMTP メール送信に失敗したときにコールバック関数内でこの関数を呼び出すと、 エラーが発生した段階を取得できます。 |
この関数の内部実装は以下の通りです。
/*public */inline SFXSMTPSender::ProgressEnum SFXSMTPSender::GetProgress(Void) const { return _progress; }// SFXSMTPSender::GetProgress //
[ public ] SFXSMTPRef GetSFXSMTP(Void);
内部で保持している SFXSMTP インスタンス
この関数は、内部で保持している SFXSMTP インスタンスを取得します。
この関数の内部実装は以下の通りです。
/*public */inline SFXSMTPRef SFXSMTPSender::GetSFXSMTP(Void) { return _smtp; }// SFXSMTPSender::GetSFXSMTP //
[ public, const ] Bool GetSSLMode(Void);
この関数は、SSL 接続モードを取得します。
この関数の内部実装は以下の通りです。
/*public */inline Bool SFXSMTPSender::GetSSLMode(Void) const { return _isSSL; }// SFXSMTPSender::GetSSLMode //
[ public, const ] UInt32 GetTrustMode(Void);
SMTP メール送信の SSL 認証モード
この関数は、SMTP メール送信の SSL 認証モードを取得します。
以下の 4 種類の SSL 認証モードの何れかが返却されます。
この関数の内部実装は以下の通りです。
/*public */inline UInt32 SFXSMTPSender::GetTrustMode(Void) const { return _sslTrustMode; }// SFXSMTPSender::GetTrustMode //
[ public ] Bool IsQuit(Void);
この関数は、QUIT コマンドを発行したかどうかを判定します。
QUIT コマンド | |
---|---|
QUIT コマンドは、SMTP メール送信のセッションを終了するためのコマンドです。 |
この関数の内部実装は以下の通りです。
/*public */inline Bool SFXSMTPSender::IsQuit(Void) { return _quit; }// SFXSMTPSender::IsQuit //
[ public ] SFCError SendMessage( SFXMailMessagePtr message // [入力] 送信するメールメッセージ CallbackSPP spp // [入力] SMTP メール送信の結果が通知されるコールバック関数 VoidPtr reference // [入力] コールバック関数に渡されるデータ(参照値) );
送信するメールメッセージを指定します。
SMTP メール送信完了が通知されるコールバック関数を指定します。
コールバック関数に渡すデータ(参照値)を指定します。
この関数は、メールメッセージを送信します。
注意 | |
---|---|
この関数を呼び出す前に SMTP サーバーを SFXSMTPSender::SetServer 関数で設定します。 送信元のホスト名は自動的に取得されますが、SFXSMTPSender::SetHostName 関数で設定することも可能です。 送信元メールアドレスは、メールメッセージのヘッダーに含まれる From フィールドです。 送信先メールアドレスは、メールメッセージのヘッダーに含まれる To / Cc / Bcc フィールドです。 Bcc フィールドは削除してから送信します。 Shift_JIS コードでエンコードされたヘッダーは Base64 エンコードされて送信されます。 また、Shift_JIS コードでエンコードされたメールメッセージの本文は JIS コード(ISO-2022-JP)でエンコードされて送信されます |
SMTP メール送信の結果 | |
---|---|
SMTP メール送信の結果は、spp 引数に指定したコールバック関数に通知されます。 この関数の戻り値には反映されません。 |
メールメッセージのエンコード | |
---|---|
送信するメールメッセージは、 ヘッダーのフィールド値に含まれる日本語は JIS コードでエンコードされ、 更に B エンコードまたは Q エンコードされている必要があります。 また、メール本文は JIS コードでエンコードされている必要があります。 マルチパートメッセージの場合、 メール本文、プリアンブルテキスト、エピローグテキストは、JIS コードでエンコードされている必要があります。 更に、添付ファイルのパートは Base64 エンコードまたは Quoted-Printable エンコードされている必要があります。 また、1 行の長さは行末の改行文字「 CRLF(\r\n)」を除き、4 文字以上 998 文字以下でなければいけません。 以上のエンコードは、この関数が内部的に SFXMailMessage クラスを利用して行いますので、 開発者はエンコード処理を記述する必要はありません。 |
この関数の内部実装は以下の通りです。
#define XALLBACK_IMPLEMENT_SFXSMTP(TYPE, FUNCTION, ERROR) XALLBACK_IMPLEMENT_SFAMAILPROTOCOL(TYPE, FUNCTION, ERROR) #define XALLBACK_IMPLEMENT_SFAMAILPROTOCOL(TYPE, FUNCTION, ERROR) XALLBACK_IMPLEMENT_SFXSSLSOCKET(TYPE, FUNCTION, ERROR) #define XALLBACK_IMPLEMENT_SFXSSLSOCKET(TYPE, FUNCTION, ERROR) XALLBACK_IMPLEMENT_SFXSTORAGE(TYPE, FUNCTION, ERROR) #define XALLBACK_IMPLEMENT_SFXSTORAGE(TYPE, FUNCTION, ERROR) \ Void XALLBACK_FUNCTION(TYPE::FUNCTION)(SFCError error, VoidPtr reference) \ { \ static_cast<TYPE*>(reference)->FUNCTION(error); \ return; \ } \ \ Void TYPE::FUNCTION(SFCError ERROR) /*public */SFCError SFXSMTPSender::SendMessage(SFXMailMessagePtr message, CallbackSPP spp, VoidPtr reference) { SFCError error(SFERR_NO_ERROR); SFBNetMgrSmp net; SFXAnsiString temp; SInt32 r0, r1; SFXProperty property; SFXAnsiStringPtr mail; if (!_server.Get().IsEmpty()) { if (error == SFERR_NO_ERROR) { if (_from.IsEmpty()) { _from = message->GetFromField(); } if (_toList.IsEmpty()) { if ((error = SFXMailUtility::ParseMailboxList(message->GetToField(), &property)) == SFERR_NO_ERROR) { if ((error = SFXMailUtility::ParseMailboxList(message->GetCcField(), &property)) == SFERR_NO_ERROR) { if ((error = SFXMailUtility::ParseMailboxList(message->GetBccField(), &property)) == SFERR_NO_ERROR) { r1 = property.GetSize(); for (r0 = 0; r0 < r1; ++r0) { if ((mail = ::new SFXAnsiString) != null) { if ((error = mail->Set(property.GetValue(r0))) == SFERR_NO_ERROR) { if ((error = _toList.InsertLast(mail)) != SFERR_NO_ERROR) { break; } } else { break; } } else { error = SFERR_NO_MEMORY; break; } } } } } } } if (error == SFERR_NO_ERROR) { if (message->GetBccField().IsEmpty()) { error = _message.Set(message->Write()); } else { if ((error = temp.Set(message->Write())) == SFERR_NO_ERROR) { if ((r0 = temp.FirstIndexOf("BCC:", SINT32_MINIMUM, false)) > -1) { r1 = temp.FirstIndexOf("\r\n", r0); if ((error = _message.Set(temp.Substring(0, r0))) == SFERR_NO_ERROR) { error = _message.Add(temp.Substring(r1 + 2, temp.GetLength())); } } else { error = SFERR_FAILED; } } } } if (error == SFERR_NO_ERROR) { if (!_from.IsEmpty() && !_toList.IsEmpty()) { _smtp.Close(); if ((error = _smtp.Open()) == SFERR_NO_ERROR) { _smtp.SetSSLMode(_isSSL); if ((error = _smtp.SetTrustMode(_sslTrustMode)) == SFERR_NO_ERROR) { if ((error = _smtp.Connect(_server, XALLBACK_INTERNAL(OnSMTP))) == SFERR_NO_ERROR) { _state = STATE_SENDING; _progress = PROGRESS_CONNECT; _spp = spp; _reference = reference; _quit = false; } } if (error != SFERR_NO_ERROR) { _smtp.Close(); } } } else { error = SFERR_INVALID_PARAM; } } } else { error = SFERR_FAILED; } return error; }// SFXSMTPSender::SendMessage // /*private */XALLBACK_IMPLEMENT_SFXSMTP(SFXSMTPSender, OnSMTP, error) { SIntN code; if (error == SFERR_NO_ERROR) { code = _smtp.GetResponseCode(); switch (_progress) { case PROGRESS_CONNECT: error = ProceedConnect(code); break; case PROGRESS_EHLO: error = ProceedEhlo(code); break; case PROGRESS_HELO: error = ProceedHelo(code); break; case PROGRESS_AUTH: error = ProceedAuth(code); break; case PROGRESS_AUTHRESP1: error = ProceedAuthresp1(code); break; case PROGRESS_AUTHRESP2: error = ProceedAuthresp1(code); break; case PROGRESS_MAIL: error = ProceedMail(code); break; case PROGRESS_RCPT: error = ProceedRcpt(code); break; case PROGRESS_DATA: error = ProceedData(code); break; case PROGRESS_DATATEXT: error = ProceedDataText(code); break; case PROGRESS_ERRORQUIT: _progress = PROGRESS_DONE; FinishSend(_previous); break; case PROGRESS_QUIT: _progress = PROGRESS_DONE; FinishSend(SFERR_NO_ERROR); break; case PROGRESS_DONE: case PROGRESS_NONE: default: FinishSend(PROGRESS_NONE); break; } } if (error != SFERR_NO_ERROR) { FinishSend(_progress); } }// XALLBACK_IMPLEMENT_SFXSMTP(SFXSMTPSender, OnSMTP, error) // /*private */SFCError SFXSMTPSender::ProceedConnect(UInt16 code) { SFCError error(SFERR_NO_ERROR); SFXInetAddress address; if (code == 220) { _progress = PROGRESS_EHLO; if (_client.IsEmpty()) { address = SFXInetAddress::LocalInetAddress(); if (!address.Get().IsEmpty()) { error = _client.Set(address.Get()); } else { error = SFERR_FAILED; } } error = _smtp.SendEhloCommand(_client); } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedConnect // /*private */SFCError SFXSMTPSender::ProceedEhlo(UInt16 code) { SFCError error(SFERR_NO_ERROR); SFXSMTP::AuthEnum auth(SFXSMTP::AUTH_NONE); SFXAnsiString temp; if (_auth == AUTH_NONE) { if (code == 250) { _progress = PROGRESS_MAIL; if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) { error = _smtp.SendMailCommand(temp); } } else { _progress = PROGRESS_HELO; error = _smtp.SendHeloCommand(_client); } } else { if (code == 250) { _progress = PROGRESS_AUTH; switch (_auth) { case AUTH_NONE: auth = SFXSMTP::AUTH_NONE; break; case AUTH_PLAIN: auth = SFXSMTP::AUTH_PLAIN; break; case AUTH_LOGIN: auth = SFXSMTP::AUTH_LOGIN; break; case AUTH_CRAM_MD5: auth = SFXSMTP::AUTH_CRAM_MD5; break; case AUTH_DIGEST_MD5: auth = SFXSMTP::AUTH_DIGEST_MD5; break; default: break; } error = _smtp.SendAuthCommand(auth); } else { ProceedError(); } } return error; }// SFXSMTPSender::ProceedEhlo // /*private */SFCError SFXSMTPSender::ProceedHelo(UInt16 code) { SFCError error(SFERR_NO_ERROR); SFXAnsiString temp; if (code == 220) { _progress = PROGRESS_MAIL; if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) { error = _smtp.SendMailCommand(temp); } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedHelo // /*private */SFCError SFXSMTPSender::ProceedAuth(UInt16 code) { SFCError error(SFERR_NO_ERROR); if (code == 334) { _progress = PROGRESS_AUTHRESP1; switch (_auth) { case AUTH_PLAIN: error = _smtp.SendAuthResponse(_user, _password); break; case AUTH_LOGIN: error = _smtp.SendAuthResponse(_user); break; case AUTH_CRAM_MD5: error = _smtp.SendAuthResponse(_user, _password, _smtp.GetResponseText()); break; case AUTH_NONE: case AUTH_DIGEST_MD5: default: // DIGEST_MD5 has not been supported yet. _previous = _progress; _progress = PROGRESS_ERRORQUIT; if ((error = _smtp.SendQuitCommand()) == SFERR_NO_ERROR) { _quit = true; } break; } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedAuth // /*private */SFCError SFXSMTPSender::ProceedAuthresp1(UInt16 code) { SFCError error(SFERR_NO_ERROR); SFXAnsiString temp; if (code == 334) { if (_auth == AUTH_LOGIN) { _progress = PROGRESS_AUTHRESP2; error = _smtp.SendAuthResponse(_password); } } else if (code == 235) { _progress = PROGRESS_MAIL; if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) { error = _smtp.SendMailCommand(temp); } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedAuthresp1 // /*private */SFCError SFXSMTPSender::ProceedAuthresp2(UInt16 code) { SFCError error(SFERR_NO_ERROR); SFXAnsiString temp; if (code == 235) { _progress = PROGRESS_MAIL; if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) { error = _smtp.SendMailCommand(temp); } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedAuthresp2 // /*private */SFCError SFXSMTPSender::ProceedMail(UInt16 code) { SFXAnsiString temp; SFCError error(SFERR_NO_ERROR); if (code == 250) { _progress = PROGRESS_RCPT; _index = 0; if ((error = SetBrackets(*_toList[0], &temp)) == SFERR_NO_ERROR) { error = _smtp.SendRcptCommand(temp); } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedMail // /*private */SFCError SFXSMTPSender::ProceedRcpt(UInt16 code) { SFXAnsiString temp; SFCError error(SFERR_NO_ERROR); if (code == 250 || code == 251) { ++_index; if (_index < _toList.GetSize()) { if ((error = SetBrackets(*_toList[_index], &temp)) == SFERR_NO_ERROR) { error = _smtp.SendRcptCommand(temp); } } else { _progress = PROGRESS_DATA; error = _smtp.SendDataCommand(); } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedRcpt // /*private */SFCError SFXSMTPSender::ProceedData(UInt16 code) { SFCError error(SFERR_NO_ERROR); if (code == 354) { _progress = PROGRESS_DATATEXT; error = _smtp.SendDataText(_message); } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedData // /*private */SFCError SFXSMTPSender::ProceedDataText(UInt16 /*code*/) { SFCError error(SFERR_NO_ERROR); _progress = PROGRESS_QUIT; if ((error = _smtp.SendQuitCommand()) == SFERR_NO_ERROR) { _quit = true; } return error; }// SFXSMTPSender::ProceedDataText // /*private */Void SFXSMTPSender::ProceedError(Void) { _previous = _progress; _progress = PROGRESS_ERRORQUIT; if (_smtp.SendQuitCommand() == SFERR_NO_ERROR) { _quit = true; } return; }// SFXSMTPSender::ProceedError // /*private */Void SFXSMTPSender::FinishSend(SFCError error) { _state = STATE_STANDBY; _smtp.Close(); if (_spp != null) { _spp(error, _reference); } return; }// SFXSMTPSender::FinishSend // /*private */SFCError SFXSMTPSender::SetBrackets(SFXAnsiStringConstRef string, SFXAnsiStringPtr result) { SFCError error(SFERR_NO_ERROR); if (string.StartsWith('<') && string.EndsWith('>')) { error = result->Set(string); } else { if ((error = result->Set('<')) == SFERR_NO_ERROR) { if ((error = result->Add(string)) == SFERR_NO_ERROR) { error = result->Add('>'); } } } return error; }// SFXSMTPSender::SetBrackets //
SFXSMTPSender::SetServer | SFXSMTPSender::SetHostName | SFXSMTPSender::SetFrom | SFXSMTPSender::AddTo | SFXSMTPSender::ClearTo | SFXSMTPSender::Cancel | SFXSMTPSender::SendText | SFXSMTPSender::SFXSMTPSender | SFXSMTPSender::CallbackSPP | SFXMailMessage
[ public ] SFCError SendText( SFXAnsiStringConstRef text // [入力] 送信するテキスト CallbackSPP spp // [入力] SMTP メール送信の結果が通知されるコールバック関数 VoidPtr reference // [入力] コールバック関数に渡されるデータ(参照値) );
送信するテキストを指定します。
SMTP メール送信完了が通知されるコールバック関数を指定します。
コールバック関数に渡すデータ(参照値)を指定します。
この関数は、ヘッダーと本文からなるメールメッセージのテキストを送信します。
text 引数に指定するテキストのエンコード | |
---|---|
text 引数に指定するメールテキストは、 ヘッダーのフィールド値に含まれる日本語は JIS コードでエンコードされ、 更に B エンコードまたは Q エンコードされている必要があります。 また、メール本文は JIS コードでエンコードされている必要があります。 また、1 行の長さは行末の改行文字「 CRLF(\r\n)」を除き、4 文字以上 998 文字以下でなければいけません。 ※ 通常、エンコードなどの処理を自動的に行ってくれる SFXMailMessage クラスを利用してメールメッセージを作成します。 |
使用方法 | |
---|---|
この関数を呼び出す前に SFXSMTPSender::SetServer / SFXSMTPSender::SetHostName / SFXSMTPSender::SetFrom / SFXSMTPSender::AddTo 関数を使用して、 SMTP サーバー、送信元ホスト名、送信元メールアドレス、送信先メールアドレスを設定します。 この関数の呼び出すと、メール送信が開始します。 |
SMTP メール送信の結果 | |
---|---|
SMTP メール送信の結果は、spp 引数に指定したコールバック関数に通知されます。 この関数の戻り値には反映されません。 |
この関数の内部実装は以下の通りです。
#define XALLBACK_IMPLEMENT_SFXSMTP(TYPE, FUNCTION, ERROR) XALLBACK_IMPLEMENT_SFAMAILPROTOCOL(TYPE, FUNCTION, ERROR) #define XALLBACK_IMPLEMENT_SFAMAILPROTOCOL(TYPE, FUNCTION, ERROR) XALLBACK_IMPLEMENT_SFXSSLSOCKET(TYPE, FUNCTION, ERROR) #define XALLBACK_IMPLEMENT_SFXSSLSOCKET(TYPE, FUNCTION, ERROR) XALLBACK_IMPLEMENT_SFXSTORAGE(TYPE, FUNCTION, ERROR) #define XALLBACK_IMPLEMENT_SFXSTORAGE(TYPE, FUNCTION, ERROR) \ Void XALLBACK_FUNCTION(TYPE::FUNCTION)(SFCError error, VoidPtr reference) \ { \ static_cast<TYPE*>(reference)->FUNCTION(error); \ return; \ } \ \ Void TYPE::FUNCTION(SFCError ERROR) /*public */SFCError SFXSMTPSender::SendText(SFXAnsiStringConstRef text, CallbackSPP spp, VoidPtr reference) { SFCError error(SFERR_NO_ERROR); _message.Set(text); // temp if (!_client.IsEmpty() && !_from.IsEmpty() && !_toList.IsEmpty()) { _smtp.Close(); if ((error = _smtp.Open()) == SFERR_NO_ERROR) { _smtp.SetSSLMode(_isSSL); if ((error = _smtp.SetTrustMode(_sslTrustMode)) == SFERR_NO_ERROR) { if ((error = _smtp.Connect(_server, XALLBACK_INTERNAL(OnSMTP))) == SFERR_NO_ERROR) { _state = STATE_SENDING; _progress = PROGRESS_CONNECT; _spp = spp; _reference = reference; _quit = false; } } if (error != SFERR_NO_ERROR) { _smtp.Close(); } } } else { error = SFERR_INVALID_PARAM; } return error; }// SFXSMTPSender::SendText // /*private */XALLBACK_IMPLEMENT_SFXSMTP(SFXSMTPSender, OnSMTP, error) { SIntN code; if (error == SFERR_NO_ERROR) { code = _smtp.GetResponseCode(); switch (_progress) { case PROGRESS_CONNECT: error = ProceedConnect(code); break; case PROGRESS_EHLO: error = ProceedEhlo(code); break; case PROGRESS_HELO: error = ProceedHelo(code); break; case PROGRESS_AUTH: error = ProceedAuth(code); break; case PROGRESS_AUTHRESP1: error = ProceedAuthresp1(code); break; case PROGRESS_AUTHRESP2: error = ProceedAuthresp1(code); break; case PROGRESS_MAIL: error = ProceedMail(code); break; case PROGRESS_RCPT: error = ProceedRcpt(code); break; case PROGRESS_DATA: error = ProceedData(code); break; case PROGRESS_DATATEXT: error = ProceedDataText(code); break; case PROGRESS_ERRORQUIT: _progress = PROGRESS_DONE; FinishSend(_previous); break; case PROGRESS_QUIT: _progress = PROGRESS_DONE; FinishSend(SFERR_NO_ERROR); break; case PROGRESS_DONE: case PROGRESS_NONE: default: FinishSend(PROGRESS_NONE); break; } } if (error != SFERR_NO_ERROR) { FinishSend(_progress); } }// XALLBACK_IMPLEMENT_SFXSMTP(SFXSMTPSender, OnSMTP, error) // /*private */SFCError SFXSMTPSender::ProceedConnect(UInt16 code) { SFCError error(SFERR_NO_ERROR); SFXInetAddress address; if (code == 220) { _progress = PROGRESS_EHLO; if (_client.IsEmpty()) { address = SFXInetAddress::LocalInetAddress(); if (!address.Get().IsEmpty()) { error = _client.Set(address.Get()); } else { error = SFERR_FAILED; } } error = _smtp.SendEhloCommand(_client); } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedConnect // /*private */SFCError SFXSMTPSender::ProceedEhlo(UInt16 code) { SFCError error(SFERR_NO_ERROR); SFXSMTP::AuthEnum auth(SFXSMTP::AUTH_NONE); SFXAnsiString temp; if (_auth == AUTH_NONE) { if (code == 250) { _progress = PROGRESS_MAIL; if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) { error = _smtp.SendMailCommand(temp); } } else { _progress = PROGRESS_HELO; error = _smtp.SendHeloCommand(_client); } } else { if (code == 250) { _progress = PROGRESS_AUTH; switch (_auth) { case AUTH_NONE: auth = SFXSMTP::AUTH_NONE; break; case AUTH_PLAIN: auth = SFXSMTP::AUTH_PLAIN; break; case AUTH_LOGIN: auth = SFXSMTP::AUTH_LOGIN; break; case AUTH_CRAM_MD5: auth = SFXSMTP::AUTH_CRAM_MD5; break; case AUTH_DIGEST_MD5: auth = SFXSMTP::AUTH_DIGEST_MD5; break; default: break; } error = _smtp.SendAuthCommand(auth); } else { ProceedError(); } } return error; }// SFXSMTPSender::ProceedEhlo // /*private */SFCError SFXSMTPSender::ProceedHelo(UInt16 code) { SFCError error(SFERR_NO_ERROR); SFXAnsiString temp; if (code == 220) { _progress = PROGRESS_MAIL; if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) { error = _smtp.SendMailCommand(temp); } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedHelo // /*private */SFCError SFXSMTPSender::ProceedAuth(UInt16 code) { SFCError error(SFERR_NO_ERROR); if (code == 334) { _progress = PROGRESS_AUTHRESP1; switch (_auth) { case AUTH_PLAIN: error = _smtp.SendAuthResponse(_user, _password); break; case AUTH_LOGIN: error = _smtp.SendAuthResponse(_user); break; case AUTH_CRAM_MD5: error = _smtp.SendAuthResponse(_user, _password, _smtp.GetResponseText()); break; case AUTH_NONE: case AUTH_DIGEST_MD5: default: // DIGEST_MD5 has not been supported yet. _previous = _progress; _progress = PROGRESS_ERRORQUIT; if ((error = _smtp.SendQuitCommand()) == SFERR_NO_ERROR) { _quit = true; } break; } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedAuth // /*private */SFCError SFXSMTPSender::ProceedAuthresp1(UInt16 code) { SFCError error(SFERR_NO_ERROR); SFXAnsiString temp; if (code == 334) { if (_auth == AUTH_LOGIN) { _progress = PROGRESS_AUTHRESP2; error = _smtp.SendAuthResponse(_password); } } else if (code == 235) { _progress = PROGRESS_MAIL; if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) { error = _smtp.SendMailCommand(temp); } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedAuthresp1 // /*private */SFCError SFXSMTPSender::ProceedAuthresp2(UInt16 code) { SFCError error(SFERR_NO_ERROR); SFXAnsiString temp; if (code == 235) { _progress = PROGRESS_MAIL; if ((error = SetBrackets(_from, &temp)) == SFERR_NO_ERROR) { error = _smtp.SendMailCommand(temp); } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedAuthresp2 // /*private */SFCError SFXSMTPSender::ProceedMail(UInt16 code) { SFXAnsiString temp; SFCError error(SFERR_NO_ERROR); if (code == 250) { _progress = PROGRESS_RCPT; _index = 0; if ((error = SetBrackets(*_toList[0], &temp)) == SFERR_NO_ERROR) { error = _smtp.SendRcptCommand(temp); } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedMail // /*private */SFCError SFXSMTPSender::ProceedRcpt(UInt16 code) { SFXAnsiString temp; SFCError error(SFERR_NO_ERROR); if (code == 250 || code == 251) { ++_index; if (_index < _toList.GetSize()) { if ((error = SetBrackets(*_toList[_index], &temp)) == SFERR_NO_ERROR) { error = _smtp.SendRcptCommand(temp); } } else { _progress = PROGRESS_DATA; error = _smtp.SendDataCommand(); } } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedRcpt // /*private */SFCError SFXSMTPSender::ProceedData(UInt16 code) { SFCError error(SFERR_NO_ERROR); if (code == 354) { _progress = PROGRESS_DATATEXT; error = _smtp.SendDataText(_message); } else { ProceedError(); } return error; }// SFXSMTPSender::ProceedData // /*private */SFCError SFXSMTPSender::ProceedDataText(UInt16 /*code*/) { SFCError error(SFERR_NO_ERROR); _progress = PROGRESS_QUIT; if ((error = _smtp.SendQuitCommand()) == SFERR_NO_ERROR) { _quit = true; } return error; }// SFXSMTPSender::ProceedDataText // /*private */Void SFXSMTPSender::ProceedError(Void) { _previous = _progress; _progress = PROGRESS_ERRORQUIT; if (_smtp.SendQuitCommand() == SFERR_NO_ERROR) { _quit = true; } return; }// SFXSMTPSender::ProceedError // /*private */Void SFXSMTPSender::FinishSend(SFCError error) { _state = STATE_STANDBY; _smtp.Close(); if (_spp != null) { _spp(error, _reference); } return; }// SFXSMTPSender::FinishSend // /*private */SFCError SFXSMTPSender::SetBrackets(SFXAnsiStringConstRef string, SFXAnsiStringPtr result) { SFCError error(SFERR_NO_ERROR); if (string.StartsWith('<') && string.EndsWith('>')) { error = result->Set(string); } else { if ((error = result->Set('<')) == SFERR_NO_ERROR) { if ((error = result->Add(string)) == SFERR_NO_ERROR) { error = result->Add('>'); } } } return error; }// SFXSMTPSender::SetBrackets //
SFXSMTPSender::SetServer | SFXSMTPSender::SetHostName | SFXSMTPSender::SetFrom | SFXSMTPSender::AddTo | SFXSMTPSender::ClearTo | SFXSMTPSender::Cancel | SFXSMTPSender::SendMessage | SFXSMTPSender::SFXSMTPSender | SFXSMTPSender::CallbackSPP | SFXMailMessage::Write | SFXMailMessage
[ public ] SFCError SetAuthorization( AuthEnum auth // [入力] 認証方式 SFXAnsiStringConstRef user // [入力] ユーザー名 SFXAnsiStringConstRef password // [入力] パスワード );
SMTP 認証方式を指定します。
参照: SFXSMTPSender::AuthEnum 定数
ユーザー名を指定します。
パスワードを指定します。
この関数は、SMTP 認証方式、ユーザー名、パスワードを設定します。
注意 | |
---|---|
この関数を実行する前に SFXSMTPSender::SFXSMTPSender コンストラクタ内で SMTP 認証方式は SFXSMTPSender::AUTH_NONE に初期化されています。 |
設定可能な認証方式 | |
---|---|
設定可能な認証方式は以下の通りです(SFXSMTPSender::AuthEnum)。
|
以下は、LOGIN 認証を行うコードです。
SFXSMTPSender sender;
SFCError error;
// LOGIN 認証を行う
error = _sender.SetAuthorization(SFXSMTPSender::AUTH_LOGIN , "user" , "password");
if (error != SFERR_NO_ERROR) {
TRACE("Authorization error : %d", error);
}
この関数の内部実装は以下の通りです。
/*public */SFCError SFXSMTPSender::SetAuthorization(SFXSMTPSender::AuthEnum auth, SFXAnsiStringConstRef user, SFXAnsiStringConstRef password) { SFCError error; if ((error = _user.Set(user)) == SFERR_NO_ERROR) { if ((error = _password.Set(password)) == SFERR_NO_ERROR) { _auth = auth; } } return error; }// SFXSMTPSender::SetAuthorization //
SFXSMTPSender::AuthEnum | SFXSMTPSender::SendMessage | SFXSMTPSender::SendText | SFXSMTPSender::SFXSMTPSender
[ public ] SFCError SetFrom( SFXAnsiStringConstRef from // [入力] 送信元メールアドレス );
送信元メールアドレスを指定します。
メールアドレスは、"<" と ">" で囲まなくてはなりません。
(例)[email protected] の場合は、<[email protected]> です。
この関数は、送信元メールアドレスを設定します。
※ この関数は、SFXSMTPSender::SendText 関数によりメール送信を行う場合に使用します。
注意 | |
---|---|
この関数は SFXSMTPSender::SendText 関数よりも前に呼び出す必要があります。 |
この関数の内部実装は以下の通りです。
/*public */inline SFCError SFXSMTPSender::SetFrom(SFXAnsiStringConstRef from) { return _from.Set(from); }// SFXSMTPSender::SetFrom //
[ public ] SFCError SetHostName( SFXAnsiStringConstRef host // [入力] 送信元ホストネーム );
送信元ホストネームを指定します。
空文字列は使えません。
この関数は、送信元ホストネームを設定します。
※ この関数は、SFXSMTPSender::SendText 関数によりメール送信を行う場合に使用します。
注意 | |
---|---|
この関数は SFXSMTPSender::SendText 関数よりも前に呼び出す必要があります。 この関数で設定したホストネームは、 SMTP プロトコルの EHLO ( もしくは HELO )コマンドの引数として使われます。 |
この関数の内部実装は以下の通りです。
/*public */inline SFCError SFXSMTPSender::SetHostName(SFXAnsiStringConstRef host) { return _client.Set(host); }// SFXSMTPSender::SetHostName //
この関数は、SSL 接続モードを設定します。
デフォルト値: false(SSL 接続モードは OFF)
注意 | |
---|---|
SSL 接続モードを ON する場合、isSSL 引数に true を指定します。 |
この関数の内部実装は以下の通りです。
/*public */inline Void SFXSMTPSender::SetSSLMode(Bool isSSL) { _isSSL = isSSL; return; }// SFXSMTPSender::SetSSLMode //
[ public ] SFCError SetServer( SFXSocketAddressConstRef server // [入力] SMTP サーバーのドメイン名(または IP アドレス)とポート番号 );
SMTP サーバーのドメイン名(または IP アドレス)とポート番号を指定します。
この関数は、SMTP サーバーのドメイン名(または IP アドレス)とポート番号を設定します。
注意 | |
---|---|
この関数は SFXSMTPSender::SendMessage / SFXSMTPSender::SendText 関数よりも前に呼び出して SMTP サーバーのドメイン名(または IP アドレス)とポート番号を設定する必要があります。 ※ ドメイン名の解決は自動的に行われます。 |
この関数の内部実装は以下の通りです。
/*public */inline SFCError SFXSMTPSender::SetServer(SFXSocketAddressConstRef server) { return _server.Set(server); }// SFXSMTPSender::SetServer //
SFXSMTPSender::SendMessage | SFXSMTPSender::SendText | SFXSMTPSender::SFXSMTPSender | SFXSocketAddress
以下の 4 種類の何れかの SSL 認証モードを指定します。
この関数は、SMTP メール送信の SSL 認証モードを設定します。
デフォルト値: SSL_TRUST_MODE_FAIL
設定可能な SSL 認証モードは、 以下の 4 種類です(参照: BREW API ISSL_NegotiateV)。
設定された値は、 SFXSMTPSender::Cancel 関数が呼び出されるまで有効です。
注意 | |
---|---|
詳細情報: BREW API ISSL_NegotiateV |
この関数の内部実装は以下の通りです。
/*public */inline Void SFXSMTPSender::SetTrustMode(UInt32 sslTrustMode) { _sslTrustMode = sslTrustMode; return; }// SFXSMTPSender::SetTrustMode //
SFXSMTPSender::GetTrustMode | SFXSSLSocket::SetTrustMode | SFXSMTPSender::SFXSMTPSender | BREW API ISSL_NegotiateV
enum AuthEnum { AUTH_NONE =0, // SMTP 認証を行いません。 AUTH_PLAIN, // PLAIN 認証を行います。 AUTH_LOGIN, // LOGIN 認証を行います。 AUTH_CRAM_MD5, // CRAM-MD5 認証を行います。 AUTH_DIGEST_MD5 // DIGEST-MD5 認証を行います(現バージョンでは、DIGEST-MD5 認証は使用できません)。 };
SMTP 認証方式を表す定数です。
SFXSMTPSender::SetAuthorization 関数を使用して下記の SMTP 認証方式の定数を指定できます。
SMTP 認証を行いません。
PLAIN 認証を行います。
LOGIN 認証を行います。
CRAM-MD5 認証を行います。
DIGEST-MD5 認証を行います(現バージョンでは、DIGEST-MD5 認証は使用できません)。
typedef Void(* SFXSMTPSender::CallbackSPP)(SFCError error, VoidPtr reference)
SMTP メール送信の結果が通知されるコールバック関数の型です。
このコールバック関数は、 SFXSMTPSender::SendMessage または SFXSMTPSender::SendText 関数を使用して登録します。
メール送信処理の結果は、このコールバック関数に通知されます。
第 1 引数の error には、SMTP メール送信に成功した場合は SFERR_NO_ERROR、 失敗した場合はその他のエラーコードが渡されます。
第 2 引数の reference には、 SFXSMTPSender::SendMessage または SFXSMTPSender::SendText 関数の reference 引数に指定した値 (通常、SFXSMTPSender インスタンス: this)が渡されます。
注意 | |
---|---|
SMTP メール送信処理のどの段階でエラーが発生したかは、 SFXPOP3Receiver::Delete コールバック関数内で SFXSMTPSender::GetProgress 関数を使用して取得できます。 |
enum ProgressEnum { PROGRESS_NONE, = 0 // 接続は開始されていません。 PROGRESS_CONNECT, // SMTP サーバーに接続中です。 PROGRESS_EHLO, // EHLO コマンドの応答を待っています。 PROGRESS_HELO, // HELO コマンドの応答を待っています。 PROGRESS_AUTH, // AUTH コマンドの応答を待っています。 PROGRESS_AUTHRESP1, // SMTP 認証の 1 回目のコマンドに対する応答を待っています。 PROGRESS_AUTHRESP2, // SMTP 認証の 2 回目のコマンドに対する応答を待っています。 PROGRESS_MAIL, // MAIL コマンドの応答を待っています。 PROGRESS_RCPT, // RCPT コマンドの応答を待っています。 PROGRESS_DATA, // DATA コマンドの応答を待っています。 PROGRESS_DATATEXT, // DATA コマンドに続くメッセージテキストの応答を待っています。 PROGRESS_QUIT, // QUIT コマンドの応答を待っています。 PROGRESS_ERRORQUIT, // メール送信が失敗した状態です。 PROGRESS_DONE // メール送信処理がすべて完了した状態です。 };
SFXSMTPSender クラスによる SMTP メール送信の進行状態を表す定数です。
SFXSMTPSender::GetProgress 関数を使用して以下の SMTP メール送信の進行状態を表す定数を取得できます。
接続は開始されていません。
SMTP サーバーに接続中です。
EHLO コマンドの応答を待っています。
HELO コマンドの応答を待っています。
AUTH コマンドの応答を待っています。
SMTP 認証の 1 回目のコマンドに対する応答を待っています。
SMTP 認証の 2 回目のコマンドに対する応答を待っています。
MAIL コマンドの応答を待っています。
RCPT コマンドの応答を待っています。
DATA コマンドの応答を待っています。
DATA コマンドに続くメッセージテキストの応答を待っています。
QUIT コマンドの応答を待っています。
メール送信が失敗した状態です。
メール送信処理がすべて完了した状態です。
Copyright(c) 2002 - 2024 Sophia Cradle Incorporated All Rights Reserved. |