2009-07-17 90 views
37

Impossibile verificare l'invio di e-mail dal codice .NET in Windows Vista Business."Impossibile leggere i dati dalla connessione di trasporto: net_io_connectionclosed." - Windows Vista Business e SMTP

Sto scrivendo il codice che migrerò a un pacchetto SSIS una volta provato. Il codice è quello di inviare un messaggio di errore via e-mail a un elenco di destinatari.

Il codice è di seguito, tuttavia ricevo un'eccezione quando eseguo il codice.

ho creato una semplice classe per fare la mailing ... il design potrebbe essere migliore, sto testando le funzionalità prima di implementare funzionalità più robuste, metodi, ecc

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

Messaggio eccezione

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

Non ho intenzione di fornire una risposta per questo semplicemente perché non ne so abbastanza su SMTP per sentirsi bene a riguardo. Tuttavia, questo sicuramente sembra un problema di ambiente (probabilmente nelle impostazioni di IIS). Stai usando 1) "localhost" per smtp.Host 2) un server remoto per smtp.Host e/o 3) un IP specifico piuttosto che un nome host? –

+0

Il mio host di posta viene chiamato per nome. Esempio "scambio". Ho testato il DNS tramite il ping del server. Questo ha avuto successo. Ho anche testato l'accesso alla porta via telnet alla porta 25. Ciò ha avuto anche successo. Ho testato il codice su un'altra macchina e sono riuscito a inviare il messaggio. Mi sembra che ho bisogno di installare un certo tipo di servizio/protocollo SMTP sulla macchina. La macchina su cui è fallito il codice è Windows Vista Business. I test hanno avuto esito positivo su Windows Server 2008 Standard. –

+0

fare riferimento a: http://stackoverflow.com/questions/13689265/net-3-5-smtpclient-failure-sending-email-works-only-after-restarting-everyt/14272912#14272912 –

risposta

1

Ho trovato che il SO di Vista Business non viene fornito con IIS SMTP. Sospetto che questo sia il pezzo mancante del puzzle. Qualcuno ha avuto fortuna con questo problema?

6

Se è stato specificato un indirizzo IP nelle impostazioni del servizio SMTP, assicurarsi di specificare l'indirizzo IP della macchina in IIS7 e non inserire localhost.

IIS7 rende facile selezionare 'localhost', ma che porterà a questo errore se l'IP per esempio, è 10.0.0.1

1

è il codice è corretto incompleted.Dash nell'identificare it.Other allora che smtp controllo componente è installato o meno controllo link text

3

Vista e Windows 7 non ha una server SMTP, questa struttura è stata rimossa a partire da Windows XP, quindi è necessario configurare il server SMTP in modo esplicito, sono disponibili diversi strumenti di mercato per quel , puoi verificarlo. Inoltre, una volta configurato l'SMTP, ricordarsi di controllare il nome del server che si utilizzerà per inviare l'e-mail.

0

aggiornamento a .NET 4.0 e applicare tutti gli aggiornamenti di sicurezza

16

