Asynchronous Property


This property specifies the operation mode of current object.

Data Type: Long

Remarks

If the value of asynchronous property is zero, Mail object works in synchronous mode. If the value of property is 1, Mail object works in asynchronous mode. In synchronous mode, all events won't be fired. The default value is zero.

It is more easier to develop application in synchronous mode. However, running in asynchronous mode could provide higher performance.

In synchronous mode, once SendMail method is called, it returns to application after the method is complete. Therefore, if the runtime is long, your application cannot do anything before this method ends, which results in lower efficiency. In contrast, in asynchronous mode, as SendMail method works in background, this methods return to application immediately no matter the running method is complete or not. The return value will pass to application via fired event.

To learn more about asynchronous operating mode, please refer to regarding events. You may also download EASendMail in which many samples are embedded. Those samples demonstrate how to use asynchronous operating mode to raise your application's efficiency and flexibility.

Examples

[VB, VC++, Delphi] To get the full samples of EASendMail, please refer to Samples section.

[VB, VBA - Send Email Asynchronously]

Const ConnectNormal = 0
Const ConnectSSLAuto = 1
Const ConnectSTARTTLS = 2
Const ConnectDirectSSL = 3
Const ConnectTryTLS = 4

Private WithEvents oSmtp As EASendMailObjLib.Mail
Private m_bError As Boolean
Private m_bFinished As Boolean

Private Sub oSmtp_OnAuthenticated()
    Label1.Caption = "Authenticated"
End Sub

Private Sub oSmtp_OnClosed()
    If Not m_bError Then
        Label1.Caption = "email was sent successfully!"
    End If
    m_bFinished = True
End Sub

Private Sub oSmtp_OnConnected()
    Label1.Caption = "Connected"
End Sub

Private Sub oSmtp_OnError(ByVal lError As Long, ByVal ErrDescription As String)
    Label1.Caption = "failed to send email with error: " & ErrDescription
    m_bError = True
    m_bFinished = True
End Sub

Private Sub oSmtp_OnSending(ByVal lSent As Long, ByVal lTotal As Long)
    Label1.Caption = "Sending " & lSent & "/" & lTotal
End Sub

Private Sub Command1_Click()
    
    If oSmtp Is Nothing Then
        Set oSmtp = New EASendMailObjLib.Mail
        oSmtp.LicenseCode = "TryIt"
    End If
    
    m_bError = False
    m_bFinished = False
    
    ' Your SMTP server address
    oSmtp.ServerAddr = "smtp.emailarchitect.net"
    
    '  User and password for ESMTP authentication
    oSmtp.UserName = "test@emailarchitect.net" 
    oSmtp.Password = "testpassword" 

    '  If server supports SSL/TLS connection, SSL/TLS is used automatically.
    oSmtp.ConnectType = ConnectTryTLS

    ' Set your sender email address
    oSmtp.FromAddr = "test@emailarchitect.net"
    
    ' Add recipient email address
    oSmtp.AddRecipientEx "support@emailarchitect.net", 0
    
    ' Set email subject
    oSmtp.Subject = "test email from VB 6.0 in asynchronous mode"
    
    ' Set email body
    oSmtp.BodyText = "this is a test email sent from VB 6.0 project with asynchronous mode"
    
    ' Set asynchronous mode
    oSmtp.Asynchronous = 1
    
    Command1.Enabled = False
    Label1.Caption = "start to send email ..."
    
    oSmtp.SendMail
    
    Do While Not m_bFinished
        ' Wait for the email sending, you can do other thing here
        DoEvents
    Loop
    
    MsgBox Label1.Caption
    Command1.Enabled = True

End Sub
 

