首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何异步发送邮件?

如何异步发送邮件?
EN

Stack Overflow用户
提问于 2013-03-01 00:13:55
回答 3查看 13.3K关注 0票数 0
代码语言:javascript
复制
namespace Binarios.admin
{
    public class SendEmailGeral
    {
        public SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
        public MailMessage msg = new MailMessage();

        public void Enviar(string sendFrom, string sendTo, string subject, string body)
        {    
            string pass = "12345";
            System.Net.NetworkCredential smtpCreds = new System.Net.NetworkCredential(sendFrom, pass);

            //setup SMTP Host Here
            client.UseDefaultCredentials = false;
            client.Credentials = smtpCreds;
            client.EnableSsl = true;

            MailAddress to = new MailAddress(sendTo);
            MailAddress from = new MailAddress(sendFrom);

            msg.IsBodyHtml = true;
            msg.Subject = subject;
            msg.Body = body;
            msg.From = from;
            msg.To.Add(to);

            client.Send(msg);
        }
    }
}

我有这段代码,但我想改进它,让我可以异步发送邮件。你能建议任何想法来改进这段代码或其他方式吗?我尝试过visual studio建议的异步属性,但无法使用它们。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-03-01 00:24:57

SmtpClient允许您异步发送,并在发送完成时使用事件通知您。这可能不好用,所以您可以创建一个扩展方法来返回一个Task

代码语言:javascript
复制
public static Task SendAsync(this SmtpClient client, MailMessage message)
{
    TaskCompletionSource<object> tcs = new TaskCompletionSource<object>();
    Guid sendGuid = Guid.NewGuid();

    SendCompletedEventHandler handler = null;
    handler = (o, ea) =>
    {
        if (ea.UserState is Guid && ((Guid)ea.UserState) == sendGuid)
        {
            client.SendCompleted -= handler;
            if (ea.Cancelled)
            {
                tcs.SetCanceled();
            }
            else if (ea.Error != null)
            {
                tcs.SetException(ea.Error);
            }
            else
            {
                tcs.SetResult(null);
            }
        }
    };

    client.SendCompleted += handler;
    client.SendAsync(message, sendGuid);
    return tcs.Task;
}

要获得发送任务的结果,可以使用ContinueWith

代码语言:javascript
复制
Task sendTask = client.SendAsync(message);
sendTask.ContinueWith(task => {
    if(task.IsFaulted) {
        Exception ex = task.InnerExceptions.First();
        //handle error
    }
    else if(task.IsCanceled) {
        //handle cancellation
    }
    else {
        //task completed successfully
    }
});
票数 11
EN

Stack Overflow用户

发布于 2013-03-01 00:19:47

大胆猜测,但SendAsync可能会做这项工作!

票数 1
EN

Stack Overflow用户

发布于 2013-03-01 00:20:26

将您的代码更改为:

代码语言:javascript
复制
 client.Send(msg);

至:

代码语言:javascript
复制
client.SendAsync(msg);

更多细节

link1

link2

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15140308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档