Подтвердить что ты не робот

"Невозможно прочитать данные из транспортного соединения: net_io_connection закрыто". - Windows Vista Business и SMTP

Невозможно проверить отправку электронной почты с .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("[email protected]");            

        //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: 
4b9b3361

Ответ 1

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

Если вы используете сервер обмена с виртуализацией, вам необходимо настроить 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)
}

Ответ 2

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

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

Ответ 3

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

IIS7 упрощает выбор "localhost", но это приведет к этой ошибке, если IP, например, 10.0.0.1

Ответ 4

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

Также следуйте приведенной ниже ссылке, чтобы соответственно обновить реле почтового сервера:

Почтовый ящик недоступен. Ответ сервера: 5.7.1 Не удалось передать для [email protected]

Ответ 5

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

Ответ 6

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

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

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

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

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

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

Ответ 7

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

Ответ 8

Не заполнен ли ваш код .Dash корректен при идентификации его. Другой, если установлен компонент smtp, установлен или нет проверьте текст ссылки

Ответ 9

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

1) Я открыл командную строку (например, Ctrl + R type cmd и введите).
2) И проверьте на SMTP-сервер ping и проверьте ответ.
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 готово или не отправляет почту.

Ответ 10

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

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

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

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

With New clsEmail(True)
    With .Message
        .To.Add("[email protected]")
        .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), которые находятся в этом примере.

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

Ответ 11

перейти на .NET 4.0 и применить все обновления для системы безопасности