2010-02-05 161 views
11

这里是我的代码smtpclient“发送邮件失败”

for(int i = 0; i < number ; i++) 
{ 
MailAddress to = new MailAddress(iMail.to); 
MailAddress from = new MailAddress(iMail.from, iMail.displayName); 
string body = iMail.body; 
string subject = iMail.sub; 
oMail = new MailMessage(from, to); 
oMail.Subject = subject; 
oMail.Body = body; 
oMail.IsBodyHtml = true; 
oMail.Priority = MailPriority.Normal; 
oMail.Sender = from; 
s = new SmtpClient(smtpServer); 
if (s != null) 
{ 
 s.Send(oMail); 
} 
oMail.Dispose(); 
s = null; 
} 

这个循环将超过60000电子邮件。但我的问题是,我在某些电子邮件中发送“发送邮件失败”的次数是5000次,而其他一些邮件的发送次数少了一次。并且我检查了所有这些错误,电子邮件有有效的电子邮件地址。不知道是什么问题。我真的需要帮助。

编辑:这是我的异常跟踪

Error - Failure sending mail.; Inner Ex - System.IO.IOException: Unable to read data from the transport connection: net_io_connectionclosed. at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine) at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine) at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller) at System.Net.Mail.CheckCommand.Send(SmtpConnection conn, String& response) at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from) at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception)

+0

我相信这可以帮助任何人谁也有类似的问题。 http://support.microsoft.com/kb/2183292/en-us – curiousBoy 2013-08-27 18:00:50

回答

3

显然这个问题得到了只是我的第三方SMTP服务器上增加队列的大小来解决。 但聂的答案听起来像它也是相当有用的

1

你得到了什么错误是一个SmtpFailedrecipientException?如果是这样,您可以检查innerexceptions列表并查看StatusCode以获取更多信息。下面的链接有一些很好的信息

MSDN

编辑新信息

THISIS从我所看到的,找到你的SMTP服务器问题,但你说,这只是发生在一些电子邮件。你是否使用多个smtp服务器,如果是这样的话,也许你可以将问题简化为一个特别的问题,如果不是这样,可能是因为你发送的邮件的速度/数量正在导致你的smtp服务器出现问题。

+0

谢谢Pharabus,我修改了我的问题,例外trace.it说“net_io_connectionclosed”,这是什么意思? – Nnp 2010-02-05 19:39:06

+0

谢谢Pharabus,我只用一个smtp服务器。我发现这个 http://forums.asp.net/t/924682.aspx,在这个论坛的最后一篇文章有​​人说使用lient.ServicePoint.MaxIdleTime = 1;那有意义吗? – Nnp 2010-02-05 20:03:54

+0

我肯定会看看,你可以做的另一件事是在循环中放置一秒钟左右的时间,具体取决于你想要如何使用循环(显然,1秒暂停与60,000循环相比,增加了相当多的延迟过程) – Pharabus 2010-02-05 20:18:26

8

好了,“失败时发送电子邮件”应该希望有更多的细节。但有几件事可能会导致这种情况。

  1. 在 “发件人” 地址限制。如果您使用的地址不同,有些可能会被SMTP服务阻止,无法发送。
  2. 您的SMTP服务防洪可能会阻止电子邮件外出。

无论是这些还是其他错误之一,您都会想要查看异常和内部异常以获得更多详细信息。

+0

感谢Mitchel,我使用同一个“from”电子邮件地址,但其中大多数已交付。这意味着选项(2)不需要检查? – Nnp 2010-02-05 19:14:47

+0

是的,这是非常可能的。许多SMTP服务具有X Y配置来限制。如果您捕捉到完整的例外情况(包括内部例外情况),则应该能够更清楚地了解情况。 – 2010-02-05 19:39:01

+0

谢谢Mitchel,我修改了我的问题,但有异常trace.it说“net_io_connectionclosed”,这是什么意思? – Nnp 2010-02-05 19:40:03

2

我发送大量电子邮件时经历了同样的问题。将deliveryMethod属性设置为PickupDirectoryFromIis为我解决了这个问题。 也不要每次创建一个新的SmtpClient。

+0

谢谢聂,你使用本地smtp服务器?在我的如果我有第三方smtp(与固定ip),这项工作是否修复与第三方服务器的工作? – Nnp 2010-02-09 17:44:33

+0

好吧,与'PickupDirectoryFromIis'设置,EML文件被保存到目录从IIS拿起电子邮件发送。您仍然可以通过更改您的本地smtp配置来进行测试:IIS->默认SMTP服务器 - >属性 - >传递 - >高级,然后您可以将智能主机设置为您的三方IP地址。 – Romhein 2010-02-09 18:20:33

1

对于我们来说,一切都很好,电子邮件是非常小的,并没有很多他们发送和sudently它给这个错误。看起来,一位技术员安装了ASTARO,它阻止了电子邮件的发送。我们得到这个错误,所以是的错误是有点神秘,但我希望这可以帮助其他人。

1

看到你的循环发送电子邮件,你只要有唯一的解决办法的错误。
声明邮件对象不在循环中,并将fromaddress指定为用于发送邮件的循环。 fromaddress字段在您的问题的循环中一次又一次地分配。当Web服务器无法访问邮件服务器会出现

0

此错误。确保Web服务器可以访问邮件服务器,例如ping它。

0

五年后(我希望这个开发商是不是仍然在等待一个修复这个..)

我有同样的问题,引起了同样的错误:我宣布在循环内SmtpClient

解决方法是简单的 - 申报一次,在循环外...

MailAddress mail = null; 
SmtpClient client = new SmtpClient(); 
client.Port = 25; 
client.EnableSsl = false; 
client.DeliveryMethod = SmtpDeliveryMethod.Network; 
client.UseDefaultCredentials = true; 
client.Host = smtpAddress;  // Enter your company's email server here! 

for(int i = 0; i < number ; i++) 
{ 
    mail = new MailMessage(iMail.from, iMail.to); 
    mail.Subject = iMail.sub; 
    mail.Body = iMail.body; 
    mail.IsBodyHtml = true; 
    mail.Priority = MailPriority.Normal; 
    mail.Sender = from; 
    client.Send(mail); 
} 
mail.Dispose(); 
client.Dispose();