Posts
163
Comments
179
Trackbacks
5
martedì 2 marzo 2010
Timeout costante con System.Net.Mail e SSL


Se avete avuto necessità di inviare email tramite un SMTP con SSL potreste incontrare il problema che ho riscontrato io. In sostanza utilizzando il codice seguente, l’effetto che si ha è quello di un timeout costante in fase di invio:

   1: Dim smtp As New SmtpClient("SERVER", 465)
   2: Dim cred As New System.Net.NetworkCredential("USERNAME", "PASSWORD")
   3: smtp.UseDefaultCredentials = False
   4: smtp.Credentials = cred
   5: smtp.EnableSsl = True
   6:  ...
   7:  ...
   8: smtp.Send(message)

Il potreste è d’obbligo dato che dipende dall’SMTP che state utilizzando. Il problema è spiegato bene in questo post. In sostanza il namespace System.Net.Mail supporta solo l’Explicit SSL, che nella pratica implica che la connessione inizia sulla porta 25 come connessione in chiaro e poi switcha sulla connessione sicura.
Se l’SMTP che si sta utilizzando non ha la porta 25 aperta (come è facilmente testabile da telnet), si avrà sempre un errore di timeout.

La soluzione sarebbe quella di switchare all’Implicit SSL che wrappa l’intera connessione in modo sicuro, ma il namespace System.Net.Mail non lo supporta (…..). Come fare? Evitando di scegliere componenti di terze parti, si può tornare al vecchio namespace System.Web.Mail che supportava entrambe le modalità. Il frammento di codice seguente è equivalente al precedente ma funziona in ogni situazione.

   1: Dim mail As New System.Web.Mail.MailMessage
   2: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserver", "SERVER")
   3: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", 465)
   4: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpusessl", True)
   5: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", "USERNAME")
   6: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", "PASSWORD")
   7: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusing", 2)
   8: mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1)
   9: ...
  10: ...
  11: Web.Mail.SmtpMail.Send(mail)
posted @ lunedì 1 gennaio 0001 00:00 | Feedback (2)
News
Se volete sapere con chi avete a che fare eccomi qui in uno "scatto" lavorativo.

La mia foto

Logo MCAD
Logo MCTS