Enviando email no .NET através do Gmail

876

Em vez de confiar no meu host para enviar um email, eu estava pensando em enviar as mensagens de email usando minha conta do Gmail . Os e-mails são personalizados para as bandas que eu toco no meu programa.

É possível fazê-lo?

Mike Wills
fonte
1
< systemnetmail.com > é provavelmente o site mais absurdamente completo dedicado a um único namespace .NET ... mas tem TUDO o que você poderia querer saber sobre o envio de email via .NET, seja ASP.NET ou Desktop. < systemwebmail.com > era o URL original da postagem, mas não deve ser usado para o .NET 2.0 e superior.
21118 Adam Haile
13
Se você estiver usando o ASP.Net Mvc, eu recomendaria dar uma olhada no MvcMailer: github.com/smsohan/MvcMailer/wiki/MvcMailer-Step-by-Step-Guide
noocyte
Eu tenho um exemplo bom de como fazer isso no meu site jarloo.com/gmail-in-c
Kelly
como enviar arquivo usando esse código?
Ranadheer Reddy 28/05
possível duplicata de envio de e-mail através do servidor SMTP do Gmail com C #
George Duckett

Respostas:

1065

Certifique-se de usar System.Net.Mail, não o obsoleto System.Web.Mail. Fazer SSL com System.Web.Mailé uma bagunça grosseira de extensões hacky.

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

var fromAddress = new MailAddress("[email protected]", "From Name");
var toAddress = new MailAddress("[email protected]", "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);
}
Domenic
fonte
49
Você ainda pode obter erros de logon do usuário se o Google decidir de repente que você enviou muitos nos últimos xx minutos. Você sempre deve adicionar um trySend, se os erros durarem um pouco e, em seguida, tentar novamente.
2625 Jason Jason
72
Nota interessante: se você trocar 'UseDefaultCredentials = false' e 'Credentials = ...', ele não será autenticado.
21139 Nathan Wheeler
13
Não há problemas com o SPF usando esse método. Todo cliente de email pode ser configurado para fazer exatamente isso. Você só pode ter problemas se usar seu próprio servidor (ou seja, algo mais que isso smtp.gmail.com) [email protected]como remetente. Btw: smtp.gmail.comsubstitui automaticamente o endereço do remetente, se não for o seu.
Meinersbur 18/03/10
24
Eu estava tendo dificuldades para fazer isso funcionar, mesmo tentando vários ajustes. Conforme sugerido em uma postagem relacionada, descobri que era realmente o meu antivírus que estava impedindo que os emails fossem enviados com êxito. O antivírus em questão é o McAffee e sua "Proteção de acesso" possui uma categoria "Proteção padrão antivírus" que possui a regra "Impedir que worms de mala direta em massa enviem email". Ajustar / desabilitar essa regra deixou esse código funcionando para mim!
yourbuddypal
18
Eu estava recebendo a mensagem de erro 5.5.1 Autenticação necessária até perceber que estava testando com uma conta (minha pessoal) que tinha a autenticação de dois fatores ativada. Depois que usei uma conta que não tinha, funcionou bem. Eu também poderia ter gerado uma senha para o meu aplicativo que estava testando no meu conta pessoal, mas não queria fazer isso.
precisa
153

A resposta acima não funciona. Você precisa definir DeliveryMethod = SmtpDeliveryMethod.Networkou ele retornará com um erro "o cliente não foi autenticado ". Também é sempre uma boa ideia colocar um tempo limite.

Código revisado:

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

var fromAddress = new MailAddress("[email protected]", "From Name");
var toAddress = new MailAddress("[email protected]", "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);
}
Donny V.
fonte
3
Interessante; funciona na minha máquina (TM). Mas, como isso parece plausível, vou adicioná-lo à minha resposta.
Domenic
3
Hmm, meu palpite é que SmtpDeliveryMethod.Network é o padrão, mas talvez o padrão seja alterado durante a execução no IIS --- era isso que você estava fazendo?
Domenic
3
Estou usando o mesmo código no aplicativo Console. É através do erro "Falha no envio de email".
precisa
5
Esta resposta não funciona. Por favor, olhe para a questão stackoverflow.com/questions/34851484/...
110

Para que as outras respostas funcionem "de um servidor", primeiro ative o Acesso para aplicativos menos seguros na conta do Gmail.

Parece que o Google mudou recentemente sua política de segurança. A resposta com a melhor classificação não funciona mais até que você altere as configurações da sua conta, conforme descrito aqui: https://support.google.com/accounts/answer/6010255?hl=pt-BRinsira a descrição da imagem aqui

