Invio di e-mail in .NET tramite Gmail


876

Invece di fare affidamento sul mio host per inviare un'e-mail, stavo pensando di inviare i messaggi e-mail utilizzando il mio account Gmail . Le e-mail sono e-mail personalizzate per le band che suono nel mio show.

È possibile farlo?


1
< systemnetmail.com > è probabilmente il sito più assurdamente completo dedicato a un singolo spazio dei nomi .NET ... ma ha TUTTO ciò che potresti voler sapere sull'invio di posta via .NET, sia ASP.NET o Desktop. < systemwebmail.com > era l'URL originale nel post, ma non deve essere utilizzato per .NET 2.0 e versioni successive.
Adam Haile,

13
Se stai usando ASP.Net Mvc, ti consiglio di dare un'occhiata a MvcMailer: github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide
noocyte

Ho un bell'esempio di come farlo sul mio sito jarloo.com/gmail-in-c
Kelly,

come inviare file usando questo codice?
Ranadheer Reddy,

Risposte:


1065

Assicurati di usare System.Net.Mail, non il deprecato System.Web.Mail. Fare SSL con System.Web.Mailè un casino di estensioni hacky.

using System.Net;
using System.Net.Mail;

var fromAddress = new MailAddress("from@gmail.com", "From Name");
var toAddress = new MailAddress("to@example.com", "To Name");
const string fromPassword = "fromPassword";
const string subject = "Subject";
const string body = "Body";

var smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    UseDefaultCredentials = false,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
};
using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})
{
    smtp.Send(message);
}

49
Puoi ancora ottenere errori di accesso dell'utente se Google decide all'improvviso che ne hai inviati troppi negli ultimi xx numero di minuti. Devi sempre aggiungere un trySend, se si verifica un errore di sospensione per un po ', quindi riprovare.
Jason Short,

72
Nota interessante: se si scambia "UseDefaultCredentials = false" e "Credentials = ..." non verrà autenticato.
Nathan Wheeler,

13
Non ci sono problemi con SPF usando questo metodo. Ogni client di posta elettronica può essere configurato per fare esattamente questo. Potresti avere dei problemi se usi il tuo server (cioè qualcosa di diverso da smtp.gmail.com) con something@gmail.comcome mittente. Btw: smtp.gmail.comsovrascrive automaticamente l'indirizzo del mittente se non è tuo.
Meinersbur,

24
Stavo facendo fatica a farlo funzionare anche provando varie modifiche. Come suggerito in un post correlato, ho scoperto che in realtà era il mio antivirus a impedire l'invio di e-mail. L'antivirus in questione è McAffee e la sua "Protezione dell'accesso" ha una categoria "Protezione standard antivirus" che ha una regola "Impedisci ai worm di posta di massa di inviare e-mail". Ritoccare / disabilitare quella regola ha fatto funzionare questo codice per me!
yourbuddypal

18
Stavo ricevendo il messaggio di errore Autenticazione obbligatoria 5.5.1 fino a quando non mi sono reso conto che stavo testando un account (il mio personale) con l'autenticazione a due fattori attivata. Una volta che ho usato un account che non aveva quello, ha funzionato bene. Avrei potuto anche generare una password per la mia applicazione che stavo testando nel mio account personale, ma non volevo farlo.
Nick DeVore,

153

La risposta sopra non funziona. Devi impostare DeliveryMethod = SmtpDeliveryMethod.Networko tornerà con un errore " client non autenticato ". Inoltre è sempre una buona idea mettere un timeout.

Codice rivisto:

using System.Net.Mail;
using System.Net;

var fromAddress = new MailAddress("from@gmail.com", "From Name");
var toAddress = new MailAddress("to@yahoo.com", "To Name");
const string fromPassword = "password";
const string subject = "test";
const string body = "Hey now!!";

