从应用程序发送电子邮件时如何避免延迟?

时间:2011-09-07 19:20:01

标签: c# .net-4.0

我有一个小型控制台应用程序。它会检查一些设置,做出一些决定并发送电子邮件。问题是在我的申请完成之前,电子邮件实际上并未发送。我想在发送电子邮件的方法完成后立即发送电子邮件。

最初,我刚刚创建了一个MailMessage并调用了.Send()。就在那时我注意到在应用程序完成之前没有发送邮件。

然后我尝试使用任务并行库。

var taskA = Task.Factory.StartNew(() => msg.Send());

同样,在整个应用程序完成之前,消息才会被发送。

如何在msg.send执行时发送电子邮件,而不是在应用完成时发送电子邮件?

谢谢!

6 个答案:

答案 0 :(得分:3)

SmptClient支持通过SendAsync异步发送邮件,但实际上在Web应用程序中会挂起请求线程。

为避免阻止,我建议使用ThreadPool在后​​台线程中触发电子邮件。这不会阻止您的申请。

ThreadPool.QueueUserWorkItem(o => {
    using (SmtpClient client = new SmtpClient(...))
    {
        using (MailMessage mailMessage = new MailMessage(...))
        {
            client.Send(mailMessage, Tuple.Create(client, mailMessage));
        }
    }
}); 

答案 1 :(得分:1)

您应该使用SMTP客户端。这样做:

            MailMessage mm = new MailMessage();
            //fill in your message
            NetworkCredential nc = new NetworkCredential(FromAddress, FromPassword);
            SmtpClient sc = new SmtpClient(SmtpHost, SmtpPort);
            sc.EnableSsl = true;
            sc.Credentials = nc;
            sc.Send(mm);

在此阶段,您的邮件将被发送。

但是,发送电子邮件是一种异步行为,因此在您收到邮件之前需要一些时间。

答案 2 :(得分:0)

避免延迟的最可靠的方法可能是使用一个拾取目录,该目录将对消息进行排队而不是立即发送。

答案 3 :(得分:0)

创建一个新的MailMessage并使用SmtpClient发送它。它会立即发送。我将添加一个例子。

编辑:使用smtp服务器名称和端口号填充变量host,port。

using (var mailer = new SmtpClient(host, port))
{
    using (var message = new MailMessage(sender, recipient, subject, body) { IsBodyHtml = false })
    {
        mailer.UseDefaultCredentials = false;
        mailer.Credentials = new NetworkCredential(user, pass);
        mailer.EnableSsl = useSSL;
        mailer.Timeout = Timeout;
        mailer.Send(message);

    }
}

如果您仍然遇到延迟,则延迟将在邮件服务器上。

答案 4 :(得分:0)

只需在.Send()函数之后处理MailMessage和SmtpClient对象。

SmtpClient smtpClient = new SmtpClient("server", 25);
smtpClient.UseDefaultCredentials = true;

MailMessage message = new MailMessage("ToAddress","FromAddress");
message.Subject = "Test email";
message.Body = "Test email";

smtpClient.Send(message);

message.Dispose();
smtpClient.Dispose();

答案 5 :(得分:0)

使用SmtpClient设置:

smtpClient.ServicePoint.MaxIdleTime = 2;

https://weblogs.asp.net/stanleygu/tip-14-solve-smtpclient-issues-of-delayed-email-and-high-cpu-usage