【发布时间】:2013-01-19 11:38:45
【问题描述】:
我最近用 C# 设计了一个程序,该程序将从 SQL 数据库中提取信息,编写一个带有结果的 HTML 页面,然后自动通过电子邮件发送出去。我已经 [偶尔] 一切正常,我遇到的问题是我似乎正在崩溃我们公司的交换服务器。在程序的前几次成功运行后,我将开始收到此异常:
基本异常:System.Net.Mail.SmtpException:系统存储空间不足。服务器响应为:4.3.1 系统资源不足
我想知道我是否应该在我的邮件中调用某种类似 Dispose() 的方法?或者,如果有任何其他明显的原因会导致邮件系统停止响应?这会影响我们公司的所有客户,而不仅仅是我的代码。
这是 Exchange 2010,我的代码是针对 .NET 3.5 编译的。我的附件通常是 27kb。如果我登录到交换服务器,似乎消息只是无限期地留在队列中。清除队列(删除而不发送 NDR)并重新启动服务器将使其再次运行。
邮件部分如下所示(用户名、密码和地址已更改):
public void doFinalEmail()
{
List<string> distList = new List<string>();
string distListPath = Environment.CurrentDirectory + "\\DistList.txt";
string aLine;
logThat("Attempting email distribution of the generated report.");
if (File.Exists(distListPath))
{
FileInfo distFile = new FileInfo(distListPath);
StreamReader distReader = distFile.OpenText();
while (!String.IsNullOrEmpty(aLine = distReader.ReadLine()))
{
distList.Add(aLine);
}
}
else
{
logThat("[[ERROR]]: Distribution List DOES NOT EXIST! Path: " + distListPath);
}
MailMessage msg = new MailMessage();
MailAddress fromAddress = new MailAddress("emailaddresshere");
msg.From = fromAddress;
logThat("Recipients: ");
foreach (string anAddr in distList)
{
msg.To.Add(anAddr);
logThat("\t" + anAddr);
}
if (File.Exists(Program.fullExportPath))
{
logThat("Attachment: " + Program.fullExportPath);
Attachment mailAttachment = new Attachment(Program.fullExportPath);
msg.Attachments.Add(mailAttachment);
string subj = "Company: " + Program.yestFileName;
msg.Subject = subj;
msg.IsBodyHtml = true;
msg.BodyEncoding = System.Text.Encoding.UTF8;
sendMail(msg);
}
else
{
logThat("[[ERROR]]: ATTACHMENT DOES NOT EXIST! Path: " + Program.fullExportPath);
}
}
public void sendMail(MailMessage msg)
{
try
{
string username = "user"; //domain user
string password = "pass"; // password
SmtpClient mClient = new SmtpClient();
mClient.Host = "192.168.254.11";
mClient.Credentials = new NetworkCredential(username, password);
mClient.DeliveryMethod = SmtpDeliveryMethod.Network;
mClient.Send(msg);
}
catch (Exception oops)
{
string whatHappened = String.Format("Company: \r\nFailure in {0}! \r\n\r\nError message: {1} \r\nError data: {2} \r\n\r\nStack trace: {3} \r\n\r\nBase exception: {4} \r\nOccuring in method: {5} with a type of {6}\r\n", oops.Source, oops.Message, oops.Data, oops.StackTrace, oops.GetBaseException(), oops.TargetSite, oops.GetType());
logThat(whatHappened);
Environment.Exit(1);
}
}
【问题讨论】:
-
你可能是对的——SmtpClient 是 IDisposable。 MailMessage 和附件也是如此。
-
检查硬盘上的可用空间量
-
我会补充一点,我认为我们在未正确处理 SmtpClient 时看到了相同的错误消息。
-
硬盘空间在发送服务器、交换服务器和客户端(我自己)上看起来不错,但我的邮箱大小也远远不足。奥斯汀,我看不到任何方法可以在我的 SmtpClient 上调用 dispose,但我注意到我没有定义超时。我想知道它是否会在超时后自动处理?
-
您不能将您的 SmtpClient 实例放在 using 块中吗?还是直接调用 mClient.Dispose() ?
标签: c# exchange-server system.net.mail smtpexception