2010-02-05 7 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 и некоторое время меньше, чем остальные из них доставляются. и у меня есть проверка всех этих сообщений об ошибке, у которых есть действительный адрес электронной почты. не знаю, в чем проблема. Мне действительно нужна помощь в этом.

Edit: Это мое исключение Трассировка

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

ответ

3

Очевидно, эта проблема решена только путем увеличения размера очереди на моем стороннем SMTP-сервере. , но ответ Nip звучит так, как будто это тоже полезно.

1

какая ошибка вы получаете это SmtpFailedrecipientException? если это так, вы можете проверить список innerexceptions и просмотреть StatusCode, чтобы получить дополнительную информацию. ссылка ниже, имеет много полезной информации

MSDN

Edit для новой информации

Thisis проблемы с найти свой SMTP-сервер от того, что я могу видеть, если вы говорите, что это происходит только на некоторых писем. Используете ли вы более одного сервера smtp, и если это возможно, вы можете передать проблему до одного, в частности, если это не так, что скорость/количество отправляемых вами сообщений вызывает причину вашего SMTP-сервера.

+0

Спасибо Pharabus, я изменил свой вопрос с исключением trace.it говорит «net_io_connectionclosed», что это значит? – Nnp

+0

Спасибо, Pharabus, я использую только один SMTP-сервер для всех. я нашел это http://forums.asp.net/t/924682.aspx, в последнем посте этого форума кто-то говорит использовать lient.ServicePoint.MaxIdleTime = 1; Имеет ли это смысл? – Nnp

+0

Я бы определенно посмотрел на это, другое, что вы могли бы сделать, это поставить паузу секунды или около того в цикле в зависимости от того, как вы хотите использовать цикл (очевидно, 1 сек пауза против 60 000 циклов добавляет достаточно задержки для этого процесс) – Pharabus

8

Ну, «отказ от отправки электронной почты», мы надеемся, будет иметь более подробную информацию. Но есть несколько вещей, которые могут вызвать это.

  1. Ограничения на адрес «От». Если вы используете разные адреса, некоторые могут быть заблокированы вашей службой SMTP от возможности отправки.
  2. Предотвращение наводнений на вашем SMTP-сервисе может прекратить выпуск электронных писем.

Независимо от того, является ли это одной из этих или иных ошибок, вы захотите взглянуть на исключение и внутреннее исключение, чтобы получить более подробную информацию.

+0

Спасибо Митчел, я использую тот же «от» адрес электронной почты для всех, но большинство из них доставлено. это означает, что опция (2) не указана для проверки? – Nnp

+0

Да, это очень возможно. Многие службы SMTP имеют конфигурацию X на Y для дроссельной заслонки. Если вы фиксируете полное исключение, включая внутреннее исключение, вы должны быть в состоянии получить немного больше информации о ситуации. –

+0

Спасибо Mitchel, я изменил свой вопрос с исключением trace.it говорит «net_io_connectionclosed», что это значит? – Nnp

2

У меня возникла такая же проблема при отправке электронной почты большого объема. Установка deliveryMethod собственности на PickupDirectoryFromIis исправила его для меня. Также не создавайте новый SmtpClient каждый раз.

+0

Спасибо Nip, вы используете локальный smtp-сервер? case i имеет сторонний smtp (с фиксированным ip), работает ли эта работа с сторонним сервером? – Nnp

+0

Ну, с набором 'PickupDirectoryFromIis', файл EML сохраняется в каталоге, из которого IIS подбирает электронные письма для отправки. Вы все еще можете проверить это, изменив локальную конфигурацию smtp: IIS-> сервер SMTP по умолчанию -> свойства -> доставка -> расширенный, а затем вы можете настроить интеллектуальный хост как ваш IP-адрес вашей сторонней стороны. – Romhein

1

Для нас все было в порядке, электронные письма очень маленькие, и не многие из них отправлены, и он с трудом дал эту ошибку. Оказалось, что технический специалист установил ASTARO, который предотвращал отправку электронной почты. и мы получили эту ошибку, так что да, ошибка немного загадочна, но я надеюсь, что это может помочь другим.

1

Видя вашу петлю для отправки электронных писем и ошибки, которые вы предоставили, есть только решение.
Объявите объект почты вне цикла и назначьте fromaddress из цикла, который вы используете для отправки писем. Поле fromaddress получает назначение снова и снова в цикле, что является вашей проблемой.

0

Эта ошибка может возникнуть, если веб-сервер не может получить доступ к почтовому серверу. Убедитесь, что веб-сервер может связаться с почтовым сервером, например, с помощью pinging.

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(); 
Смежные вопросы