Partilhar via


SmtpClient.SendAsync Método

Definição

Envia uma mensagem de email. Esses métodos não bloqueiam o thread de chamada.

Sobrecargas

SendAsync(MailMessage, Object)

Envia a mensagem de email especificada para entrega a um servidor SMTP. Esse método não bloqueia o thread de chamada e permite que o chamador passe um objeto para o método invocado quando a operação é concluída.

SendAsync(String, String, String, String, Object)

Envia uma mensagem de email para entrega a um servidor SMTP. O remetente, os destinatários, o assunto e o corpo da mensagem são especificados usando objetos String. Esse método não bloqueia o thread de chamada e permite que o chamador passe um objeto para o método invocado quando a operação é concluída.

SendAsync(MailMessage, Object)

Origem:
SmtpClient.cs
Origem:
SmtpClient.cs
Origem:
SmtpClient.cs

Envia a mensagem de email especificada para entrega a um servidor SMTP. Esse método não bloqueia o thread de chamada e permite que o chamador passe um objeto para o método invocado quando a operação é concluída.

public:
 void SendAsync(System::Net::Mail::MailMessage ^ message, System::Object ^ userToken);
public void SendAsync (System.Net.Mail.MailMessage message, object? userToken);
public void SendAsync (System.Net.Mail.MailMessage message, object userToken);
member this.SendAsync : System.Net.Mail.MailMessage * obj -> unit
Public Sub SendAsync (message As MailMessage, userToken As Object)

Parâmetros

message
MailMessage

Um MailMessage que contém a mensagem a ser enviada.

userToken
Object

Um objeto definido pelo usuário passado para o método invocado quando a operação assíncrona é concluída.

Exceções

message é null.

- ou -

From é null.

Isso SmtpClient tem outra operação de envio já em andamento.

- ou -

Não há nenhum destinatário especificado nas propriedades To, CC e Bcc.

- ou -

A propriedade DeliveryMethod é definida como Network e Host é null.

- ou -

A propriedade DeliveryMethod é definida como Network e Host é igual à cadeia de caracteres vazia ("").

- ou -

A propriedade DeliveryMethod é definida como Network e Port é zero, um número negativo ou maior que 65.535.

O objeto foi descartado.

Falha na conexão com o servidor SMTP.

- ou -

Falha na autenticação.

- ou -

Tempo limite da operação esgotado.

- ou -

EnableSsl é definido como true, mas a propriedade DeliveryMethod é definida como SpecifiedPickupDirectory ou PickupDirectoryFromIis.

- ou -

EnableSsl é definido como true,, mas o servidor de email SMTP não anunciou STARTTLS na resposta para o comando EHLO.

- ou -

O message não pôde ser entregue a um ou mais dos destinatários em To, CC ou Bcc.

O message não pôde ser entregue a um dos destinatários em To, CC ou Bcc.

O message não pôde ser entregue a dois ou mais dos destinatários em To, CC ou Bcc.

Exemplos

O exemplo de código a seguir demonstra como chamar esse método.

#using <System.dll>
using namespace System;
using namespace System::Net;
using namespace System::Net::Mail;
using namespace System::Net::Mime;
using namespace System::Threading;
using namespace System::ComponentModel;

static bool mailSent;

static void SendCompletedCallback(Object^ sender, AsyncCompletedEventArgs^ e)
{
    // Get the unique identifier for this asynchronous 
    // operation.
    String^ token = (String^) e->UserState;

    if (e->Cancelled)
    {
        Console::WriteLine("[{0}] Send canceled.", token);
    }
    if (e->Error != nullptr)
    {
        Console::WriteLine("[{0}] {1}", token, 
            e->Error->ToString());
    } else
    {
        Console::WriteLine("Message sent.");
    }
    mailSent = true;
}

