Estoy usando un componente de servicio a través de ASP.NET MVC. Me gustaría enviar el correo electrónico de manera asíncrona para que el usuario pueda hacer otras cosas sin tener que esperar el envío.¿Cómo enviar un correo electrónico con archivos adjuntos utilizando SmtpClient.SendAsync?
Cuando envío un mensaje sin archivos adjuntos funciona bien. Cuando envío un mensaje con al menos un archivo adjunto en memoria, falla.
Entonces, me gustaría saber si es posible utilizar un método asíncrono con archivos adjuntos en memoria.
Aquí es el método de envío
public static void Send() {
MailMessage message = new MailMessage("[email protected]", "[email protected]");
using (MemoryStream stream = new MemoryStream(new byte[64000])) {
Attachment attachment = new Attachment(stream, "my attachment");
message.Attachments.Add(attachment);
message.Body = "This is an async test.";
SmtpClient smtp = new SmtpClient("localhost");
smtp.Credentials = new NetworkCredential("foo", "bar");
smtp.SendAsync(message, null);
}
}
Aquí está mi error actual
System.Net.Mail.SmtpException: Failure sending mail.
---> System.NotSupportedException: Stream does not support reading.
at System.Net.Mime.MimeBasePart.EndSend(IAsyncResult asyncResult)
at System.Net.Mail.Message.EndSend(IAsyncResult asyncResult)
at System.Net.Mail.SmtpClient.SendMessageCallback(IAsyncResult result)
--- End of inner exception stack trace ---
Solución
public static void Send()
{
MailMessage message = new MailMessage("[email protected]", "[email protected]");
MemoryStream stream = new MemoryStream(new byte[64000]);
Attachment attachment = new Attachment(stream, "my attachment");
message.Attachments.Add(attachment);
message.Body = "This is an async test.";
SmtpClient smtp = new SmtpClient("localhost");
//smtp.Credentials = new NetworkCredential("login", "password");
smtp.SendCompleted += delegate(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
System.Diagnostics.Trace.TraceError(e.Error.ToString());
}
MailMessage userMessage = e.UserState as MailMessage;
if (userMessage != null)
{
userMessage.Dispose();
}
};
smtp.SendAsync(message, message);
}
Debería poner más código, perdón por eso. Déjeme editar la muestra para darle más información. – labilbe
Podría ser posible que las llamadas Async que se ejecutan en el servidor de VS Dev no se llamen realmente Async. Mi memoria borrosa está tratando de recordar algo que se dice en alguna parte sobre el servidor web VS Dev es de un solo hilo? –
El enlace está muerto ahora. –