【发布时间】: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 ?