var smtp = new SmtpClient
{
    Host = "smtp.gmail.com",
    Port = 587,
    EnableSsl = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    Credentials = new NetworkCredential(fromAddress.Address, fromPassword),
    Timeout = 20000
};
using (var message = new MailMessage(fromAddress, toAddress)
{
    Subject = subject,
    Body = body
})
{
    smtp.Send(message);
}

3
Interessante; funziona sulla mia macchina (TM). Ma poiché questo sembra plausibile, lo aggiungerò alla mia risposta.
Domenic,

3
Hmm la mia ipotesi è che SmtpDeliveryMethod.Network è l'impostazione predefinita, ma forse l'impostazione predefinita viene modificata durante l'esecuzione in IIS --- era quello che stavi facendo?
Domenic,

3
Sto usando lo stesso codice nell'applicazione Console, è attraverso l'errore "Errore nell'invio della posta".
Karthikeyan P,

5
Questa risposta non funziona. Si prega, sguardo alla domanda stackoverflow.com/questions/34851484/...

110

Affinché le altre risposte funzionino "da un server", attivare innanzitutto Accesso per app meno sicure nell'account Gmail.

Sembra che recentemente Google abbia cambiato la sua politica di sicurezza. La risposta più votata non funziona più finché non modifichi le impostazioni del tuo account come descritto qui: https://support.google.com/accounts/answer/6010255?hl=en-GBinserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

A partire da marzo 2016, Google ha nuovamente cambiato la posizione delle impostazioni!


4
Questo ha funzionato per me. Ed è anche preoccupante. Non sono sicuro di voler disattivare quella sicurezza. Potrebbe essere necessario ripensare ...
Sully

4
Dal punto di vista della sicurezza è meglio attivare la verifica in due passaggi, quindi generare e utilizzare la password dell'app: vedere Come inviare un'e-mail in .Net secondo le nuove politiche di sicurezza?
Michael Freidgeim,

2
Software @BCS, nel mio programma, l'utente inserisce qualsiasi e-mail che il mio programma deve utilizzare per inviare il messaggio. Quindi, come posso rendere l'utente e-mail in grado di inviare l'e-mail anche se l'autenticazione a 2 fattori è attivata ??
Alaa "

Questa è la stessa impostazione che è necessario modificare se si desidera utilizzare un client Microsoft Outlook (su desktop, telefono cellulare, ecc.) Per inviare / ricevere e-mail tramite GMail di Google.
Brett Rigby,

41

Questo è per inviare e-mail con allegato .. Semplice e breve ..

fonte: http://coding-issues.blogspot.in/2012/11/sending-email-with-attachments-from-c.html

using System.Net;
using System.Net.Mail;

public void email_send()
{
    MailMessage mail = new MailMessage();
    SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
    mail.From = new MailAddress("your mail@gmail.com");
    mail.To.Add("to_mail@gmail.com");
    mail.Subject = "Test Mail - 1";
    mail.Body = "mail with attachment";

    System.Net.Mail.Attachment attachment;
    attachment = new System.Net.Mail.Attachment("c:/textfile.txt");
    mail.Attachments.Add(attachment);

    SmtpServer.Port = 587;
    SmtpServer.Credentials = new System.Net.NetworkCredential("your mail@gmail.com", "your password");
    SmtpServer.EnableSsl = true;

    SmtpServer.Send(mail);

}

21

Google potrebbe bloccare i tentativi di accesso da alcune app o dispositivi che non utilizzano i moderni standard di sicurezza. Poiché queste app e dispositivi sono più facili da violare, il loro blocco aiuta a mantenere il tuo account più sicuro.

Alcuni esempi di app che non supportano gli standard di sicurezza più recenti includono:

  • L'app Mail sul tuo iPhone o iPad con iOS 6 o versioni precedenti
  • L'app Mail sul tuo telefono Windows precedente alla versione 8.1
  • Alcuni client di posta desktop come Microsoft Outlook e Mozilla Thunderbird

Pertanto, devi abilitare Accesso meno sicuro nel tuo account Google.

Dopo aver effettuato l'accesso all'account google, vai a:

