Ler em inglês

Compartilhar 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, object? userToken);
public void SendAsync (System.Net.Mail.MailMessage message, object userToken);

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;
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.");
        }
    }
}

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

.NET 9 e outras versões
Produto Versões
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1

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 (string from, string recipients, string? subject, string? body, object? userToken);
public void SendAsync (string from, string recipients, string subject, string body, object userToken);

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

.NET 9 e outras versões
Produto Versões
.NET Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 2.0, 2.1