"Невозможно прочитать данные из транспортного соединения: net_io_connectionclosed." - Windows Vista Business и SMTP - PullRequest
37 голосов
/ 17 июля 2009

Невозможно проверить отправку электронной почты из кода .NET в Windows Vista Business.

Я пишу код, который перенесу в пакет служб SSIS, как только он будет проверен. Код для отправки сообщения об ошибке по электронной почте списку получателей.

Код ниже, однако я получаю исключение при выполнении кода.

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

namespace LabDemos
{
    class Program
    {
        static void Main(string[] args)
        {
            Mailer m = new Mailer();
            m.test();    
        }
    }
}

namespace LabDemos
{
    class MyMailer
    {    
        List<string> _to = new List<string>();
        List<string> _cc = new List<string>();
        List<string> _bcc = new List<string>();
        String _msgFrom = "";
        String _msgSubject = "";
        String _msgBody = "";            

        public void test(){
        //create the mail message
        MailMessage mail = new MailMessage();

        //set the addresses
        mail.From = new MailAddress("me@domain.com");            

        //set the content
        mail.Subject = "This is an email";
        mail.Body = "this is a sample body";
        mail.IsBodyHtml = false;    

        //send the message
        SmtpClient smtp = new SmtpClient();
        smtp.Host = "emailservername";
        smtp.Port = 25;
        smtp.UseDefaultCredentials = true;
        smtp.Send(mail);            
    }
}

Сообщение об исключении

Inner Exception
{"Unable to read data from the transport connection: net_io_connectionclosed."}

Stack Trace
"   at System.Net.Mail.SmtpReplyReaderFactory.ProcessRead(Byte[] buffer, Int32 offset, Int32 read, Boolean readLine)\r\n   at System.Net.Mail.SmtpReplyReaderFactory.ReadLines(SmtpReplyReader caller, Boolean oneLine)\r\n   at System.Net.Mail.SmtpReplyReaderFactory.ReadLine(SmtpReplyReader caller)\r\n   at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)\r\n   at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)\r\n   at System.Net.Mail.SmtpClient.GetConnection()\r\n   at System.Net.Mail.SmtpClient.Send(MailMessage message)"


Outer Exception
  System.Net.Mail.SmtpException was unhandled
  Message="Failure sending mail."
  Source="System"
  StackTrace:
       at System.Net.Mail.SmtpClient.Send(MailMessage message)
       at LabDemos.Mailer.test() in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Mailer.cs:line 40
       at LabDemos.Program.Main(String[] args) in C:\Users\username\Documents\Visual Studio 2008\Projects\LabDemos\LabDemos\Program.cs:line 48
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)
       at System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
       at System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
       at System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
       at System.Activator.CreateInstance(ActivationContext activationContext)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.IO.IOException
       Message="Unable to read data from the transport connection: net_io_connectionclosed."
       Source="System"
       StackTrace:
            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.SmtpConnection.GetConnection(String host, Int32 port)
            at System.Net.Mail.SmtpTransport.GetConnection(String host, Int32 port)
            at System.Net.Mail.SmtpClient.GetConnection()
            at System.Net.Mail.SmtpClient.Send(MailMessage message)
       InnerException: 

Ответы [ 11 ]

16 голосов
/ 29 апреля 2011

Есть несколько вещей, которые могут вызвать эту проблему, и вот некоторые из вещей, которые я обнаружил. Вопросы: Вы упоминаете "Exchange" - это сервер обмена? Требует ли хост аутентификации (может быть, вам нужно добавить аутентификацию для клиента)? Сначала я бы назначил хосту статический IP-адрес вместо имени хоста, чтобы проверить, работает ли он первым. Если это так, то, скорее всего, это проблема с сопоставлением DNS.

Если вы используете сервер Exchange с виртуализацией, вам нужно настроить SmtpClient на IP-адрес хоста виртуального сервера, а не имя или IP-адрес физического хост-сервера. Щелкните правой кнопкой мыши виртуальный SMTP-сервер по умолчанию, выберите «Свойства», затем перейдите на вкладку «Доступ», нажмите «Ретрансляция», затем добавьте IP-адрес компьютера, отправляющего SMTP-запрос на SMTP-сервер. (Сайт ASP.net)

Если это не работает, это потому, что сервер блокирует отправку SMTP-пакетов. Вы должны обязательно добавить ящик, с которого отправляете SMTP-сообщения на SMTP-сервер. Это делается с помощью вкладки аутентификации IIS.

Я также хотел бы отметить, что вы должны утилизировать почтовый клиент или использовать его в выражении «using». Это обеспечит отправку «QUIT» на сервер и корректное закрытие соединения.

using(SmtpClient smtp = new SmtpClient())
{
    smtp.Host = "emailservername";
    smtp.Port = 25;
    smtp.UseDefaultCredentials = true;
    smtp.Send(mail)
}
7 голосов
/ 28 июня 2012

Перезагрузите IIS. Я знаю, это звучит глупо, чтобы сделать перезагрузку для всего. (и извините, что натолкнулся на старую ветку). Но иногда перезапуск IIS работает волшебно. Я столкнулся с точно такой же проблемой, и перезапуск решил ее.

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

