【问题标题】:SmtpClient does not close session after sending messageSmtpClient 发送消息后不关闭会话
【发布时间】:2010-01-07 07:52:10
【问题描述】:

我有一个使用内置邮件框架的 asp.net 发送电子邮件的功能。我已经把它包括在下面了。

public void SendMessage()
{
    var message = new MailMessage();
    var client = new SmtpClient();

    // Get the Message Envelope Details
    this.LoadMessageDetailsFromFile();

    // Process rules (if any): Rules engine not implemented yet!
    this.SetConfiguration(message);

    // Formats the message body template using XSLT
    this.FormatMessageBody(message);

    // Adds the attachments 
    this.AddAttachments(message);


    // Send the mail
    client.Timeout = 999999999;
    client.Send(message);

    //Clean up attachments
    foreach (var attachment in message.Attachments)
    {
        attachment.Dispose();
    }
}

现在总消息大小绝不会超过 10MB,但是交换会产生一个错误,指出 20MB 是每个会话的最大大小。 .net 是否以某种方式将消息批量发送到 SMTP?为什么会产生这个错误,即使每次我发送电子邮件时,我都会创建一个新的 SMtpClient 对象?

确切的 Exchange 错误:会话大小超过了固定的最大会话大小

似乎下划线连接被重用了,即使您创建了新的 SMTPClient 实例。

任何人都知道解决方法,以下不起作用:

Smtp client = new SmtpClient("hostname");
client.ServicePoint.MaxIdleTime = 0;
client.ServicePoint.ConnectionLimit = 1;

提前致谢

【问题讨论】:

  • SMTP 服务器设置的主机是 Exchange 服务器本身吗?
  • 我建议您查看 Exchange 日志(如果可能的话),从 Exchange 的角度检查循环是否实际上被视为一个会话。
  • 谢谢,这个函数是一个类的一部分,我在主循环中从这个类实例化了一个新对象。当然这意味着每次对象超出范围时都会销毁 smtp 客户端对象?
  • 旁注:您的清理循环可以替换为message.Dispose();,它应该包含所有附件。文档中有一条注释,上面写着“在发布对 MailMessage 的最后引用之前始终调用 Dispose。”
  • 您是否尝试设置 client.ServicePoint.MaxIdleTime = 1 ?

标签: .net email


【解决方案1】:

电子邮件中的附件使用 base64 进行编码,这可能会使附件变得相当大,具体取决于文件的内容。来自the Wikipedia article on base64

因此,实际长度 符合 MIME 的 base64 编码二进制 数据通常约为 137% 原始数据长度,虽然对于非常 短消息的开销可以是 高很多,因为开销 标题。很粗略,最后 base64 编码的二进制数据的大小是 等于原始数据的1.37倍 大小 + 814 字节(用于标头)。在 换句话说,你可以近似 解码数据的大小 公式:字节= (string_length(encoded_string) - 814) / 1.37。请注意,这些 公式不应该用于 计算确切的内存大小 保存编码数据,因为它们非常 粗糙并在两者中产生错误 方向

【讨论】:

  • 确实很有趣,但是如果我从最大附件大小 10MB 开始,那么这肯定不会使邮件大小加倍吗?
  • 这不太可能,但可能。这取决于文件的内容,文本文件通常不会增长太多,但二进制文件可能会增长。为什么不尝试对附件进行编码并检查大小?您可能会对结果感到惊讶。
  • 妈的,太吓人了……嗯,“不错”的发现。
【解决方案2】:

在 v4 Beta 2 以下的 .net 框架中提供的任何 SMTPClient 都存在问题,并且从不向 SMTP 服务器发送 QUIT 命令。没有解决方法。解决方案是使用第 3 方应用程序发送电子邮件。 .net 无法在将会话大小限制为 20MB 的 SMTP 服务器上进行群发电子邮件。

【讨论】:

  • 当我在这里谈论质量时,不是在谈论向地球发送垃圾邮件,而是在谈论在 Intranet 中发送 10 条消息......
猜你喜欢
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多