2010-03-18 21 views
13

Non riesco a inviare la posta utilizzando il client smtp. ecco il codice:Invio di posta tramite SmtpClient in .net

SmtpClient client=new SmtpClient("Host"); 
client.Credentials=new NetworkCredential("username", "password"); 
MailMessage mailMessage = new MailMessage(); 
mailMessage.from="[email protected]"; 
mailMessage.To.Add("[email protected]"); 
mailMessage.body="body"; 
mailMessage.subject="subject"; 
client.Send(mailMessage); 

Il problema è che quando uso questo codice in un'applicazione ASP.NET, non ricevo delle email. Quando in asp.net cambio l'indirizzo di posta elettronica nel nome utente indicato in NetworkCredential, ricevo mail.

Ma nell'applicazione Windows C, posso ricevere e-mail, anche se l'indirizzo e-mail del mittente non è valido.

+0

Questo potrebbe essere correlato alla configurazione sul server rispetto alla macchina di sviluppo. – Nate

+0

Sembra che tu stia utilizzando un indirizzo Gmail nel campo from. Ti sei assicurato che tutte le impostazioni siano impostate in base alle istruzioni da loro? –

risposta

1

Significa che il tuo server di posta non consente il relay di posta. Il tuo server di posta ti consente solo di inviare posta dall'ID e-mail autenticato come nome utente. Generalmente questo viene fatto per impedire che i messaggi vengano inviati come identità diverse da quella autenticata.

+1

Il server di posta è uguale sia in Windows che nell'applicazione ASP.NET. E anche lo stesso codice funziona perfettamente in un'altra pagina dell'applicazione ASP.NET. Non funziona nella pagina di accesso dell'applicazione ASP.NET. Quale può essere il problema? –

+0

Che cos'è la modalità di autenticazione della tua applicazione? Si prega di fornire maggiori dettagli in merito allo scenario del problema. –

+0

Nella modalità di autenticazione asp.net è impostato su moduli. –

0

Prova questa:

MailMessage mail = new MailMessage("emailfrom","emailto"); 

mail.From = new MailAddress("emailfrom"); 
mail.Subject = txtsbjct.Text; 
string Body = txtmsg.Text; 
mail.Body = Body; 

mail.IsBodyHtml = true; 
SmtpClient smtp = new SmtpClient(); 
smtp.Host = "smtp.gmail.com"; //Or Your SMTP Server Address 
smtp.Credentials = new System.Net.NetworkCredential("youremail", "yourpassword"); 

smtp.EnableSsl = true; 
smtp.Send(mail); 
txtemail.Text = ""; 
txtmsg.Text = ""; 
txtsbjct.Text = ""; 
Label1.Text = "your email has been send"; 
mail = null; 
smtp = null; 
10

ho capito che l'impostazione della proprietà Credenziali SmtpClient prima di impostare i useDefaultCredentials = false provoca le credenziali per essere ignorati.

fallisce:

SmtpClient smtp = new SmtpClient; 
smtp.Credentials = new NetworkCredential("user","pass"); 
smtp.UseDefaultCredentials = false; 

Works:

SmtpClient smtp = new SmtpClient; 
smtp.UseDefaultCredentials = false; 
smtp.Credentials = new NetworkCredential("user","pass"); 

Go figura.

+0

Questo non ha senso in quanto entrambi i frammenti di codice sono quasi identici. L'unica differenza è che l'istanziazione della classe 'NetworkCredential' avviene all'interno del blocco' using' nel secondo snippet. Forse questo ha un effetto collaterale non voluto? –

+0

I tuoi sono corretti. E l'effetto non voluto è che l'impostazione delle credenziali PRIMA di impostare UseDefaultCredentials = false è ciò che rende questo accada. Modifico il post – user3524983

+0

E finalmente ho ottenuto il funzionamento delle credenziali da web.config. Meno male! Che giornata. – user3524983

-2
void sendEmail(string strFrom 
         , string strTo 
         , string strSubject 
         , string strBody) 
    { 

     MailMessage objMailMessage = new MailMessage(); 
     System.Net.NetworkCredential objSMTPUserInfo = 
      new System.Net.NetworkCredential(); 
     SmtpClient objSmtpClient = new SmtpClient(); 

     try 
     { 
      objMailMessage.From = new MailAddress(strFrom); 
      objMailMessage.To.Add(new MailAddress(strTo)); 
      objMailMessage.Subject = strSubject; 
      objMailMessage.Body = strBody; 

      objSmtpClient = new SmtpClient("172.0.0.1"); /// Server IP 
      objSMTPUserInfo = new System.Net.NetworkCredential 
      ("User name", "Password","Domain"); 
      objSmtpClient.Credentials = objSMTPUserInfo; 
      objSmtpClient.UseDefaultCredentials = false; 
      objSmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network; 

      objSmtpClient.Send(objMailMessage); 
     } 
     catch (Exception ex) 
     { throw ex; } 

     finally 
     { 
      objMailMessage = null; 
      objSMTPUserInfo = null; 
      objSmtpClient = null; 
     } 
    } 
+3

La gestione degli errori è in realtà una pessima pratica, perché stai perdendo la traccia dello stack (cf http://stackoverflow.com/a/730255/474763) ... inoltre, in questo caso, l'omissione della clausola catch avrebbe è stata la strada da percorrere – tsimbalar

+0

Infatti. Se si vuole 'catch (Exception ex)' e quindi 'throw' it, basta usare' throw; 'invece di 'throw ex;' e la traccia stack verrà mantenuta. Questo è utile solo, tuttavia, f stai facendo altre cose prima di eliminare l'eccezione, come registrarla. In questo caso, tuttavia, la semplice omissione della clausola "catch" avrebbe avuto lo stesso effetto. –

Problemi correlati