![]() ![]() ![]()
|
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("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);
}
}
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 // [入力] 送信先メールアドレス );
追加する送信先メールアドレスを指定します。
メールアドレスは、"<" と ">" で囲む必要があります。
(例)user@exapmle.com の場合は、<user@example.com> です。
この関数は、送信先メールアドレスを追加します。
※ この関数は、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 // [入力] 送信元メールアドレス );
送信元メールアドレスを指定します。
メールアドレスは、"<" と ">" で囲まなくてはなりません。
(例)user@exapmle.com の場合は、<user@example.com> です。
この関数は、送信元メールアドレスを設定します。
※ この関数は、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 - 2012 Sophia Cradle Incorporated All Rights Reserved. |
![]() ![]() ![]()
|