2013-07-05 7 views
14

Я знаю, что этот вопрос выглядит как дубликат из множества других вопросов, пока его нет.SMTPException: Не удается прочитать данные из транспортного соединения: net_io_connectionclosed

Если когда-нибудь я пытаюсь отправить по электронной почте на моей локальной машине через мой веб-приложения SMTPException отбрасывается и исключения есть:

//on this line : SmtpServer.Send(mail); 
Unable to read data from the transport connection: net_io_connectionclosed. 

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

В то время как на моей локальной машине раньше работали, может ли кто-нибудь дать только подсказку, что может быть проблемой, которая поднимает эту проблему?

ответ

22

Если вы находитесь на жилой подключение к Интернету, довольно часто ваш провайдер будет блокировать исходящую почту отправляет, блокируя все исходящие соединения на порт 25. Это довольно часто здесь в США.Попробуйте подключиться к локальному почтовому серверу через TCP/IP или к одному в вашей собственной внутренней сети.

+0

Это верно, мой интернет-провайдер блокировал соединение, я не знаю, почему они это делали недавно, но поскольку я сказал, что он работал ранее, спасибо, – Hilmi

+2

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

+2

У меня есть AT & T Uverse, и интересно, что порт 587, нацеленный на smtp-сервер gmail, преуспевает, но 465 терпит неудачу с сообщением, приведенным в вопросе выше. – WiSeeker

6

This thread содержит некоторые.

Например, похоже, что assigning a static IP может решить проблему.

Эта ошибка означает, что System.net.mail не смог найти smtp-сервер .

Ответ будет зависеть от того, есть ли у вас фиксированный IP-адрес или динамический IP-адрес , но в основном вам необходимо назначить действительный IP-адрес вашему серверу smtp .

С фиксированными IP-адресами это относительно просто. При динамическом IP-адресе требуется немного подстройки.

Откройте диспетчер IIS и проверьте свойства для сервера smtp.

В свойствах виртуального сервера SMTP по умолчанию, на вкладке «Доступ», в диалоговом окне «Управление подключением и реле», убедитесь, что назначен ваш локальный адрес . (В моем случае это 10.0.0.2 ...)

Возможно, вам также потребуется изменить файл хостов, чтобы указать 127.0.0.1 на имя вашего компьютера. (\ WINDOWS \ system32 \ Drivers \ Etc \ хостов)

Затем в коде, присвоить имя машины клиенту Smtp:

Dim client As New SmtpClient("yourmachinename") client.Send(mail) 

В качестве альтернативы другой парень в том же потоке seems to have found a workaround для Соединение SMTP не было правильно закрыто.

Установите SmtpClient.ServicePoint.MaxIdleTime = 1 согласно поддерживаемым обходным: http://connect.microsoft.com/VisualStudio/feedback/Workaround.aspx?FeedbackID=146711 , что делает все Smtp работу должным образом.

Вот полный пример:

MailMessage msgMail = new MailMessage(); 
msgMail.To.Add(new MailAddress("[email protected]")); 
msgMail.Subject = "Message from web"; 
msgMail.IsBodyHtml = true; 
msgMail.Body = "Test message"; 
SmtpClient Client = new SmtpClient(); /* uses settings form web.config */ 
Client.ServicePoint.MaxIdleTime = 1; /* without this the connection is idle too long and not terminated, times out at the server and gives sequencing errors */ 
Client.Send(msgMail); 
msgMail.Dispose(); 
+1

Если вы установите 'Client.ServicePoint.MaxIdleTime', установите его в 2 вместо 1, чтобы избежать проблем процессора, обсуждаемые здесь: HTTP: // StackOverflow. com/a/1190727/945875 – Justin

-4

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

+0

«Когда я пытаюсь отправить электронное письмо» звучит не так, как если бы OP была массовая рассылка ... –

0

System.Net.NetworkCredential (пользователь, пароль); /// Неверно
System.Net.NetworkCredential (адрес электронной почты, пароль); /// правого

, потому что некоторые сервера электронной почты является shability

Смежные вопросы