00001
00014 #ifndef __EMAISMTP_HPP__
00015 #define __EMAISMTP_HPP__
00016
00017 #include <EmaiSMTP.h>
00018 #include <EmaiMessage.hpp>
00019 #include <EmaiExceptions.hpp>
00020
00026 namespace Emai
00027 {
00028
00035 class SmtpStatusCallback
00036 {
00037 friend class SmtpSession;
00038
00045 virtual EmaiError OnOperation(
00046 Emai::SmtpSession& inSession,
00047 EmaiUint32 inOperationCode) = 0;
00048
00057 virtual EmaiError OnDataSent(
00058 Emai::SmtpSession& inSession,
00059 EmaiUint32 inSentSize,
00060 EmaiUint32 inTotalSize) = 0;
00061
00070 virtual EmaiError OnServerError(
00071 Emai::SmtpSession& inSession,
00072 EmaiConstCharPtr inServerReply,
00073 EmaiUint32 inReplyCode) = 0;
00074
00075 public:
00076 virtual ~SmtpStatusCallback();
00077
00078 protected:
00079 static EmaiError StatusCallback(
00080 EmaiSmtpSession inSession,
00081 const EmaiSmtpCallbackData* inData,
00082 void* inUserData);
00083 };
00084
00085
00090 class SmtpSession : public Object<EmaiSmtpSession>
00091 {
00092 protected:
00093
00094 typedef Object<EmaiSmtpSession> Parent;
00095
00097 SmtpSession();
00098
00099 public:
00100
00101 SmtpSession(
00102 SmtpStatusCallback& inStatusCallback,
00103 EmaiUint32 inTimeout,
00104 EmaiOptions inOptions = EmaiNullOptions);
00105 SmtpSession(
00106 EmaiSmtpStatusCallback inStatusCallback,
00107 void* inUserData,
00108 EmaiUint32 inTimeout,
00109 EmaiOptions inOptions = EmaiNullOptions);
00110
00111 SmtpSession(
00112 const SmtpSession& inCopy);
00113 SmtpSession(
00114 EmaiSmtpSession inSession,
00115 bool inAddRef);
00116
00117 ~SmtpSession();
00118
00130 void Connect(
00131 EmaiConstUniCharPtr inMailServer,
00132 short inPort = EmaiDefaultSmtpPort,
00133 EmaiOptions inOptions = EmaiNullOptions);
00134
00148 void ConnectEx(
00149 EmaiConstUniCharPtr inMailServer,
00150 short inPort = EmaiDefaultSmtpPort,
00151 const EmaiProxyInfo* inProxyInfo = NULL,
00152 void* inUserData = NULL,
00153 EmaiOptions inOptions = EmaiNullOptions);
00154
00162 void Disconnect(
00163 EmaiOptions inOptions = EmaiNullOptions);
00164
00178 void Authenticate(
00179 EmaiConstUniCharPtr inAccount,
00180 EmaiConstUniCharPtr inPassword,
00181 EmaiOptions inOptions = EmaiSMTPAuthAutomatic);
00182
00191 void SendMessage(
00192 const Message& inMessage,
00193 EmaiOptions inOptions = EmaiNullOptions);
00194
00204 void SendMessageEx(
00205 const Message& inMessage,
00206 StringList& outFailedRecipients,
00207 EmaiOptions inOptions = EmaiNullOptions);
00208
00209
00217 void Cancel(
00218 EmaiOptions inOptions = EmaiNullOptions);
00219
00220
00229 void Noop(
00230 EmaiOptions inOptions = EmaiNullOptions);
00231 };
00232
00233
00234
00235
00236
00237 inline EmaiError
00238 SmtpStatusCallback::StatusCallback(
00239 EmaiSmtpSession inSession,
00240 const EmaiSmtpCallbackData* inData,
00241 void* inUserData
00242 )
00243 {
00244 SmtpStatusCallback* callback = reinterpret_cast<SmtpStatusCallback*>(inUserData);
00245 EmaiError error = EmaiErrNoErr;
00246 try
00247 {
00248 if (callback != NULL)
00249 {
00250 Emai::SmtpSession session(inSession, true);
00251 switch (inData->selector)
00252 {
00253 case EmaiSmtpSelectorNormal:
00254 error = callback->OnOperation(session,
00255 inData->data.normal.operationCode);
00256 break;
00257 case EmaiSmtpSelectorSending:
00258 error = callback->OnDataSent(session,
00259 inData->data.sending.sentSize,
00260 inData->data.sending.totalSize);
00261 break;
00262 case EmaiSmtpSelectorServerError:
00263 error = callback->OnServerError(session,
00264 inData->data.serverError.serverReply,
00265 inData->data.serverError.replyCode);
00266 break;
00267 default:
00268 error = EmaiErrUnknown;
00269 break;
00270 }
00271 }
00272 }
00273 catch (...)
00274 {
00275
00276 error = EmaiErrUnknown;
00277 }
00278
00279 return error;
00280 }
00281
00282 inline
00283 SmtpStatusCallback::~SmtpStatusCallback()
00284 {
00285 }
00286
00287
00288
00289
00290 inline
00291 SmtpSession::SmtpSession(
00292 SmtpStatusCallback& inStatusCallback,
00293 EmaiUint32 inTimeout,
00294 EmaiOptions inOptions
00295 )
00296 {
00297 CheckErrorCode(EmaiSmtpSessionCreate(&mObject,
00298 &SmtpStatusCallback::StatusCallback, &inStatusCallback,
00299 inTimeout, inOptions));
00300 }
00301
00302 inline
00303 SmtpSession::SmtpSession(
00304 EmaiSmtpStatusCallback inStatusCallback,
00305 void* inUserData,
00306 EmaiUint32 inTimeout,
00307 EmaiOptions inOptions
00308 )
00309 {
00310 CheckErrorCode(EmaiSmtpSessionCreate(&mObject,
00311 inStatusCallback, inUserData,
00312 inTimeout, inOptions));
00313 }
00314
00315 inline
00316 SmtpSession::SmtpSession(
00317 const SmtpSession& inCopy
00318 ):
00319 Parent(inCopy)
00320 {
00321 }
00322
00323 inline
00324 SmtpSession::SmtpSession(
00325 EmaiSmtpSession inSession,
00326 bool inAddRef
00327 ):
00328 Parent(inSession, inAddRef)
00329 {
00330 }
00331
00332 inline
00333 SmtpSession::~SmtpSession()
00334 {
00335 }
00336
00337 inline void
00338 SmtpSession::Connect(
00339 EmaiConstUniCharPtr inMailServer,
00340 short inPort ,
00341 EmaiOptions inOptions
00342 )
00343 {
00344 CheckErrorCode(EmaiSmtpConnect(mObject,
00345 inMailServer, inPort, inOptions));
00346 }
00347
00348 inline void
00349 SmtpSession::ConnectEx(
00350 EmaiConstUniCharPtr inMailServer,
00351 short inPort ,
00352 const EmaiProxyInfo* inProxyInfo ,
00353 void* inUserData,
00354 EmaiOptions inOptions
00355 )
00356 {
00357 CheckErrorCode(EmaiSmtpConnectEx(mObject,
00358 inMailServer, inPort, inProxyInfo, inUserData, inOptions));
00359 }
00360
00361 inline void
00362 SmtpSession::Disconnect(
00363 EmaiOptions inOptions
00364 )
00365 {
00366 CheckErrorCode(EmaiSmtpDisconnect(mObject, inOptions));
00367 }
00368
00369 inline void
00370 SmtpSession::Authenticate(
00371 EmaiConstUniCharPtr inAccount,
00372 EmaiConstUniCharPtr inPassword,
00373 EmaiOptions inOptions
00374 )
00375 {
00376 CheckErrorCode(EmaiSmtpAuthenticate(mObject, inAccount,
00377 inPassword, inOptions));
00378 }
00379
00380 inline void
00381 SmtpSession::SendMessage(
00382 const Message& inMessage,
00383 EmaiOptions inOptions
00384 )
00385 {
00386 CheckErrorCode(EmaiSmtpSendMessage(mObject, inMessage, inOptions));
00387 }
00388
00389 inline void
00390 SmtpSession::SendMessageEx(
00391 const Message& inMessage,
00392 StringList& outFailedRecipients,
00393 EmaiOptions inOptions
00394 )
00395 {
00396 EmaiStringList stringList = NULL;
00397 CheckErrorCode(EmaiSmtpSendMessageEx(mObject, inMessage, &stringList, inOptions));
00398 if (stringList != NULL)
00399 outFailedRecipients = StringList(stringList, true);
00400 }
00401
00402 inline void
00403 SmtpSession::Cancel(
00404 EmaiOptions inOptions
00405 )
00406 {
00407 CheckErrorCode(EmaiSmtpCancel(mObject, inOptions));
00408 }
00409
00410 inline void
00411 SmtpSession::Noop(
00412 EmaiOptions inOptions
00413 )
00414 {
00415 CheckErrorCode(EmaiSmtpNoop(mObject, inOptions));
00416 }
00417
00418
00419 }
00420
00421
00422 #endif