2013-03-20 10 views
9

Stavo cercando di inviare e-mail nella mia applicazione Asp.Net C# utilizzando la porta 465 con host "smtp.gmail.com" ma l'intera applicazione si blocca (continua a caricare). Quando il debug è bloccato su SmtpClient.Send (msg).SmtpClient si blocca senza eccezione generata se è stata specificata una porta errata

Indipendentemente dalle credenziali specificate, non genera eccezioni per la cattura o errori di timeout. Devo chiudere o aggiornare la pagina per riottenere l'accesso alla pagina.

Se inserisco la porta 587, allora ogni cosa funziona correttamente e SmtpClient.Send risponde e invia l'e-mail o restituisce un'eccezione appropriata come il timeout dell'operazione o l'invio non riuscito dell'email in base alle credenziali.

ho semplificato il codice qui sotto per la dimostrazione:

var smtp = new SmtpClient 
         { 
          Host = "smtp.gmail.com", 
          Port = 465, 
          EnableSsl = true, 
          Timeout = 200, // or any value it doesn't solve the problem 
          DeliveryMethod = SmtpDeliveryMethod.Network, 
          UseDefaultCredentials = false, 
          Credentials = new NetworkCredential("[email protected]", "password") 
         }; 

var msg = new MailMessage("[email protected]", "[email protected]", "Any subject", "Any body"); 
smtp.Send(msg); // stuck here 
smtp.Dispose(); // never reached 
msg.Dispose(); 

ho provato SendAsync e ridotto l'intervallo di timeout, ma ciò non risolve il problema. Penso che il problema è che smtp.gmail.com è stato raggiunto ma non ha risposto correttamente alla porta 465 ed è per questo che il metodo è rimasto bloccato.

Ho bisogno di evitare tale comportamento poiché la mia applicazione consente impostazioni dinamiche dei dettagli del server smtp e non voglio che l'intera applicazione si blocchi in caso di dati errati inseriti.

Grazie,

enter image description here

+0

Strano, non ho mai avuto un problema e sembra giusto. Sembra un po 'come questo problema http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/99d6812c-9efe-4d0c-94d0-493c688450f7/, ma non penso che abbia davvero avuto una soluzione lì . Puoi inviare in uscita sulla tua rete utilizzando qualsiasi altra applicazione? – devshorts

+0

'using (var smtp = ...)' e 'using (var msg = ...)' –

+0

@devshorts Ho catturato il traffico TCP usando solo Wireshark, è sufficiente? –

risposta

3

trovato questa risposta nel caso qualcuno arriva qui

SmtpClient Timeout doesn't work

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
IAsyncResult result = socket.BeginConnect("192.168.1.180", 25, null, null); 
// Two second timeout 
bool success = result.AsyncWaitHandle.WaitOne(2000, true); 
if (!success) { 
    socket.Close(); 
    throw new ApplicationException("Failed to connect server."); 
} 
+0

cosa facciamo se è un successo, cioè come si invia il messaggio tramite questo socket? – mcmillab

-1

Avvolgete il vostro SmptClient in una dichiarazione using, per garantire che Dispose viene chiamato .

Non sono sicuro se questa sia la causa o il tuo problema o no, ma stavo avendo gli stessi problemi (inviato correttamente la prima volta, e spesso fallisce in seguito) a questo l'ho rettificato per me.

+0

'Dispose' non verrà mai chiamato se 'Invia' si blocca. – NathanAldenSr

Problemi correlati