【问题标题】:System.Net.Mail and MailMessage not Sending Messages ImmediatelySystem.Net.Mail 和 MailMessage 不立即发送消息
【发布时间】:2011-11-16 05:52:43
【问题描述】:

当我使用 System.Net.Mail 发送邮件时,邮件似乎不会立即发送。他们需要一两分钟才能到达我的收件箱。一旦我退出应用程序,所有消息都会在几秒钟内收到。是否有某种邮件消息缓冲区设置可以强制 SmtpClient 立即发送消息?

public static void SendMessage(string smtpServer, string mailFrom, string mailFromDisplayName, string[] mailTo, string[] mailCc, string subject, string body)
{
    try
    {
        string to = mailTo != null ? string.Join(",", mailTo) : null;
        string cc = mailCc != null ? string.Join(",", mailCc) : null;

        MailMessage mail = new MailMessage();
        SmtpClient client = new SmtpClient(smtpServer);

        mail.From = new MailAddress(mailFrom, mailFromDisplayName);
        mail.To.Add(to);

        if (cc != null)
        {
            mail.CC.Add(cc);
        }

        mail.Subject = subject;
        mail.Body = body.Replace(Environment.NewLine, "<BR>");
        mail.IsBodyHtml = true;

        client.Send(mail);
    }
    catch (Exception ex)
    {
        logger.Error("Failure sending email.", ex);
    }

谢谢,

标记

【问题讨论】:

  • 您使用的是Send 还是SendAsync?您是直接发送到您的电子邮件服务器还是通过其他 SMTP 服务器发送?
  • 请注意,当我给自己发一封电子邮件时,它几乎是立即通过的,所以它不是 smtp 服务器。
  • 使用发送。我刚刚添加了我的辅助方法...
  • 您的服务器是本地的(例如您的本地 IIS)还是远程服务器(或服务——如 SendMail)?
  • SmtpClient 池连接。因此,SmtpClient 实例不知道您何时完成。 Dispose 告诉SmtpClient 实例您已完成并在所有已建立的连接上发送QUIT 消息,然后关闭 TCP 连接,然后释放套接字。因此,将您对SmtpClient 的使用包装在一个using 块中,或者在您调用SmtpClient.Dispose 的地方添加一个finally 块。

标签: c# smtp smtpclient system.net.mail mailmessage


【解决方案1】:

如果您使用的是 Dotnet 4.0,请试试这个

using (SmtpClient client = new SmtpClient(smtpServer))  
{
    MailMessage mail = new MailMessage();
    // your code here.

    client.Send(mail);
}

这将处理您的 client 实例,使其使用 QUIT 协议元素结束其 SMTP 会话。

如果您卡在较早的 dotnet 版本上,请尝试安排为您的程序发送的每条消息重新使用相同的 SmtpClient 实例。

当然,请记住,电子邮件本质上是一个存储转发系统,从 smtp 发送到接收的延迟没有任何同步(甚至是正式可预测的)。

【讨论】:

  • 太棒了!这样做。除非按照您提到的方式处理,否则可能还有更多延迟工作不会立即执行。
【解决方案2】:

我同意奥利的观点。 要回答您的问题,不,我不相信您可以通过表单设置任何缓冲区设置。

您的问题令人困惑的是,您说邮件需要一两分钟才能到达您的收件箱,但接着又说当发送给您自己时,他们会立即通过……我相信您的意思是在内部,消息发送正常,问题仅发生在外部地址。在这种情况下,听起来您的电子邮件服务器可能会将这些消息排在其他发往外部地址的电子邮件后面(这是正常活动)。在外部站点上等待一两分钟的电子邮件并不是等待的时间。

但是,这不太可能,但是您的 Exchange 服务器是否设置为扫描外发邮件?

【讨论】:

  • 当我说发送自己时,我的意思是当我在 Outlook 中打开一条新消息并给自己发送电子邮件时,它会立即进入我自己的收件箱。当我使用上面的代码向自己发送电子邮件(发送到相同的地址)时,消息需要一两分钟才能显示在我的收件箱中。
  • 这更有意义。我不认为这是一个扫描问题,也许是交换服务器上的中继设置?
  • 参见上面的 cmets。 @Jason 更详细地解释了这个问题。
猜你喜欢
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 2023-01-09
  • 2017-05-31
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
相关资源
最近更新 更多