kutombawewe.net

Invio di e-mail tramite il server SMTP di Gmail con C #

Per qualche motivo né la risposta accettata né altri funzionano per me " Invio di email in .NET tramite Gmail ". Perché non dovrebbero lavorare?

AGGIORNAMENTO: Ho provato tutte le risposte (accettate e non) nell'altra domanda, ma nessuna di esse funziona.

Vorrei solo sapere se funziona per chiunque altro, altrimenti Google potrebbe aver cambiato qualcosa (cosa che è già accaduta prima).

Quando provo la parte di codice che utilizza SmtpDeliveryMethod.Network, ricevo rapidamente una SmtpException su Send (messaggio). Il messaggio è

Il server SMTP richiede una connessione sicura o il client non è stato autenticato.

La risposta del server era:

5.5.1 Autenticazione richiesta. Per saperne di più su "<- sul serio, finisce lì.

UPDATE:

Questa è una domanda che ho chiesto molto tempo fa e la risposta accettata è il codice che ho usato molte, molte volte su diversi progetti.

Ho preso alcune idee in questo post e in altri progetti EmailSender per creare un progetto EmailSender su Codeplex . È progettato per la testabilità e supporta i miei servizi SMTP preferiti come GoDaddy e Gmail.

229
CVertex

CVertex, assicurati di rivedere il tuo codice e, se questo non rivela nulla, pubblicalo. Stavo solo abilitando questo su un sito ASP.NET di prova su cui stavo lavorando, e funziona.

In realtà, ad un certo punto ho avuto un problema sul mio codice. Non l'ho notato fino a quando non ho avuto una versione più semplice su un programma di console e ho visto che funzionava (nessuna modifica sul lato Gmail di cui eri preoccupato). Il codice seguente funziona esattamente come gli esempi a cui si fa riferimento:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Mail;
using System.Net;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("[email protected]", "mypwd"),
                EnableSsl = true
            };
            client.Send("[email protected]", "[email protected]", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

Ho anche funzionato usando una combinazione di web.config, http://msdn.Microsoft.com/en-us/library/w355a94k.aspx e codice (perché non c'è corrispondenza con EnableSsl nel file di configurazione :().

283
eglasius

LA SEGUENTE VOLONTÀ SOSTITUISCE QUASI CERTO ALLA TUA DOMANDA SE TUTTO ELSE È FALLITO :

Ho ottenuto lo stesso identico errore, si scopre che il nuovo algoritmo di misurazione della forza della password di Google ha modificato la mia password attuale come troppo debole e non mi dice nulla (nemmeno un messaggio o un avviso) ... Come ho scoperto questo? ? Bene, ho scelto di cambiare la mia password per vedere se sarebbe di aiuto (provato tutto il resto senza successo) e quando ho cambiato la mia password, ha funzionato!

Poi, per un esperimento, ho provato a cambiare la mia password con la mia password precedente per vedere cosa sarebbe successo, e Gmail in realtà non mi permetteva di farlo, citando il motivo "scusate non possiamo permettervi di salvare questa modifica come avete scelto la password è troppo debole "e non mi permette di tornare alla mia vecchia password. Da questo ho capito che stava sbagliando perché a) è necessario cambiare la password una volta ogni x quantità di mesi o b). come ho detto prima, i loro algoritmi di sicurezza delle password sono cambiati e quindi la password debole che ho avuto non è stata accettata, anche se non hanno detto nulla a riguardo quando hanno provato ad accedere OVUNQUE! Questo (numero 2) è lo scenario più probabile, in quanto la mia password debole era di circa 4 mesi e mi permetteva di usarla in Gmail.

È piuttosto brutto che non abbiano detto nulla a riguardo, ma ha senso. Poiché la maggior parte delle email dirottate vengono registrate utilizzando software al di fuori di Gmail, e suppongo che sia necessario avere una password più forte se si desidera utilizzare Gmail al di fuori dell'ambiente Gmail.

Spero che questo possa essere d'aiuto!

66

Oltre alle altre procedure di risoluzione dei problemi sopra riportate, vorrei anche aggiungere che se hai abilitato l'autenticazione a due fattori (anche conosciuta come verifica in due passaggi ) sul tuo account GMail, tu devi generare una password specifica per l'applicazione e utilizzare quella nuova password per autenticare tramite SMTP .

Per crearne uno, visita: https://www.google.com/settings/ e scegli Autorizzazione di applicazioni e siti per generare la password.

64
John Rasch
Turn On Access For Less Secure Apps and it will work for all no need to change password.

Collegamento alle impostazioni di Gmail

enter image description here

50

