2009-04-16 25 views
62

Ho un account Google Apps standard. Ho configurato un dominio personalizzato tramite Google Apps. Sono in grado di inviare e ricevere email con successo tramite Google Apps quando utilizzo l'interfaccia di Gmail. Tuttavia, voglio inviare una e-mail tramite codice. Per tentare questo, ho cercato il seguente codice:Invia e-mail tramite C# tramite l'account Google Apps

MailMessage mailMessage = new MailMessage(); 
mailMessage.To.Add("[email protected]"); 
mailMessage.Subject = "Test"; 
mailMessage.Body = "<html><body>This is a test</body></html>"; 
mailMessage.IsBodyHtml = true; 

// Create the credentials to login to the gmail account associated with my custom domain 
string sendEmailsFrom = "[email protected]";    
string sendEmailsFromPassword = "password"; 
NetworkCredential cred = new NetworkCredential(sendEmailsFrom, sendEmailsFromPassword); 

SmtpClient mailClient = new SmtpClient("smtp.gmail.com", 587); 
mailClient.EnableSsl = true; 
mailClient.DeliveryMethod = SmtpDeliveryMethod.Network; 
mailClient.UseDefaultCredentials = false; 
mailClient.Timeout = 20000; 
mailClient.Credentials = cred; 
mailClient.Send(mailMessage); 

Quando si raggiunge il metodo Send, viene generata un'eccezione che gli stati:

"il server SMTP richiede un connessione sicura oppure il client non è stato autenticato . La risposta del server era: 5.5.1 Autenticazione richiesta. "

Come posso inviare e-mail tramite il mio dominio personalizzato tramite Google?

Grazie!

+0

Fa porta 465 di lavoro migliore forse? – Lucero

+0

Qual è il problema con il codice sopra? – Marko

+1

Ricevo un problema di timeout, ma osservando tutti gli errori di codice, sembra che il mio codice e le impostazioni siano corretti. –

risposta

90

Non è necessario codificare con hardcode tutte le impostazioni smtp nel codice. Mettili invece in web.config. In questo modo è possibile crittografare queste impostazioni se necessario e modificarle al volo senza ricompilare l'applicazione.

<configuration> 
    <system.net> 
    <mailSettings> 
     <smtp from="[email protected]" deliveryMethod="Network"> 
      <network host="smtp.gmail.com" port="587" 
       userName="[email protected]" password="password"/> 
     </smtp> 
    </mailSettings> 
    </system.net> 
</configuration> 

Fine quando si inviano e-mail basta abilitare SSL sul tuo SmtpClient:

var message = new MailMessage("[email protected]"); 
// here is an important part: 
message.From = new MailAddress("[email protected]", "Mailer"); 
// it's superfluous part here since from address is defined in .config file 
// in my example. But since you don't use .config file, you will need it. 

var client = new SmtpClient(); 
client.EnableSsl = true; 
client.Send(message); 

Assicurarsi che si sta inviando e-mail dallo stesso indirizzo e-mail con il quale si sta cercando di autenticare in Gmail.

Nota: A partire da .NET 4.0 è possibile inserire enableSsl = "true" in web.config anziché impostarlo nel codice.

+1

il webconfig completo si trova in e dovrebbe essere

+0

è anche possibile inserire enableSsl nella configurazione. –

+1

@Shay - come è possibile abilitare SSL nella configurazione? –

3

cambiare la porta in 465

7

Questo è quello che uso in WPF 4

SmtpClient client = new SmtpClient(); 
client.Credentials = new NetworkCredential("[email protected]", "[email protected]$$w0rD"); 
client.Port = 587; 
client.Host = "smtp.gmail.com"; 
client.EnableSsl = true; 

try { 
    MailAddress 
     maFrom = new MailAddress("[email protected]", "Sender's Name", Encoding.UTF8), 
     maTo = new MailAddress("[email protected]", "Recipient's Name", Encoding.UTF8); 
    MailMessage mmsg = new MailMessage(maFrom.Address, maTo.Address); 
    mmsg.Body = "<html><body><h1>Some HTML Text for Test as BODY</h1></body></html>"; 
    mmsg.BodyEncoding = Encoding.UTF8; 
    mmsg.IsBodyHtml = true; 
    mmsg.Subject = "Some Other Text as Subject"; 
    mmsg.SubjectEncoding = Encoding.UTF8; 

    client.Send(mmsg); 
    MessageBox.Show("Done"); 
} catch (Exception ex) { 
    MessageBox.Show(ex.ToString(), ex.Message); 
    //throw; 
} 

orologio per Firewall e Anti-Virus. Queste cose inquietanti tendono a bloccare le applicazioni che inviano email. Uso McAfee Enterprise e devo aggiungere il nome dell'eseguibile (come Bazar. * Sia per Bazar.exe che per Bazar.vshost.exe) per poter inviare e-mail ...

+0

Grazie per aver mostrato come farlo nel codice da solo :-) –

+0

Desidero creare una pagina "contattaci" in modo che gli utenti inviino email a site-admin. C'è un modo per impostare "Da" al loro indirizzo email ?? – Shimmy

+0

È possibile eseguire lo spoofing dell'indirizzo del mittente; ma c'è il rischio che la tua email venga contrassegnata come spam. Ti suggerisco di inviare una email da [email protected] a entrambi gli amministratori e alla persona che sta cercando di contattarti. Quindi l'amministratore può inviare una risposta a tutti. – Achilles

3

Non c'è bisogno di fare nulla . Accedi al tuo account corrente per la prima volta e segui le istruzioni.

Il problema si risolverà. Si verifica perché hai creato l'account nelle app di google ma non hai effettuato l'accesso. Accedi e segui le istruzioni e prova.

+0

Dato che il codice dell'OP sembra soddisfacente, questo potrebbe effettivamente essere stato il problema. – Dermot

0

Il mio codice si connette a smtp.google.com utilizzando TLS sulla porta = 587 (SSL dovrebbe essere porta 465), ma ha ancora bisogno di EnableSsl = true

SmtpClient smtp = new SmtpClient(); 
smtp.Host = "smtp.gmail.com"; 
smtp.Port = 587; 
smtp.EnableSsl = true; 
smtp.UseDefaultCredentials = false; 
NetworkCredential credentials = new NetworkCredential(); 
credentials.UserName = "INSERT EMAIL"; 
credentials.Password = "INSERT PASSWORD"; 
smtp.Credentials = credentials; 

MailAddress addressFrom = new MailAddress(credentials.UserName); 
MailAddress addressTo = new MailAddress("INSERT RECIPIENT"); 
MailMessage msg = new MailMessage(addressFrom, addressTo); 
msg.Subject = "SUBJECT" 
msg.Body = "BODY"; 

smtp.Send(msg); 

Avviso questi prerequisiti importanti sul vostro conto SUITE G