int main(array<String^>^ args)
{
    if (args->Length > 1)
    {
        // Command-line argument must be the SMTP host.
        SmtpClient^ client = gcnew SmtpClient(args[1]);
        // Specify the email sender.
        // Create a mailing address that includes a UTF8 
        // character in the display name.
        MailAddress^ from = gcnew MailAddress("jane@contoso.com",
            "Jane " + (wchar_t)0xD8 + " Clayton",
            System::Text::Encoding::UTF8);
        // Set destinations for the email message.
        MailAddress^ to = gcnew MailAddress("ben@contoso.com");
        // Specify the message content.
        MailMessage^ message = gcnew MailMessage(from, to);
        message->Body = "This is a test email message sent" +
            " by an application. ";
        // Include some non-ASCII characters in body and 
        // subject.
        String^ someArrows = gcnew String(gcnew array<wchar_t>{L'\u2190', 
            L'\u2191', L'\u2192', L'\u2193'});
        message->Body += Environment::NewLine + someArrows;
        message->BodyEncoding = System::Text::Encoding::UTF8;
        message->Subject = "test message 1" + someArrows;
        message->SubjectEncoding = System::Text::Encoding::UTF8;
        // Set the method that is called back when the send
        // operation ends.
        client->SendCompleted += gcnew
            SendCompletedEventHandler(SendCompletedCallback);
        // The userState can be any object that allows your 
        // callback method to identify this send operation.
        // For this example, the userToken is a string constant.
        String^ userState = "test message1";
        client->SendAsync(message, userState);
        Console::WriteLine("Sending message... press c to" +
            " cancel mail. Press any other key to exit.");
        String^ answer = Console::ReadLine();
        // If the user canceled the send, and mail hasn't been 
        // sent yet,then cancel the pending operation.
        if (answer->ToLower()->StartsWith("c") && mailSent == false)
        {
            client->SendAsyncCancel();
        }
        // Clean up.
        delete message;
        client = nullptr;
        Console::WriteLine("Goodbye.");
    }
    else
    {
        Console::WriteLine("Please give SMTP server name!");
    }
}

using System;
using System.Net;
using System.Net.Mail;
using System.Net.Mime;
using System.Threading;
using System.ComponentModel;
namespace Examples.SmtpExamples.Async
{
    public class SimpleAsynchronousExample
    {
        static bool mailSent = false;
        private static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
        {
            // Get the unique identifier for this asynchronous operation.
             String token = (string) e.UserState;

            if (e.Cancelled)
            {
                 Console.WriteLine("[{0}] Send canceled.", token);
            }
            if (e.Error != null)
            {
                 Console.WriteLine("[{0}] {1}", token, e.Error.ToString());
            } else
            {
                Console.WriteLine("Message sent.");
            }
            mailSent = true;
        }
        public static void Main(string[] args)
        {
            // Command-line argument must be the SMTP host.
            SmtpClient client = new SmtpClient(args[0]);
            // Specify the email sender.
            // Create a mailing address that includes a UTF8 character
            // in the display name.
            MailAddress from = new MailAddress("jane@contoso.com",
               "Jane " + (char)0xD8+ " Clayton",
            System.Text.Encoding.UTF8);
            // Set destinations for the email message.
            MailAddress to = new MailAddress("ben@contoso.com");
            // Specify the message content.
            MailMessage message = new MailMessage(from, to);
            message.Body = "This is a test email message sent by an application. ";
            // Include some non-ASCII characters in body and subject.
            string someArrows = new string(new char[] {'\u2190', '\u2191', '\u2192', '\u2193'});
            message.Body += Environment.NewLine + someArrows;
            message.BodyEncoding =  System.Text.Encoding.UTF8;
            message.Subject = "test message 1" + someArrows;
            message.SubjectEncoding = System.Text.Encoding.UTF8;
            // Set the method that is called back when the send operation ends.
            client.SendCompleted += new
            SendCompletedEventHandler(SendCompletedCallback);
            // The userState can be any object that allows your callback
            // method to identify this send operation.
            // For this example, the userToken is a string constant.
            string userState = "test message1";
            client.SendAsync(message, userState);
            Console.WriteLine("Sending message... press c to cancel mail. Press any other key to exit.");
            string answer = Console.ReadLine();
            // If the user canceled the send, and mail hasn't been sent yet,
            // then cancel the pending operation.
            if (answer.StartsWith("c") && mailSent == false)
            {
                client.SendAsyncCancel();
            }
            // Clean up.
            message.Dispose();
            Console.WriteLine("Goodbye.");
        }
    }
}

Imports System.Net
Imports System.Net.Mail
Imports System.Net.Mime
Imports System.Threading
Imports System.ComponentModel