Ho avuto alcuni problemi nell'invio di e-mail anche dal mio account Gmail, dovute a molte delle suddette situazioni. Ecco un riassunto di come ho funzionato e di tenerlo flessibile allo stesso tempo:

  • Prima di tutto imposta il tuo account GMail:
    • Abilita IMAP e asserisci il giusto numero massimo di messaggi (puoi farlo qui)
    • Assicurati che la tua password abbia almeno 7 caratteri e sia forte (secondo Google)
    • Assicurati di non dover inserire prima un codice captcha. Puoi farlo inviando un'email di prova dal tuo browser.
  • Apportare modifiche in web.config (o app.config, non l'ho ancora provato, ma presumo che sia altrettanto facile farlo funzionare in un'applicazione Windows):
<configuration>
    <appSettings>
        <add key="EnableSSLOnMail" value="True"/>   
    </appSettings>

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="[email protected]" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    Host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="[email protected]"
                    />
                <!-- When using .Net 4.0 (or later) add attribute: enableSsl="true" and you're all set-->
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
Add a Class to your project:

Imports System.Net.Mail

Public Class SSLMail

    Public Shared Sub SendMail(ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)

        GetSmtpClient.Send(e.Message)

        'Since the message is sent here, set cancel=true so the original SmtpClient will not try to send the message too:
        e.Cancel = True

    End Sub

    Public Shared Sub SendMail(ByVal Msg As MailMessage)
        GetSmtpClient.Send(Msg)
    End Sub

    Public Shared Function GetSmtpClient() As SmtpClient

        Dim smtp As New Net.Mail.SmtpClient
        'Read EnableSSL setting from web.config
        smtp.EnableSsl = CBool(ConfigurationManager.AppSettings("EnableSSLOnMail"))
        Return smtp
    End Function

End Class

E ora ogni volta che vuoi inviare e-mail tutto ciò che devi fare è chiamare SSLMail.SendMail:

per esempio. in una pagina con un controllo PasswordRecovery:

Partial Class RecoverPassword
Inherits System.Web.UI.Page

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs) Handles RecoverPwd.SendingMail
    e.Message.Bcc.Add("[email protected]")
    SSLMail.SendMail(e)
End Sub

End Class

O ovunque nel tuo codice puoi chiamare:

SSLMail.SendMail(New system.Net.Mail.MailMessage("[email protected]","[email protected]", "Subject", "Body"})

Spero che questo aiuti chiunque si imbatta in questo post! (Ho usato VB.NET ma penso che sia banale convertirlo in qualsiasi linguaggio .NET.)

29
Sebas
Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("[email protected]", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("[email protected]","[email protected]","test","testbody")

Se si verifica un errore del tipo "Il server SMTP richiede una connessione sicura o il client non è stato autenticato.La risposta del server è stata: 5.5.1 Autenticazione richiesta. Ulteriori informazioni su" come prima, assicurati che la riga SMTPClientObj.UseDefaultCredentials = False sia inclusa e linea dovrebbe prima il SMTPClientObj.Credentials.

Ho provato a cambiare queste 2 linee in modo opposto e l'errore 5.5.1 Authentication Required restituito.

13
Terry Chng

Oh ... È incredibile ... Per prima cosa non ho potuto inviare una e-mail per nessuna ragione. Ma dopo aver cambiato la sequenza di queste due linee come di seguito, funziona perfettamente.

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("[email protected]", "password");

Spero che questo aiuto !!! :)

12
Wirol

Ho avuto lo stesso problema, ma si è scoperto che la mia protezione antivirus stava bloccando l'e-mail "spam" in uscita. Disabilitare questo mi ha permesso di usare la porta 587 per inviare email SMTP via GMail

9
user464329

Semplici passi per risolvere questo problema:

1) Accedi a Gmail

2) Vai a questa pagina https://www.google.com/settings/security/lesssecureapps e imposta su "Attiva"

9
Kevin

Il problema non è una capacità tecnica di inviare tramite Gmail. Questo funziona per la maggior parte delle situazioni. Se non si riesce a far inviare una macchina, di solito è dovuto al fatto che la macchina non è stata autenticata almeno una volta con i controlli umani.

Il problema che la maggior parte degli utenti deve affrontare è che Google decide di modificare i limiti in uscita in ogni momento. Dovresti sempre aggiungere un codice difensivo alla tua soluzione. Se inizi a vedere errori, fai scendere la velocità di invio e smetti di inviare per un po '. Se continui a provare a inviare Google a volte aggiungerai del tempo extra al tuo periodo di ritardo prima che tu possa inviare di nuovo.

