【问题标题】:How do I avoid a delay when sending email from my application?从我的应用程序发送电子邮件时如何避免延迟?
【发布时间】:2020-09-17 02:15:57
【问题描述】:

我有一个小型控制台应用程序。它会检查一些设置,做出一些决定,然后发送电子邮件。问题是直到我的申请完成后才真正发送电子邮件。我希望在发送电子邮件的方法完成后立即发送电子邮件。

最初,我只是创建了一个 MailMessage 并调用 .Send()。就在那时,我注意到直到应用完成后才会发送邮件。

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

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

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

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

【问题讨论】:

  • 您有多大把握在应用关闭之前不会发送它? Send() 是一种同步方法。可能是 Smtp 服务器有延迟。
  • @Kevin - 我在逐步完成发送的方法后等待。 SMTPClient.Send() 已经执行,我正在使用另一种方法。我等待了 15 分钟以上,但收件箱中没有任何内容。我一按 F5,消息就会在应用程序完成后的一两秒内出现。如果我不等待(让应用程序在没有断点的情况下运行),消息会在一两秒内出现。
  • 您的 SMTP 服务器是本地机器还是在另一台机器上?
  • @Kevin - SMTP 服务器在我们的 LAN 上,而不是本地。
  • 我觉得这个场景很奇怪。我所能提供给您的只是尝试运行 Fiddler 并查看数据包何时发送到 SMTP 服务器。它应该在 .Send() 完成后立即发送,但您可以仔细检查,它可能会为您提供更多信息。

标签: c# .net-4.0


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您应该使用 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);
      

      在这个阶段您的邮件将被发送。

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

      【讨论】:

        【解决方案4】:

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

        编辑:使用 smtp 服务器名称和端口号填充变量主机、端口。

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

        如果您仍然遇到延迟,那么延迟将出现在邮件服务器上。

        【讨论】:

          【解决方案5】:

          只需在 .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();
          

          【讨论】:

          • 这对延迟有什么帮助?
          【解决方案6】:

          使用带有设置的 SmtpClient:

          smtpClient.ServicePoint.MaxIdleTime = 2;
          

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

          【讨论】:

            猜你喜欢
            • 2013-03-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-20
            • 1970-01-01
            • 2011-04-13
            • 2018-01-17
            相关资源
            最近更新 更多