insira a descrição da imagem aqui

Em março de 2016, o Google alterou o local da configuração novamente!

BCS Software
fonte
4
Isso funcionou para mim. E também é preocupante. Não tenho certeza se quero desativar essa segurança. Talvez precise repensar ...
Sully
4
Do ponto de vista da segurança, é melhor ativar a Verificação em duas etapas e gerar e usar a senha do aplicativo. Consulte Como enviar um email no .Net de acordo com as novas políticas de segurança?
Michael Freidgeim
2
@BCS Software, no meu programa, o usuário insere qualquer email que meu programa precise usá-lo para enviar a mensagem. Então, como posso tornar o usuário de email capaz de enviar o email mesmo se a autenticação de dois fatores estiver ativada?
Alaa'
Essa é a mesma configuração que você precisa alterar se quiser usar um cliente Microsoft Outlook (em um desktop, celular, etc.) para enviar / receber e-mails pelo GMail do Google.
Brett Rigby
41

Isto é para enviar e-mail com anexo .. Simples e curto ..

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 [email protected]");
    mail.To.Add("[email protected]");
    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 [email protected]", "your password");
    SmtpServer.EnableSsl = true;

    SmtpServer.Send(mail);

}
Ranadheer Reddy
fonte
21

O Google pode bloquear tentativas de login de alguns aplicativos ou dispositivos que não usam padrões de segurança modernos. Como esses aplicativos e dispositivos são mais fáceis de invadir, bloqueá-los ajuda a manter sua conta mais segura.

Alguns exemplos de aplicativos que não oferecem suporte aos mais recentes padrões de segurança incluem:

  • O aplicativo Mail no seu iPhone ou iPad com iOS 6 ou inferior
  • O aplicativo Mail no seu Windows phone anterior à versão 8.1
  • Alguns clientes de correio da área de trabalho, como o Microsoft Outlook e o Mozilla Thunderbird

Portanto, você deve habilitar o Logon menos seguro na sua conta do Google.

Depois de fazer login na conta do Google, acesse:

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

Em C #, você pode usar o seguinte código:

using (MailMessage mail = new MailMessage())
{
    mail.From = new MailAddress("[email protected]");
    mail.To.Add("[email protected]");
    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 protected]", "password");
        smtp.EnableSsl = true;
        smtp.Send(mail);
    }
}
mjb
fonte
17

Para que eu funcionasse, tive que ativar minha conta do Gmail, possibilitando o acesso de outros aplicativos. Isso é feito com "ativar aplicativos menos seguros" e também usando este link: https://accounts.google.com/b/0/DisplayUnlockCaptcha

Mark Homans
fonte
16

Aqui está minha versão: " Enviar email em c # usando o 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 = "[email protected]";
      //Specify The Address You want to sent Email To(can be any valid email address)
      string ReceiversAddress = "[email protected]";
      //Specify The password of gmial account u are using to sent mail(pw of [email protected])
      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();
     }
    }
   }
 }
tehie
fonte
8
Embora seu artigo possa de fato responder à pergunta, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência. O estouro de pilha é tão útil quanto suas perguntas e respostas, e se o host do seu blog ficar inoperante ou os URLs forem movidos, essa resposta se tornará inútil. Obrigado!
sarnold
14

Espero que esse código funcione bem. Você pode tentar.

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

string fromAddress = "[email protected]";
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("[email protected]");
//address to which mail will be sent.           
send_mail.To.Add(new MailAddress("[email protected]");
//subject of the mail.
send_mail.Subject = "put any subject here";

send_mail.Body = messageBody;
client.Send(send_mail);
Premdeep Mohanty
fonte
2
mensagem send_mail = new MailMessage (); Como essa linha deve funcionar? Você não pode converter implicitamente 'System.Net.Mail.MailMessage' em 'System.Windows.Forms.Message'
Debaprasad
9

Inclua isso,

using System.Net.Mail;

E depois,

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("[email protected]","password");
client.EnableSsl = true;

client.Send(sendmsg);
GOPI
fonte
8

Origem : Enviar email no ASP.NET C #

Abaixo está um exemplo de código de trabalho para enviar um email usando C #, no exemplo abaixo, estou usando o servidor smtp do google.

O código é bastante auto-explicativo, substitua email e senha pelos seus valores de email e senha.

public void SendEmail(string address, string subject, string message)
{
    string email = "[email protected]";
    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);
}
Yasser Shaikh
fonte
Em vez de var, usei o nome da classe como NetworkCredential, MailMessage e SmtpClient. Isso funciona para mim.
Teste Jui 28/02
7