[Delphi - Send Email Asynchronously] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, EASendMailObjLib_TLB; // add EASendMail unit type TForm1 = class(TForm) Button1: TButton; Label1: TLabel; procedure Button1Click(Sender: TObject); // Event handler procedure procedure OnAuthenticated(ASender: TObject); procedure OnConnected(ASender: TObject); procedure OnClosed(ASender: TObject); procedure OnError(ASender: TObject; lError: Integer; const ErrDescription: WideString); procedure OnSending(ASender: TObject; lSent: Integer; lTotal: Integer); private { Private declarations } public { Public declarations } end; const ConnectNormal = 0; ConnectSSLAuto = 1; ConnectSTARTTLS = 2; ConnectDirectSSL = 3; ConnectTryTLS = 4; var Form1: TForm1; m_bFinished : Boolean; m_bError : Boolean; implementation {$R *.dfm} procedure TForm1.OnAuthenticated(ASender: TObject); begin Label1.Caption := 'Authenticated'; end; procedure TForm1.OnConnected(ASender: TObject); begin Label1.Caption := 'Connected'; end; procedure TForm1.OnClosed(ASender: TObject); begin if not m_bError then Label1.Caption := 'email was sent successfully'; m_bFinished := true; end; procedure TForm1.OnError(ASender: TObject; lError: Integer; const ErrDescription: WideString); begin Label1.Caption := 'Failed to send email with error: ' + ErrDescription; m_bError := true; m_bFinished := true; end; procedure TForm1.OnSending(ASender: TObject; lSent: Integer; lTotal: Integer); begin Label1.Caption := Format('Sending %d/%d ...', [lSent, lTotal]); end; procedure TForm1.Button1Click(Sender: TObject); var oSmtp : TMail; begin oSmtp := TMail.Create(Application); oSmtp.LicenseCode := 'TryIt'; // Your SMTP server address oSmtp.ServerAddr := 'smtp.emailarchitect.net'; // User and password for ESMTP authentication, oSmtp.UserName := 'test@emailarchitect.net'; oSmtp.Password := 'testpassword'; // ConnectTryTLS means if server supports SSL/TLS connection, SSL/TLS is used automatically oSmtp.ConnectType := ConnectTryTLS; // If your server uses 587 port // oSmtp.ServerPort := 587; // If your server uses 465 port with SSL/TLS // oSmtp.ConnectType := ConnectSSLAuto; // oSmtp.ServerPort := 465; // If your server uses 25/587 port with SSL/TLS // oSmtp.ConnectType := ConnectSSLAuto; // oSmtp.ServerPort := 587; // Set your sender email address oSmtp.FromAddr := 'test@emailarchitect.net'; // Add recipient email address oSmtp.AddRecipientEx('support@emailarchitect.net', 0); // Set email subject oSmtp.Subject := 'simple email from Delphi project'; // Set body text oSmtp.BodyText := 'this is a test email sent from delphi'; m_bError := false; m_bFinished := false; // Set Asynchronous mode oSmtp.Asynchronous := 1; // Add event handler oSmtp.OnConnected := OnConnected; oSmtp.OnClosed := OnClosed; oSmtp.OnError := OnError; oSmtp.OnSending := OnSending; oSmtp.OnAuthenticated := OnAuthenticated; Button1.Enabled := false; Label1.Caption := 'start to send email ...'; oSmtp.SendMail(); // Wait for the result while not m_bFinished do Application.ProcessMessages(); ShowMessage(Label1.Caption); Button1.Enabled := true; end; end.
[VC++ - Send Email Asynchronously] #include "stdafx.h" #include <tchar.h> #include <Windows.h> #include "EASendMailObj.tlh" using namespace EASendMailObjLib; const int ConnectNormal = 0; const int ConnectSSLAuto = 1; const int ConnectSTARTTLS = 2; const int ConnectDirectSSL = 3; const int ConnectTryTLS = 4; #define IDC_SRCIMAIL 1 static _ATL_FUNC_INFO OnClosed = {CC_STDCALL, VT_EMPTY, 0}; static _ATL_FUNC_INFO OnSending = {CC_STDCALL, VT_EMPTY, 2, {VT_I4, VT_I4}}; static _ATL_FUNC_INFO OnError = {CC_STDCALL, VT_EMPTY, 2, {VT_I4, VT_BSTR}}; static _ATL_FUNC_INFO OnConnected = {CC_STDCALL, VT_EMPTY, 0}; static _ATL_FUNC_INFO OnAuthenticated = {CC_STDCALL, VT_EMPTY, 0}; class CMailEvents:public IDispEventSimpleImpl<IDC_SRCIMAIL, CMailEvents, &__uuidof(_IMailEvents)> { public: CMailEvents(){}; BEGIN_SINK_MAP(CMailEvents) SINK_ENTRY_INFO(IDC_SRCIMAIL, __uuidof(_IMailEvents), 1, &CMailEvents::OnClosedHandler, &OnClosed) SINK_ENTRY_INFO(IDC_SRCIMAIL, __uuidof(_IMailEvents), 2, &CMailEvents::OnSendingHandler, &OnSending) SINK_ENTRY_INFO(IDC_SRCIMAIL, __uuidof(_IMailEvents), 3, &CMailEvents::OnErrorHandler, &OnError) SINK_ENTRY_INFO(IDC_SRCIMAIL, __uuidof(_IMailEvents), 4, &CMailEvents::OnConnectedHandler, &OnConnected) SINK_ENTRY_INFO(IDC_SRCIMAIL, __uuidof(_IMailEvents), 5, &CMailEvents::OnAuthenticatedHandler, &OnAuthenticated) END_SINK_MAP() public: BOOL m_bError; BOOL m_bFinished; _bstr_t m_lastError; protected: HRESULT __stdcall OnClosedHandler() { m_bFinished = TRUE; return S_OK; } HRESULT __stdcall OnSendingHandler(long nSent, long nTotalSize) { _tprintf(_T("Sending %d/%d ...\r\n"), nSent, nTotalSize); return S_OK; } HRESULT __stdcall OnErrorHandler(long nErrorCode, BSTR ErrorMessage) { m_bFinished = TRUE; m_bError = TRUE; m_lastError = ErrorMessage; return S_OK; } HRESULT __stdcall OnConnectedHandler() { _tprintf(_T("Connected\r\n")); return S_OK; } HRESULT __stdcall OnAuthenticatedHandler() { _tprintf(_T("Authenticated\r\n")); return S_OK; } }; int _tmain(int argc, _TCHAR* argv[]) { ::CoInitialize(NULL); IMailPtr oSmtp = NULL; oSmtp.CreateInstance(__uuidof(EASendMailObjLib::Mail)); oSmtp->LicenseCode = _T("TryIt"); // Your SMTP server address oSmtp->ServerAddr = _T("smtp.emailarchitect.net"); // User and password for ESMTP authentication oSmtp->UserName = _T("test@emailarchitect.net"); oSmtp->Password = _T("test"); // ConnectTryTLS means if server supports SSL/TLS connection, SSL/TLS is used automatically oSmtp->ConnectType = ConnectTryTLS; // If your server uses 587 port // oSmtp->ServerPort = 587; // If your server uses 465 port with SSL/TLS // oSmtp->ConnectType = ConnectSSLAuto; // oSmtp->ServerPort = 465; // If your server uses 25/587 port with SSL/TLS // oSmtp->ConnectType = ConnectSSLAuto; // oSmtp->ServerPort = 587; // Set your sender email address oSmtp->FromAddr = _T("test@emailarchitect.net"); // Add recipient email address oSmtp->AddRecipientEx(_T("support@emailarchitect.net"), 0); // Set email subject oSmtp->Subject = _T("email from Visual C++ project in asynchronous mode "); // Set email body oSmtp->BodyText = _T("this is a test email sent from Visual C++ asynchronously"); _tprintf(_T("Start to send email ...\r\n")); // Attach event connection pointer CMailEvents oEvents; oEvents.DispEventAdvise(oSmtp.GetInterfacePtr()); oEvents.m_bFinished = FALSE; oEvents.m_bError = FALSE; // Set asynchronous mode oSmtp->Asynchronous = 1; oSmtp->SendMail(); // Waiting for email sending ... while(!oEvents.m_bFinished) { MSG msg; while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if(msg.message == WM_QUIT) return 0; TranslateMessage(&msg); DispatchMessage(&msg); } // You can do other thing here ::Sleep(10); } // Detach event connection pointer oEvents.DispEventUnadvise(oSmtp.GetInterfacePtr()); if(!oEvents.m_bError) { _tprintf(_T("email was sent successfully!\r\n")); } else { _tprintf(_T("failed to send email with the following error: %s\r\n"), (const TCHAR*)oEvents.m_lastError); } return 0; }

See Also

SendMail Method
Terminate Method
EASendMail Samples
Programming with Asynchronous Mode
Work with EASendMail Service(Mail Queuing)

Online Tutorials

Send Email in VB 6.0 - Tutorial
Send Email in Visual C++ - Tutorial
Send Email in Delphi - Tutorial
Send Email in MS SQL stored procedure - Tutorial