2009-07-17 5 views
37

Nie można przetestować wysyłania wiadomości e-mail z kodu .NET w systemie Windows Vista Business."Nie można odczytać danych z połączenia transportowego: net_io_connectionclosed." - Windows Vista Business i SMTP

Piszę kod, który będę migrować do pakietu SSIS, gdy tylko zostanie sprawdzony. Kod wysyła wiadomość o błędzie pocztą elektroniczną do listy odbiorców.

Kod znajduje się poniżej, jednak otrzymuję wyjątek podczas wykonywania kodu.

Stworzyłem prostą klasę zrobić mailing ... konstrukcja może być lepiej, jestem testowania funkcjonalności przed wprowadzeniem bardziej niezawodne funkcje, metody itd

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);    
    } 
} 

Exception Message

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: 
+0

Nie udzielę odpowiedzi na tę wiadomość tylko dlatego, że nie wiem wystarczająco dużo o SMTP, aby się z tym dobrze czuć. Jednak to z pewnością brzmi jak problem środowiskowy (prawdopodobnie w ustawieniach IIS). Czy używasz 1) "localhost" dla smtp.Host 2) zdalnego serwera dla smtp.Host i/lub 3) konkretnego IP zamiast nazwy hosta? –

+0

I mój host poczty jest określany przez nazwę. Przykład "wymiana". Przetestowałem DNS poprzez pingowanie serwera. To się udało. Przetestowałem również dostęp do portu przez telnet do portu 25. To również się udało. Przetestowałem kod na innym komputerze i mogłem wysłać wiadomość. Wydaje mi się, że muszę zainstalować jakiś rodzaj usługi/protokołu SMTP na komputerze. Maszyna, na której nie działa kod, to Windows Vista Business. Testy zakończyły się pomyślnie w systemie Windows Server 2008 Standard. –

+0

proszę odnieść się do: http://stackoverflow.com/questions/13689265/net-3-5-smtpclient-failure-sending-email-works-only-after-restarting-everyt/14272912#14272912 –

Odpowiedz

1

Znalazłem, że Vista Business OS nie jest wyposażony w SMTP IIS. Podejrzewam, że to brakujący element układanki. Czy ktoś miał szczęście w tym problemie?

6

Jeśli określono adres IP w ustawieniach usługi SMTP, upewnij się, że podajesz adres IP urządzenia w IIS7 i nie wstawiasz localhost.

IIS7 ułatwia wybrać „localhost”, ale że doprowadzi do tego błędu, jeśli na przykład jest IP 10.0.0.1

1

Czy Twój kod incompleted.Dash jest poprawna w identyfikacji it.Other wtedy SMTP wyboru komponent jest zainstalowany lub nie check link text

3

Vista i Windows 7 nie ma żadnego serwera SMTP, obiekt ten został usunięty, ponieważ Windows XP, więc trzeba skonfigurować swój serwer SMTP wyraźnie, kilka narzędzi są dostępne na rynku, które możesz to sprawdzić. Również po skonfigurowaniu protokołu SMTP pamiętaj, aby sprawdzić nazwę serwera, którego chcesz użyć do wysłania wiadomości e-mail.

0

uaktualnienie do .NET 4.0 i stosować wszystkie aktualizacje zabezpieczeń

16

Istnieje kilka rzeczy, które mogą powodować ten problem, a oto niektóre z rzeczy, które znalazłem. Pytania: Wspominasz o "Exchange" - czy to jest serwer wymiany? Czy host wymaga uwierzytelnienia (być może musisz dodać uwierzytelnienie do klienta)? Najpierw spróbuję wykonać przypisanie hosta do statycznego adresu IP zamiast nazwy hosta, aby sprawdzić, czy to działa jako pierwsze. Jeśli tak, to najprawdopodobniej problem z mapowaniem DNS.

If you are running your exchange server with Virtualization, you need to configure the SmtpClient to the host IP of the Virtual Server, not the physical hosting server name or IP. Right click on Default SMTP virtual server, select Properties, then go to Access tab, click Relay then add the IP address of the computer that send SMTP request to the SMTP server. (ASP.net site)

Jeśli to nie zadziała, to dlatego, że serwer blokuje się od wysyłania pakietów SMTP. Musisz upewnić się, że dodajesz skrzynkę, do której wysyłasz wiadomości SMTP z serwera SMTP. Odbywa się to za pośrednictwem karty uwierzytelniania IIS.

Chciałbym również podkreślić, że należy zlikwidować klienta poczty lub użyć klienta w instrukcji "przy użyciu". To sprawi, że "WYJDŹ" zostanie wysłane na serwer i płynnie zamknie połączenie.

+1