Se você deseja enviar um email de plano de fundo, faça o seguinte

 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 adicione espaço para nome

using System.Threading;
RAJESH KUMAR
fonte
5

Experimente,

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

            mail.From = new MailAddress("[email protected]");
            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());
        }
    }
Solução de Software Trimantra
fonte
4

use desta maneira

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("[email protected]","MyPassWord");
client.Send(sendmsg);

Não se esqueça disso:

using System.Net;
using System.Net.Mail;
alireza amini
fonte
4

Para evitar problemas de segurança no Gmail, você deve gerar uma senha de aplicativo primeiro nas configurações do Gmail e usar essa senha em vez de uma senha real para enviar um email, mesmo se você usar a verificação em duas etapas.

Sayed Uz Zaman
fonte
3

Alteração do remetente no e-mail do Gmail / Outlook.com:

Para impedir a falsificação - o Gmail / Outlook.com não permite o envio de um nome de conta arbitrário.

Se você tiver um número limitado de remetentes, siga estas instruções e defina o Fromcampo para este endereço: Enviando email de um endereço diferente

Se você deseja enviar a partir de um endereço de email arbitrário (como um formulário de feedback no site em que o usuário digita o email e você não deseja que ele envie um email diretamente para você) sobre o melhor que você pode fazer é:

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

Com isso, basta clicar em 'responder' na sua conta de e-mail para responder ao fã da sua banda em uma página de feedback, mas eles não receberão seu e-mail real, o que provavelmente levaria a uma tonelada de spam.

Se você estiver em um ambiente controlado, isso funcionará muito bem, mas observe que alguns clientes de email enviam para o endereço de origem mesmo quando a resposta é especificada (não sei qual).

Simon_Weaver
fonte
3

Eu tive o mesmo problema, mas foi resolvido acessando as configurações de segurança do gmail e Permitindo aplicativos menos seguros . O código de Domenic & Donny funciona, mas somente se você tiver ativado essa configuração

Se você fez login (no Google), siga este link e alterne "Ativar" para "Acesso a aplicativos menos seguros"

DarkPh03n1X
fonte
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 = "[email protected]";
      //Specify The Address You want to sent Email To(can be any valid email address)
      string ReceiversAddress = "[email protected]";
      //Specify The password of gmial account u are using to sent mail(pw of [email protected])
      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();
     }
}
}
}
Moin Shirazi
fonte
2

Aqui está um método para enviar email e obter credenciais do 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 a seção correspondente em web.config:

<appSettings>
    <add key="mailCfg" value="[email protected]"/>
</appSettings>
<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network" from="[email protected]">
      <network defaultCredentials="false" host="mail.exapmple.com" userName="[email protected]" password="your_password" port="25"/>
    </smtp>
  </mailSettings>
</system.net>
iTURTEV
fonte
2

Tente este

public static bool Send(string receiverEmail, string ReceiverName, string subject, string body)
{
        MailMessage mailMessage = new MailMessage();
        MailAddress mailAddress = new MailAddress("[email protected]", "Sender Name"); // [email protected] = 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("[email protected]", "pass")   // [email protected] = 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;
}
reza.cse08
fonte
1

O problema para mim era que minha senha tinha uma barra preta "\" , copiada e colada sem perceber que causaria problemas.

Satbir Kira
fonte
1

Copiando de outra resposta , os métodos acima funcionam, mas o gmail sempre substitui o email "de" e "responde ao" pela conta real do envio do gmail. aparentemente, há uma solução alternativa:

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

"3. Na guia Contas, clique no link" Adicione outro endereço de e-mail que você possui "e verifique-o"

Ou possivelmente isso

Atualização 3: O leitor Derek Bennett diz: "A solução é acessar as configurações do seu Gmail: contas e" Tornar padrão "uma conta que não seja a sua conta do Gmail. Isso fará com que o Gmail reescreva o campo De com o email da conta padrão o endereço é."

rogerdpack
fonte
1

Você pode tentar Mailkit. Oferece funcionalidades melhores e avançadas para o envio de e-mail. Você pode encontrar mais sobre isso Aqui está um exemplo

    MimeMessage message = new MimeMessage();
    message.From.Add(new MailboxAddress("FromName", "[email protected]"));
    message.To.Add(new MailboxAddress("ToName", "[email protected]"));
    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);
    }
Naveen
fonte