6 голосов
/ 06 декабря 2012

Если вы используете localhost (Использовать Localhost) в IIS 7, измените его на IP-адрес компьютера вместо localhost или 127.0.0.1

Также перейдите по ссылке ниже, чтобы соответствующим образом обновить ретрансляцию вашего почтового сервера:

Почтовый ящик недоступен. Ответ сервера: 5.7.1 Невозможно ретранслировать для abc@xyz.com

6 голосов
/ 11 апреля 2010

Если вы указали IP-адрес в настройках службы SMTP, убедитесь, что вы указываете этот IP-адрес устройства в IIS7, а не вводите localhost.

IIS7 позволяет легко выбрать «localhost», но это приведет к этой ошибке, если IP-адрес, например, 10.0.0.1

3 голосов
/ 31 января 2011

Vista и Windows 7 не имеют SMTP-сервера, эта возможность была удалена начиная с Windows XP, поэтому вам нужно явно настроить SMTP-сервер, для этого доступно несколько инструментов, вы можете проверить это. Также после настройки SMTP не забудьте проверить имя сервера, которое вы будете использовать для отправки электронной почты.

2 голосов
/ 12 февраля 2015

У меня была такая же проблема, так как у меня было несколько IP на моем сервере (виртуальные серверы), и мой хост указывал на localhost , в то время как моему виртуальному SMTP-серверу был назначен один конкретный IP:

 <smtp deliveryMethod="Network">
       <network host="localhost" port="25" defaultCredentials="false"/>
 </smtp>

Для этого есть 2 решения:

  1. Измените код и установите для хоста конкретный IP-адрес, который используется виртуальным SMTP-сервером вместо localhost.
  2. Изменить IP-адрес виртуального SMTP-сервера на Все неназначенные

Чтобы просмотреть / изменить IP-адрес виртуального SMTP-сервера: Щелкните правой кнопкой мыши виртуальный SMTP-сервер по умолчанию, выберите «Свойства», на вкладке «Общие» см. Раздел «Изменение IP-адреса».

Надеюсь, это спасет чей-то день с той же проблемой.

1 голос
/ 11 августа 2015

Я разработал приложение Windows Service в VB с использованием .NET Framework v4.5 и недавно столкнулся с этой проблемой.

Во-первых, немного предыстории - я столкнулся с ошибкой ОП после попытки справиться с ошибкой «Служба недоступна, закрытие канала передачи. Ответ сервера был: Ошибка: слишком много сообщений за один сеанс», которая была устранена путем вызова метод Dispose для объекта SmtpClient после каждого отправленного электронного письма. Просто для большей безопасности я также назвал Dispose для объекта MailMessage.

Хорошо, теперь проблема «слишком много сообщений в одном сеансе» решена, но теперь я иногда получаю сообщение об ошибке «Невозможно прочитать данные из транспортного соединения: net_io_connectionclosed». Потрясающие. Оказывается, я не реализовал свой класс электронной почты последовательно - в одном случае он был утилизирован, а в другом - нет.

Вот пример того, что решило обе проблемы для меня (это в VB, но вы поняли):

With New clsEmail(True)
    With .Message
        .To.Add("user@domain.com")
        .Subject = msgSubject
        .Body = msgContents
    End With

    .Server.Send(.Message)
    .Server.Dispose()
    .Message.Dispose()
End With

Мой класс электронной почты имеет, помимо прочего, 2 свойства - Message (System.Net.Mail.MailMessage) и Server (System.Net.Mail.SmtpClient), что и есть в этом примере.

У меня не было ни одной проблемы после сотен электронных писем, так как каждый экземпляр, который отправляет электронную почту в моем сервисе, был реализован таким образом.

1 голос
/ 24 июля 2014

Я столкнулся с этой проблемой в последние 6 часов, и я новичок в этом, поэтому я пытаюсь решить эту проблему следующим образом

1) Я открыл командную строку (например, Ctrl + R, наберите cmd и введите).
2) И проверьте пинг SMTP-сервера и проверьте ответ.
3) Если ответ получен, то все в порядке, и перейти к следующему шагу 4 - другое неправильное имя smtp - неверно.
4) Затем я проверяю, что порт telnet smtp (например, 25) открыт или нет.
5) Используя этот cmd, мы проверяем ответ SMTP.
6) telnet "yoursmtpname" "portno" (например, telnet smtp.gmail.com 25)
7) Если telnet не работает, установите или добавьте его с панели управления, чтобы добавить новые функции.
8) Если это работает, то это результат прохода, как.
9) 220 mx.google.com ESMTP.

Используя вышеперечисленные шаги, мы можем выяснить, готово ли соединение SMTP к отправке почты или нет.

1 голос
/ 19 января 2011

Является ли ваш код незавершенным. Даш верен при его идентификации. Иначе этот компонент проверки SMTP установлен или нет отметьте текст ссылки

1 голос
/ 29 июля 2009

Я обнаружил, что ОС Vista Business не поставляется с IIS SMTP. Я подозреваю, что это недостающий кусочек головоломки. Кому-нибудь повезло с этим вопросом?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...