J'utilise un composant de service via ASP.NET MVC. Je voudrais envoyer l'email de manière asynchrone pour laisser l'utilisateur faire d'autres choses sans avoir à attendre l'envoi.Comment envoyer un email avec des pièces jointes en utilisant SmtpClient.SendAsync?
Lorsque j'envoie un message sans pièce jointe, cela fonctionne correctement. Lorsque j'envoie un message avec au moins une pièce jointe en mémoire, cela échoue. Donc, je voudrais savoir s'il est possible d'utiliser une méthode asynchrone avec des pièces jointes en mémoire.
Voici la méthode d'envoi
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);
}
}
Voici mon erreur actuelle
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 ---
Solution
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);
}
Je devrais mettre plus de code, désolé à ce sujet. Permettez-moi de modifier l'échantillon pour vous donner plus d'informations. – labilbe
Est-il possible que les appels asynchrones s'exécutant sur le serveur VS Dev ne soient pas réellement appelés Async? Ma mémoire floue essaye de se rappeler quelque chose a dit quelque chose au sujet du serveur de serveur de VS de VS est le fil simple? –
Le lien est mort maintenant. –