Namespace Examples.SmtpExamples.Async
    Public Class SimpleAsynchronousExample
        Private Shared mailSent As Boolean = False
        Private Shared Sub SendCompletedCallback(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
            ' Get the unique identifier for this asynchronous operation.
            Dim token As String = CStr(e.UserState)

            If e.Cancelled Then
                Console.WriteLine("[{0}] Send canceled.", token)
            End If
            If e.Error IsNot Nothing Then
                Console.WriteLine("[{0}] {1}", token, e.Error.ToString())
            Else
                Console.WriteLine("Message sent.")
            End If
            mailSent = True
        End Sub
        Public Shared Sub Main(ByVal args() As String)
            ' Command line argument must the SMTP host.
            Dim client As New SmtpClient(args(0))
            ' Specify the email sender.
            ' Create a mailing address that includes a UTF8 character
            ' in the display name.
            Dim mailFrom As New MailAddress("jane@contoso.com", "Jane " & ChrW(&HD8) & " Clayton", System.Text.Encoding.UTF8)
            ' Set destinations for the email message.
            Dim mailTo As New MailAddress("ben@contoso.com")
            ' Specify the message content.
            Dim message As New MailMessage(mailFrom, mailTo)
            message.Body = "This is a test email message sent by an application. "
            ' Include some non-ASCII characters in body and subject.
            Dim someArrows As New String(New Char() {ChrW(&H2190), ChrW(&H2191), ChrW(&H2192), ChrW(&H2193)})
            message.Body += Environment.NewLine & someArrows
            message.BodyEncoding = System.Text.Encoding.UTF8
            message.Subject = "test message 1" & someArrows
            message.SubjectEncoding = System.Text.Encoding.UTF8
            ' Set the method that is called back when the send operation ends.
            AddHandler client.SendCompleted, AddressOf SendCompletedCallback
            ' The userState can be any object that allows your callback 
            ' method to identify this send operation.
            ' For this example, the userToken is a string constant.
            Dim userState As String = "test message1"
            client.SendAsync(message, userState)
            Console.WriteLine("Sending message... press c to cancel mail. Press any other key to exit.")
            Dim answer As String = Console.ReadLine()
            ' If the user canceled the send, and mail hasn't been sent yet,
            ' then cancel the pending operation.
            If answer.StartsWith("c") AndAlso mailSent = False Then
                client.SendAsyncCancel()
            End If
            ' Clean up.
            message.Dispose()
            Console.WriteLine("Goodbye.")
        End Sub
    End Class
End Namespace

Comentários

Para receber uma notificação quando o email tiver sido enviado ou a operação tiver sido cancelada, adicione um manipulador de eventos ao SendCompleted evento. Você pode cancelar uma SendAsync operação chamando o SendAsyncCancel método .

Depois de chamar SendAsync, você deve aguardar a conclusão da transmissão de email antes de tentar enviar outra mensagem de email usando Send ou SendAsync.

Antes de chamar esse método, o Host e Port devem ser definidos por meio dos arquivos de configuração definindo as propriedades relevantes ou passando essas informações para o SmtpClient(String, Int32) construtor.

Se o host SMTP exigir credenciais, você deverá defini-las antes de chamar esse método. Para especificar credenciais, use as UseDefaultCredentials propriedades ou Credentials .

Se você receber uma exceçãoSmtpException, marcar a StatusCode propriedade para localizar o motivo pelo qual a operação falhou. O SmtpException também pode conter uma exceção interna que indica o motivo pelo qual a operação falhou.

Ao enviar emails usando SendAsync para vários destinatários, se o servidor SMTP aceitar alguns destinatários como válidos e rejeitar outros, um SmtpException será lançado com um NullReferenceException para a exceção interna. Se isso ocorrer, SendAsync não será possível enviar emails para qualquer um dos destinatários.

Seu aplicativo pode detectar um erro de validação de certificado do servidor examinando a Error propriedade passada para o SendCompletedEventHandler delegado.

A Timeout propriedade não tem nenhum efeito em uma SendAsync chamada.

Para enviar emails e bloquear enquanto ele é transmitido para o servidor SMTP, use um dos Send métodos .

Observação

Se a EnableSsl propriedade estiver definida truecomo e o servidor de email SMTP não anunciar STARTTLS na resposta ao comando EHLO, uma chamada para os Send métodos ou SendAsync gerará um SmtpException.

Aplica-se a

SendAsync(String, String, String, String, Object)

Origem:
SmtpClient.cs
Origem:
SmtpClient.cs
Origem:
SmtpClient.cs

Envia uma mensagem de email para entrega a um servidor SMTP. O remetente, os destinatários, o assunto e o corpo da mensagem são especificados usando objetos String. Esse método não bloqueia o thread de chamada e permite que o chamador passe um objeto para o método invocado quando a operação é concluída.

public:
 void SendAsync(System::String ^ from, System::String ^ recipients, System::String ^ subject, System::String ^ body, System::Object ^ userToken);
public void SendAsync (string from, string recipients, string? subject, string? body, object? userToken);
public void SendAsync (string from, string recipients, string subject, string body, object userToken);
member this.SendAsync : string * string * string * string * obj -> unit
Public Sub SendAsync (from As String, recipients As String, subject As String, body As String, userToken As Object)

Parâmetros

from
String

Um String que contém as informações de endereço do remetente da mensagem.

recipients
String

Um String que contém o endereço aos quais a mensagem é enviada.

subject
String

Um String que contém a linha do assunto da mensagem.

body
String

Um String que contém o corpo da mensagem.

userToken
Object

Um objeto definido pelo usuário passado para o método invocado quando a operação assíncrona é concluída.

Exceções

from é null.

- ou -

recipient é null.

from é Empty.

- ou -

recipient é Empty.

Este SmtpClient tem uma chamada de SendAsync em andamento.

- ou -

A propriedade DeliveryMethod é definida como Network e Host é null.

- ou -

A propriedade DeliveryMethod é definida como Network e Host é igual à cadeia de caracteres vazia ("").

- ou -

A propriedade DeliveryMethod é definida como Network e Port é zero, um número negativo ou maior que 65.535.

O objeto foi descartado.

Falha na conexão com o servidor SMTP.

- ou -

Falha na autenticação.

- ou -

Tempo limite da operação esgotado.

- ou -

EnableSsl é definido como true, mas a propriedade DeliveryMethod é definida como SpecifiedPickupDirectory ou PickupDirectoryFromIis.

- ou -

EnableSsl é definido como true,, mas o servidor de email SMTP não anunciou STARTTLS na resposta para o comando EHLO.

- ou -

A mensagem não pôde ser entregue a um ou mais destinatários em recipients.

O message não pôde ser entregue a um dos destinatários em To, CC ou Bcc.

O message não pôde ser entregue a dois ou mais dos destinatários em To, CC ou Bcc.

Comentários

Para receber uma notificação quando o email tiver sido enviado ou a operação tiver sido cancelada, adicione um manipulador de eventos ao SendCompleted evento. Você pode cancelar uma SendAsync operação chamando o SendAsyncCancel método .

Depois de chamar SendAsync, você deve aguardar a conclusão da transmissão de email antes de tentar enviar outra mensagem de email usando Send ou SendAsync.

Antes de chamar esse método, as Host propriedades e Port devem ser definidas por meio dos arquivos de configuração ou definindo as propriedades ou passando essas informações para o SmtpClient(String, Int32) construtor.

Se o host SMTP exigir credenciais, você deverá defini-las antes de chamar esse método. Para especificar credenciais, use a UseDefaultCredentials propriedade ou Credentials .

Se você receber uma exceçãoSmtpException, marcar a StatusCode propriedade para localizar o motivo pelo qual a operação falhou. O SmtpException também pode conter uma exceção interna que indica o motivo pelo qual a operação falhou.

Ao enviar emails usando SendAsync para vários destinatários, se o servidor SMTP aceitar alguns destinatários como válidos e rejeitar outros, um SmtpException será gerado com um NullReferenceException para a exceção interna. Se isso ocorrer, SendAsync não será possível enviar emails para qualquer um dos destinatários.

Seu aplicativo pode detectar um erro de validação de certificado do servidor examinando a Error propriedade passada para o SendCompletedEventHandler delegado.

A Timeout propriedade não tem nenhum efeito em uma SendAsync chamada.

Para enviar emails e bloquear enquanto ele é transmitido para o servidor SMTP, use um dos Send métodos.

Observação

Se a EnableSsl propriedade estiver definida como truee o servidor de email SMTP não anunciar STARTTLS na resposta ao comando EHLO, uma chamada para os Send métodos ou SendAsync gerará um SmtpException.

Aplica-se a