Ci sono molte cose che possono causare questo problema, e qui ci sono alcune delle cose che ho trovato. Domande: Lei parla di "Exchange" - Si tratta di un server di scambio? L'host richiede l'autenticazione (forse è necessario aggiungere l'autenticazione al client)? Quello che proverò a fare prima è assegnare l'host all'indirizzo IP statico invece del nome host per vedere se funziona prima. Se lo fa, probabilmente è un problema con il mapping 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)

Se ciò non funziona, è perché il server sta bloccando l'invio di pacchetti SMTP. È necessario assicurarsi di aggiungere la casella che si sta inviando i messaggi SMTP al server SMTP. Questo viene fatto tramite la scheda di autenticazione di IIS.

Vorrei anche precisare che è necessario disporre del client di posta o utilizzare il client in una istruzione "using". Ciò assicurerà che "QUIT" sia inviato al server e che la connessione venga chiusa con garbo.

using(SmtpClient smtp = new SmtpClient()) 
{ 
    smtp.Host = "emailservername"; 
    smtp.Port = 25; 
    smtp.UseDefaultCredentials = true; 
    smtp.Send(mail) 
} 
+1

Ho problemi trovando qualcosa che conferma un'istruzione using invia il QUIT una volta terminato. In breve come chiudere con garbo la connessione senza un'istruzione using. – Zman101

+0

Se si esaminerà la documentazione di SmtpClient.Dispose(), verrà visualizzato questo: "Invia un messaggio QUIT al server SMTP, termina correttamente la connessione TCP e rilascia tutte le risorse utilizzate dall'istanza corrente del sistema .Net.Mail.SmtpClient class. " –

7

Riavvia IIS. So che sembra sciocco, fare un riavvio per tutto. (e mi dispiace scontrare un vecchio thread). Ma a volte il riavvio di IIS funziona magicamente. Ho affrontato lo stesso identico problema e il riavvio lo ha risolto.

Potrebbe essersi verificata una causa perché temporaneamente il nome "localhost" non può essere risolto. Sto semplicemente postando qui in modo che qualcuno che lo affronta ora probabilmente proverà questa soluzione rapida prima di tentare di indagare ulteriormente. Speranza che aiuta

+1

piacevole sorpresa .. funziona !!! – sawe

1

sto affrontando questo problema ultima 6hr e io sono di nuovo su che così sto cercando di risolvere questo problema in modo seguente

1) ho aperto prompt dei comandi (ad esempio Ctrl + R tipo cmd e invio).
2) E controllare il ping del server SMTP e controllare la risposta.
3) Se si ottiene la risposta, allora va bene e per passare al passaggio successivo 4 l'altro nome smtp saggio è sbagliato.
4) Quindi controllo tramite porta smtp telnet (ad esempio 25) è aperto o no.
5) Usando questo cmd controlliamo la risposta SMTP.
6) telnet "yoursmtpname" "portno” (ad es smtp.gmail.com telnet 25)
7) Se il telnet non funziona, si prega di installare o aggiungere dal pannello di controllo di aggiungere nuove funzionalità.
8) Se funziona allora è il risultato passa simili.
9) 220 mx.google.com ESMTP.

Usando sopra passi possiamo scoprire connessione SMTP è pronto o meno l'invio della posta.

2

I ha avuto lo stesso problema dal momento che avevo più IP sul mio servizio er (server virtuali) e il mio ospite era indicando localhost mentre il mio server virtuale SMTP è stato assegnato a un particolare IP:

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

ci sono 2 soluzioni per questo:

  1. cambiare la vostra codice e impostare l'host per il particolare IP che viene utilizzato dal server virtuale SMTP invece di localhost.
  2. Change SMTP Virtual Server IP per Tutti non assegnati

Per visualizzare/modificare SMTP Virtual Server IP: indirizzo IP clic destro sul server virtuale SMTP predefinito, selezionare Proprietà, sul cambiamento generale scheda/vedere.

Spero che questo salvi la giornata di qualcuno con lo stesso problema.

1

Ho sviluppato un'applicazione di servizio Windows in VB utilizzando .NET Framework v4.5 e di recente ho riscontrato questo problema.

In primo luogo, un po 'di storia - ho incontrato l'errore del PO dopo aver tentato di fare con l'errore che è stato risolto con "Servizio non disponibile, chiusura canale di trasmissione Risposta del server:: Errore troppi messaggi in una sola sessione." chiamando il metodo Dispose sull'oggetto SmtpClient dopo ogni email inviata.Per essere ultra sicuro, ho anche chiamato Dispose sull'oggetto MailMessage.

Bene, ora i 'troppi messaggi in una sessione di' problema è stato risolto, ma ora ho di tanto in tanto ha ottenuto il 'Impossibile leggere i dati dal collegamento: net_io_connectionclosed' errore. Eccezionale. Si scopre che non ho implementato la mia classe di posta elettronica in modo coerente - in un caso, era stato eliminato mentre nell'altro non lo era.

Ecco un esempio di ciò che risolto entrambi i problemi per me (è in VB, ma si ottiene l'idea):

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 

La mia classe e-mail è, tra le altre cose, dispone di 2 proprietà - Messaggio (System.Net .Mail.MailMessage) e Server (System.Net.Mail.SmtpClient), che è ciò che viene disposto in questo esempio.

Non ho avuto un singolo problema dopo centinaia di e-mail una volta che ogni singola istanza che inviava e-mail nel mio servizio è stata implementata in questo modo.

Problemi correlati