Quello che ho fatto nel mio attuale sistema è di inviare con un ritardo di 1,5 secondi tra ogni messaggio. Quindi se ricevo degli errori, fermati per 5 minuti e poi ricomincia. Questo di solito funziona e ti consentirà di inviare fino ai limiti dell'account (l'ultima volta che ho controllato erano 2.000 per i primi accessi al cliente al giorno).

9
Jason Short

Non sono sicuro di quale versione di .NET è necessaria per questo perché Eglasius ha menzionato che non esiste alcuna impostazione enableSsl corrispondente (sto usando .NET 4.0, ma sospetto che funzioni in .NET 2.0 o successive), ma questa configurazione ha funzionato correttamente per me (e non richiede l'utilizzo di alcuna configurazione programmatica):

<system.net>
  <mailSettings>
    <smtp from="[email protected]" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" Host="smtp.gmail.com" port="587" password="password" userName="[email protected]"/>
    </smtp>
  </mailSettings>
</system.net>

Potrebbe essere necessario abilitare POP o IMAP sul tuo account Gmail: https://mail.google.com/mail/?shva=1#settings/fwdandpop

Consiglio di provarlo prima con un normale client di posta ...

8
Wiebe Tijsma

Se non ha funzionato nient'altro per te, potrebbe essere necessario consentire l'accesso al tuo account Gmail da applicazioni di terze parti. Questo era il mio problema Per consentire l'accesso, effettuare quanto segue:

  1. Accedi al tuo account Gmail.
  2. Visita questa pagina https://accounts.google.com/DisplayUnlockCaptcha e fai clic sul pulsante per consentire l'accesso.
  3. Visita questa pagina https://www.google.com/settings/security/lesssecureapps e attiva l'accesso per le app meno sicure.

Questo ha funzionato per me spero che funzioni per qualcun altro!

8
Celt

Stavo usando la connessione VPN aziendale. Era il motivo per cui non potevo inviare e-mail dalla mia applicazione. Funziona se disconnetto dalla VPN.

6
Ned

@ Andrés Pompiglio: Sì, è giusto che tu debba cambiare la password almeno una volta .. questo codice funziona bene:

//Satrt Send Email Function
public string SendMail(string toList, string from, string ccList,
    string subject, string body)
{

    MailMessage message = new MailMessage();
    SmtpClient smtpClient = new SmtpClient();
    string msg = string.Empty;
    try
    {
        MailAddress fromAddress = new MailAddress(from);
        message.From = fromAddress;
        message.To.Add(toList);
        if (ccList != null && ccList != string.Empty)
            message.CC.Add(ccList);
        message.Subject = subject;
        message.IsBodyHtml = true;
        message.Body = body;
        // We use gmail as our smtp client
        smtpClient.Host = "smtp.gmail.com";   
        smtpClient.Port = 587;
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = true;
        smtpClient.Credentials = new System.Net.NetworkCredential(
            "Your Gmail User Name", "Your Gmail Password");

        smtpClient.Send(message);
        msg = "Successful<BR>";
    }
    catch (Exception ex)
    {
        msg = ex.Message;
    }
    return msg;
}
//End Send Email Function

E puoi fare una chiamata alla funzione usando:

Response.Write(SendMail(recipient Address, "[email protected]", "ccList if any", "subject", "body"))
6
maxcoder

Ho anche scoperto che l'account che ho utilizzato per accedere è stato disattivato da Google per qualche ragione. Una volta resettata la mia password (come prima), sono riuscito a inviare e-mail bene. Stavo ricevendo anche il messaggio 5.5.1.

5
RKL

Ho anche provato molte soluzioni, ma ho apportato alcune modifiche

Host = smtp.gmail.com
port = 587
username = [email protected]
password = password
enabledssl = true

con smtpclient sopra i parametri funzionano in gmail

5
Suresh

Ancora un'altra soluzione possibile per te. Stavo riscontrando problemi simili durante la connessione a Gmail tramite IMAP. Dopo aver provato tutte le soluzioni che ho trovato che leggerà qui e altrove su SO (ad esempio, abilita IMAP, abilita l'accesso meno sicuro alla tua posta, usando https : //accounts.google.com/b/0/displayunlockcaptcha e così via), ho effettivamente impostato nuovamente un nuovo account Gmail.

Nel mio test originale, il primo account Gmail che avevo creato, mi ero collegato al mio account gmail principale. Ciò ha comportato un comportamento irregolare in cui l'account sbagliato veniva referenziato da Google. Ad esempio, l'esecuzione https://accounts.google.com/b/0/displayunlockcaptcha ha aperto il mio account principale anziché quello che avevo creato per la proposta.

Quindi, quando ho creato un nuovo account e non l'ho collegato al mio account principale, dopo aver seguito tutti i passaggi appropriati come sopra, ho scoperto che funzionava bene!

Non ho ancora confermato questo (ad esempio, riprodotto), ma a quanto pare ha fatto per me ... spero che aiuti.

4
sinewave440hz

Stavo ottenendo lo stesso errore e nessuna delle soluzioni di cui sopra ha aiutato.

Il mio problema era che stavo eseguendo il codice da un server remoto, che non era mai stato utilizzato per accedere all'account Gmail.

Ho aperto un browser sul server remoto e ho effettuato l'accesso a gmail da lì. Ha chiesto una domanda di sicurezza per verificare che fossi io dato che si trattava di una nuova posizione. Dopo aver eseguito il controllo di sicurezza, sono riuscito a eseguire l'autenticazione tramite codice.

4
Vlad Tamas

Mi sono imbattuto in questo stesso errore ( "Il server SMTP richiede una connessione sicura o il client non è stato autenticato La risposta del server è stata: 5.5.1 Autenticazione richiesta. Ulteriori informazioni su" ) e ho scoperto che stavo usando la password sbagliata. Ho corretto le credenziali di accesso e inviato correttamente.

So che è tardi, ma forse questo aiuterà qualcun altro.

4
Albert Bori

Attiva app meno sicure per il tuo account: https://www.google.com/settings/security/lesssecureapps

4
Burak Kalkan
  1. Controlla innanzitutto l'impostazione dell'account Gmail e attiva "Accesso per app meno sicure" enter image description here

Ti consigliamo vivamente di utilizzare un'app protetta, come Gmail, per accedere al tuo account. Tutte le app realizzate da Google soddisfano questi standard di sicurezza. D'altra parte, l'utilizzo di un'app meno sicura potrebbe rendere vulnerabile il tuo account. Per saperne di più.

  1. Impostato

    smtp.UseDefaultCredentials = false;
    

    prima

    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
    
4
reza.cse08

Un'altra cosa che ho trovato è che devi cambiare la password almeno una volta. E prova ad usare una password di livello sicuro (non usare lo stesso utente come password, 123456, ecc.)

4
Andres Pompiglio

Ho risolto questo problema. A parte questo messaggio viene utilizzato in più tipi di errore. Il mio problema era che avevo raggiunto il mio massimo di 500 messaggi inviati.

accedi all'account e prova manualmente a inviare una mail. Se il limite è stato raggiunto, ti informerà

3
Ayson Baxter

È inoltre possibile connettersi tramite la porta 465, ma a causa di alcune limitazioni dello spazio dei nomi System.Net.Mail potrebbe essere necessario modificare il codice. Questo perché lo spazio dei nomi non offre la possibilità di effettuare connessioni SSL implicite. Questo è discusso in http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against -port-465.aspx , e ho fornito un esempio di come utilizzare il CDO (Collaborative Data Object) in un'altra discussione ( GMail SMTP tramite C # Errori .Net su tutte le porte ).

3
Bryan Allred

Uno o più motivi ci sono per questo errore.

  • Accedi con il tuo Gmail (o qualsiasi altro se) nel tuo sistema locale.

  • Controlla anche per App meno sicura e impostalo su "Attiva". Ecco il link per GMAIL. https://www.google.com/settings/security/lesssecureapps

  • controlla EnableSsl nel tuo codice e-mail e imposta anche su true.

    smtp.EnableSsl = true;
    
  • Controlla anche quale porta stai usando al momento. 25 è globale, ma puoi verificarlo anche per altri come 587. controlla qui. Tutte le comunicazioni SMTP si verificano oltre 25?

  • SE SEI SU REMOTO : Controlla la risposta di Vlad Tamas sopra.

2
Bharat
  smtp.Host = "smtp.gmail.com"; //Host name
    smtp.Port = 587; //port number
    smtp.EnableSsl = true; //whether your smtp server requires SSL
    smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
    smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
    smtp.Timeout = 20000;
2
somesh

Cambia la tua password di Gmail e riprova, dovrebbe funzionare dopo.

Non so perché, ma ogni volta che cambi il tuo hosting devi cambiare la tua password.

1
Jo Smo

Se la verifica in due passaggi è attiva nel tuo account Gmail, dovrai generare una password per l'app. https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=it&visit_id=636903322072234863-1319515789&rd=1 Seleziona Come generare un Opzione password app e seguire i passaggi forniti. Copia e incolla la password dell'app generata da qualche parte, in quanto non potrai recuperarla dopo aver fatto clic su FATTO.

0
Faith Nassiwa