发送消息后,SmtpClient不会关闭会话

时间:2010-01-07 07:52:10

标签: .net email

我有一个使用内置邮件框架的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;

提前致谢

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

v4 Beta 2下面的.net框架提供的任何SMTPClient都是错误的,并且永远不会向SMTP服务器发送QUIT命令。没有解决方法。解决方案是使用第三方应用程序发送电子邮件。 .net无法在SMTP服务器上批量发送电子邮件,将其会话大小限制为20MB。