https://myaccount.google.com/lesssecureapps
o
https://www.google.com/settings/security/lesssecureapps

In C #, puoi usare il seguente codice:

using (MailMessage mail = new MailMessage())
{
    mail.From = new MailAddress("email@gmail.com");
    mail.To.Add("somebody@domain.com");
    mail.Subject = "Hello World";
    mail.Body = "<h1>Hello</h1>";
    mail.IsBodyHtml = true;
    mail.Attachments.Add(new Attachment("C:\\file.zip"));

    using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587))
    {
        smtp.Credentials = new NetworkCredential("email@gmail.com", "password");
        smtp.EnableSsl = true;
        smtp.Send(mail);
    }
}


16

Ecco la mia versione: " Invia email in C # usando Gmail ".

using System;
using System.Net;
using System.Net.Mail;

namespace SendMailViaGmail
{
   class Program
   {
   static void Main(string[] args)
   {

      //Specify senders gmail address
      string SendersAddress = "Sendersaddress@gmail.com";
      //Specify The Address You want to sent Email To(can be any valid email address)
      string ReceiversAddress = "ReceiversAddress@yahoo.com";
      //Specify The password of gmial account u are using to sent mail(pw of sender@gmail.com)
      const string SendersPassword = "Password";
      //Write the subject of ur mail
      const string subject = "Testing";
      //Write the contents of your mail
      const string body = "Hi This Is my Mail From Gmail";

      try
      {
        //we will use Smtp client which allows us to send email using SMTP Protocol
        //i have specified the properties of SmtpClient smtp within{}
        //gmails smtp server name is smtp.gmail.com and port number is 587
        SmtpClient smtp = new SmtpClient
        {
           Host = "smtp.gmail.com",
           Port = 587,
           EnableSsl = true,
           DeliveryMethod = SmtpDeliveryMethod.Network,
           Credentials    = new NetworkCredential(SendersAddress, SendersPassword),
           Timeout = 3000
        };

        //MailMessage represents a mail message
        //it is 4 parameters(From,TO,subject,body)

        MailMessage message = new MailMessage(SendersAddress, ReceiversAddress, subject, body);
        /*WE use smtp sever we specified above to send the message(MailMessage message)*/

        smtp.Send(message);
        Console.WriteLine("Message Sent Successfully");
        Console.ReadKey();
     }

     catch (Exception ex)
     {
        Console.WriteLine(ex.Message);
        Console.ReadKey();
     }
    }
   }
 }

8
Sebbene il tuo articolo possa effettivamente rispondere alla domanda, sarebbe preferibile includere qui le parti essenziali della risposta e fornire il link per riferimento. Stack Overflow è utile solo come le sue domande e risposte e se l'host del tuo blog diminuisce o i tuoi URL vengono spostati, questa risposta diventa inutile. Grazie!
Sarnold,

14

Spero che questo codice funzioni bene. Puoi fare una prova.

// Include this.                
using System.Net.Mail;

string fromAddress = "xyz@gmail.com";
string mailPassword = "*****";       // Mail id password from where mail will be sent.
string messageBody = "Write the body of the message here.";


// Create smtp connection.
SmtpClient client = new SmtpClient();
client.Port = 587;//outgoing port for the mail.
client.Host = "smtp.gmail.com";
client.EnableSsl = true;
client.Timeout = 10000;
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = false;
client.Credentials = new System.Net.NetworkCredential(fromAddress, mailPassword);


// Fill the mail form.
var send_mail = new MailMessage();