Mam problem znalezienie wszystkiego, co potwierdza instrukcję using, wysyła QUIT po zakończeniu. W skrócie, jak z wdziękiem zamknąć połączenie bez użycia instrukcji. – Zman101

+0

Jeśli zajrzysz do dokumentacji SmtpClient.Dispose(), zobaczysz: "Wysyła komunikat QUIT do serwera SMTP, kończy z wdzięknością połączenie TCP i zwalnia wszystkie zasoby używane przez bieżące wystąpienie Systemu Klasa .Net.Mail.SmtpClient. " –

7

Uruchom ponownie IIS. Wiem, że to brzmi głupio, zrobić restart na wszystko. (i przepraszam, że podniosłem stary wątek). Ale czasami ponowne uruchomienie IIS działa magicznie. Zmierzyłem dokładnie ten sam problem i ponownie go rozwiązałem.

Może się zdarzyć, ponieważ tymczasowo nazwa "localhost" nie może zostać rozwiązana. Właśnie wysyłam tutaj, aby ktoś, kto staje przed nim teraz, prawdopodobnie spróbuje tej szybkiej poprawki, zanim podejmie próbę dalszego zbadania. Nadzieję, że pomoże

+1

miła niespodzianka ... działa !!! – sawe

1

Jestem stoi ten problem ostatni 6hr i jestem nowy na tym, więc staram się rozwiązać ten problem w następujący sposób

1) Otworzyłem okno wiersza polecenia (np Ctrl + R wpisz cmd i wprowadź).
2) I sprawdź na serwerze SMTP i sprawdź odpowiedź.
3) Jeśli otrzyma odpowiedź, oznacza to, że wszystko jest w porządku i następny krok 4 inna nazwa SMTP jest nieprawidłowa.
4) Następnie sprawdzam przez port telnetowy smtp (np. 25), czy jest otwarty czy nie.
5) Za pomocą tego cmd sprawdzamy odpowiedź SMTP.
6) telnet "yoursmtpname" „nr_portu” (np telnet smtp.gmail.com 25)
7) Jeżeli telnet nie działa, należy zainstalować lub dodać z panelu sterowania w dodawać nowe funkcje.
8) Jeśli to działa to jest to wynik wprost podobne.
9) 220 mx.google.com ESMTP.

Stosując powyższe kroki możemy dowiedzieć się połączenie SMTP jest gotowy lub nie do wysyłania poczty.

2

I Miałem ten sam problem, ponieważ miałem wiele adresów IP na moim serwerze er (Virtual Servers) i mój gospodarz wskazując localhost podczas gdy mój SMTP Virtual Server został przydzielony do jednego konkretnego adresu IP:

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

Istnieją 2 rozwiązań tego problemu:

  1. zmienić kod i ustaw hosta na konkretny adres IP, który jest używany przez serwer wirtualny SMTP zamiast localhost.
  2. Change IP SMTP Virtual Server do Wszystkie nieprzypisane

Aby sprawdzić/zmienić SMTP Server IP wirtualna: prawym przyciskiem myszy na Default SMTP Virtual Server, wybierz Właściwości, na karcie General zmiany/zobaczyć adres IP.

Mam nadzieję, że to uratuje czyjś dzień z tym samym problemem.

1

Opracowałem aplikację usługi systemu Windows w VB przy użyciu .NET Framework v4.5 i ostatnio wystąpił ten problem.

Po pierwsze, małe tło - wpadł mi w błąd PO po próbach uporania się z błędem "Usługa niedostępna, zamknięcie kanału transmisji." Odpowiedź serwera: Błąd: za dużo wiadomości w jednej sesji ", która została rozwiązana przez wywołanie metody Dispose w obiekcie SmtpClient po wysłaniu każdego e-maila.Aby być bardzo bezpiecznym, nazwałem także Dispose na obiekcie MailMessage.

OK, więc teraz problem "za dużo wiadomości w jednej sesji" został rozwiązany, ale od czasu do czasu otrzymałem komunikat "Nie można odczytać danych z połączenia transportowego: net_io_connectionclosed". Niesamowite. Okazuje się, że nie zaimplementowałem mojej klasy e-mailowej konsekwentnie - w jednym przypadku była ona usuwana, podczas gdy w drugiej nie była.

Oto przykład tego, co rozwiązano kwestii zarówno dla mnie (to jest w VB ale masz pomysł):

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 

Moja klasa email jest, między innymi, ma 2 Właściwości - Wiadomość (System.Net .Mail.MailMessage) i Server (System.Net.Mail.SmtpClient), które są usuwane w tym przykładzie.

Nie miałem żadnego problemu po setkach e-maili, gdy każde wystąpienie wysyłające e-maile w mojej usłudze zostało zaimplementowane w ten sposób.

Powiązane problemy