send_mail.IsBodyHtml = true;
//address from where mail will be sent.
send_mail.From = new MailAddress("from@gmail.com");
//address to which mail will be sent.           
send_mail.To.Add(new MailAddress("to@example.com");
//subject of the mail.
send_mail.Subject = "put any subject here";

send_mail.Body = messageBody;
client.Send(send_mail);

2
messaggio send_mail = new MailMessage (); Come funziona questa linea? Non è possibile convertire implicitamente "System.Net.Mail.MailMessage" in "System.Windows.Forms.Message"
Debaprasad,

9

Includi questo,

using System.Net.Mail;

E poi,

MailMessage sendmsg = new MailMessage(SendersAddress, ReceiversAddress, subject, body); 
SmtpClient client = new SmtpClient("smtp.gmail.com");

client.Port = Convert.ToInt16("587");
client.Credentials = new System.Net.NetworkCredential("mail-id@gmail.com","password");
client.EnableSsl = true;

client.Send(sendmsg);

8

Fonte : invia e-mail in ASP.NET C #

Di seguito è riportato un esempio di codice funzionante per l'invio di un messaggio di posta elettronica utilizzando C #, nell'esempio seguente utilizzo il server smtp di Google.

Il codice è piuttosto autoesplicativo, sostituisci e-mail e password con i tuoi valori e-mail e password.

public void SendEmail(string address, string subject, string message)
{
    string email = "yrshaikh.mail@gmail.com";
    string password = "put-your-GMAIL-password-here";

    var loginInfo = new NetworkCredential(email, password);
    var msg = new MailMessage();
    var smtpClient = new SmtpClient("smtp.gmail.com", 587);

    msg.From = new MailAddress(email);
    msg.To.Add(new MailAddress(address));
    msg.Subject = subject;
    msg.Body = message;
    msg.IsBodyHtml = true;

    smtpClient.EnableSsl = true;
    smtpClient.UseDefaultCredentials = false;
    smtpClient.Credentials = loginInfo;
    smtpClient.Send(msg);
}

Invece di var, ho usato un nome di classe come NetworkCredential, MailMessage e SmtpClient. Funziona per me.
Test Jui del

7

Se si desidera inviare e-mail in background, si prega di fare quanto segue

 public void SendEmail(string address, string subject, string message)
 {
 Thread threadSendMails;
 threadSendMails = new Thread(delegate()
    {

      //Place your Code here 

     });
  threadSendMails.IsBackground = true;
  threadSendMails.Start();
}

e aggiungi lo spazio dei nomi

using System.Threading;


5

Prova questo,

    private void button1_Click(object sender, EventArgs e)
    {
        try
        {
            MailMessage mail = new MailMessage();
            SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");

            mail.From = new MailAddress("your_email_address@gmail.com");
            mail.To.Add("to_address");
            mail.Subject = "Test Mail";
            mail.Body = "This is for testing SMTP mail from GMAIL";

            SmtpServer.Port = 587;
            SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
            SmtpServer.EnableSsl = true;

            SmtpServer.Send(mail);
            MessageBox.Show("mail Send");
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

4

usare in questo modo

MailMessage sendmsg = new MailMessage(SendersAddress, ReceiversAddress, subject, body); 
SmtpClient client = new SmtpClient("smtp.gmail.com");

client.Port = Convert.ToInt32("587");
client.EnableSsl = true;
client.Credentials = new System.Net.NetworkCredential("mail-id@gmail.com","MyPassWord");
client.Send(sendmsg);

Non dimenticare questo:

using System.Net;
using System.Net.Mail;

4

Per evitare problemi di sicurezza in Gmail, devi prima generare una password per l'app dalle impostazioni di Gmail e puoi utilizzare questa password anziché una password reale per inviare un'e-mail anche se utilizzi la verifica in due passaggi.


3

Modifica del mittente tramite e-mail Gmail / Outlook.com:

Per evitare lo spoofing - Gmail / Outlook.com non ti consente di inviare da un nome account utente arbitrario.

Se hai un numero limitato di mittenti puoi seguire queste istruzioni e quindi impostare il Fromcampo a questo indirizzo: Invio di posta da un indirizzo diverso

Se desideri inviare da un indirizzo di posta elettronica arbitrario (come un modulo di feedback sul sito Web in cui l'utente immette la sua e-mail e non vuoi che ti invii un'e-mail direttamente) il meglio che puoi fare è questo:

        msg.ReplyToList.Add(new System.Net.Mail.MailAddress(email, friendlyName));

Ciò ti consentirebbe semplicemente di premere "rispondi" nel tuo account e-mail per rispondere al fan della tua band su una pagina di feedback, ma non otterrebbero la tua e-mail effettiva che probabilmente porterebbe a una tonnellata di spam.

Se ti trovi in ​​un ambiente controllato, funziona alla grande, ma tieni presente che ho visto alcuni client di posta elettronica inviare l'indirizzo di provenienza anche quando è stata specificata la risposta (non so quale).


3

Ho avuto lo stesso problema, ma è stato risolto andando alle impostazioni di sicurezza di Gmail e consentendo App meno sicure . Il codice di Domenic & Donny funziona, ma solo se hai abilitato tale impostazione

Se hai effettuato l'accesso (a Google) puoi seguire questo link e attivare "Attiva" per "Accesso per app meno sicure"


3
using System;
using System.Net;
using System.Net.Mail;

namespace SendMailViaGmail
{
   class Program
   {
   static void Main(string[] args)
   {

      //Specify senders gmail address
      string SendersAddress = "Sendersaddress@gmail.com";
      //Specify The Address You want to sent Email To(can be any valid email address)
      string ReceiversAddress = "ReceiversAddress@yahoo.com";
      //Specify The password of gmial account u are using to sent mail(pw of sender@gmail.com)
      const string SendersPassword = "Password";
      //Write the subject of ur mail
      const string subject = "Testing";
      //Write the contents of your mail
      const string body = "Hi This Is my Mail From Gmail";

      try
      {
        //we will use Smtp client which allows us to send email using SMTP Protocol
        //i have specified the properties of SmtpClient smtp within{}
        //gmails smtp server name is smtp.gmail.com and port number is 587
        SmtpClient smtp = new SmtpClient
        {
           Host = "smtp.gmail.com",
           Port = 587,
           EnableSsl = true,
           DeliveryMethod = SmtpDeliveryMethod.Network,
           Credentials = new NetworkCredential(SendersAddress, SendersPassword),
           Timeout = 3000
        };

        //MailMessage represents a mail message
        //it is 4 parameters(From,TO,subject,body)

        MailMessage message = new MailMessage(SendersAddress, ReceiversAddress, subject, body);
        /*WE use smtp sever we specified above to send the message(MailMessage message)*/

        smtp.Send(message);
        Console.WriteLine("Message Sent Successfully");
        Console.ReadKey();
     }
     catch (Exception ex)
     {
        Console.WriteLine(ex.Message);
        Console.ReadKey();
     }
}
}
}

2

Ecco un metodo per inviare posta e ottenere credenziali da web.config:

public static string SendEmail(string To, string Subject, string Msg, bool bodyHtml = false, bool test = false, Stream AttachmentStream = null, string AttachmentType = null, string AttachmentFileName = null)
{
    try
    {
        System.Net.Mail.MailMessage newMsg = new System.Net.Mail.MailMessage(System.Configuration.ConfigurationManager.AppSettings["mailCfg"], To, Subject, Msg);
        newMsg.BodyEncoding = System.Text.Encoding.UTF8;
        newMsg.HeadersEncoding = System.Text.Encoding.UTF8;
        newMsg.SubjectEncoding = System.Text.Encoding.UTF8;

        System.Net.Mail.SmtpClient smtpClient = new System.Net.Mail.SmtpClient();
        if (AttachmentStream != null && AttachmentType != null && AttachmentFileName != null)
        {
            System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(AttachmentStream, AttachmentFileName);
            System.Net.Mime.ContentDisposition disposition = attachment.ContentDisposition;
            disposition.FileName = AttachmentFileName;
            disposition.DispositionType = System.Net.Mime.DispositionTypeNames.Attachment;

            newMsg.Attachments.Add(attachment);
        }
        if (test)
        {
            smtpClient.PickupDirectoryLocation = "C:\\TestEmail";
            smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.SpecifiedPickupDirectory;
        }
        else
        {
            //smtpClient.EnableSsl = true;
        }

        newMsg.IsBodyHtml = bodyHtml;
        smtpClient.Send(newMsg);
        return SENT_OK;
    }
    catch (Exception ex)
    {

        return "Error: " + ex.Message
             + "<br/><br/>Inner Exception: "
             + ex.InnerException;
    }

}

E la sezione corrispondente in web.config:

<appSettings>
    <add key="mailCfg" value="yourmail@example.com"/>
</appSettings>
<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network" from="yourmail@example.com">
      <network defaultCredentials="false" host="mail.exapmple.com" userName="yourmail@example.com" password="your_password" port="25"/>
    </smtp>
  </mailSettings>
</system.net>

2

Prova questo

public static bool Send(string receiverEmail, string ReceiverName, string subject, string body)
{
        MailMessage mailMessage = new MailMessage();
        MailAddress mailAddress = new MailAddress("abc@gmail.com", "Sender Name"); // abc@gmail.com = input Sender Email Address 
        mailMessage.From = mailAddress;
        mailAddress = new MailAddress(receiverEmail, ReceiverName);
        mailMessage.To.Add(mailAddress);
        mailMessage.Subject = subject;
        mailMessage.Body = body;
        mailMessage.IsBodyHtml = true;

        SmtpClient mailSender = new SmtpClient("smtp.gmail.com", 587)
        {
            EnableSsl = true,
            UseDefaultCredentials = false,
            DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
            Credentials = new NetworkCredential("abc@gmail.com", "pass")   // abc@gmail.com = input sender email address  
                                                                           //pass = sender email password
        };

        try
        {
            mailSender.Send(mailMessage);
            return true;
        }
        catch (SmtpFailedRecipientException ex)
        { 
          // Write the exception to a Log file.
        }
        catch (SmtpException ex)
        { 
           // Write the exception to a Log file.
        }
        finally
        {
            mailSender = null;
            mailMessage.Dispose();
        }
        return false;
}

1

Il problema per me era che la mia password conteneva una blackslash "\" , che copio incollata senza rendermi conto che avrebbe causato problemi.


1

Copiando da un'altra risposta , i metodi di cui sopra funzionano ma gmail sostituisce sempre l'e-mail "da" e "rispondi a" con l'account di invio effettivo di Gmail. a quanto pare c'è comunque un modo per aggirare:

http://karmic-development.blogspot.in/2013/10/send-email-from-aspnet-using-gmail-as.html

"3. Nella scheda Account, fare clic sul collegamento" Aggiungi un altro indirizzo e-mail di proprietà ", quindi verificarlo"

O forse questo

Aggiornamento 3: Reader Derek Bennett afferma: "La soluzione è accedere alle impostazioni di Gmail: account e" Rendi predefinito "un account diverso dal tuo account Gmail. Ciò farà sì che Gmail riscriva il campo Da con qualunque indirizzo email dell'account predefinito l'indirizzo è."


1

Si può provare Mailkit. Ti offre funzionalità migliori e avanzate per l'invio di posta. Puoi trovare di più da questo Ecco un esempio

    MimeMessage message = new MimeMessage();
    message.From.Add(new MailboxAddress("FromName", "YOU_FROM_ADDRESS@gmail.com"));
    message.To.Add(new MailboxAddress("ToName", "YOU_TO_ADDRESS@gmail.com"));
    message.Subject = "MyEmailSubject";

    message.Body = new TextPart("plain")
    {
        Text = @"MyEmailBodyOnlyTextPart"
    };

    using (var client = new SmtpClient())
    {
        client.Connect("SERVER", 25); // 25 is port you can change accordingly

        // Note: since we don't have an OAuth2 token, disable
        // the XOAUTH2 authentication mechanism.
        client.AuthenticationMechanisms.Remove("XOAUTH2");

        // Note: only needed if the SMTP server requires authentication
        client.Authenticate("YOUR_USER_NAME", "YOUR_PASSWORD");

        client.Send(message);
        client.Disconnect(true);
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.