Enviando email pelo servidor SMTP do Gmail com C #

242

Por algum motivo, nem a resposta aceita nem outras funcionam para " Enviar email no .NET pelo Gmail ". Por que eles não funcionariam?

ATUALIZAÇÃO: Tentei todas as respostas (aceitas ou não) na outra pergunta, mas nenhuma delas funciona.

Gostaria apenas de saber se funciona para mais alguém. Caso contrário, o Google pode ter alterado alguma coisa (o que já aconteceu antes).

Quando tento o trecho de código usado SmtpDeliveryMethod.Network, recebo rapidamente uma SmtpException no Send (message). A mensagem é

O servidor SMTP requer uma conexão segura ou o cliente não foi autenticado.

A resposta do servidor foi:

5.5.1 Autenticação necessária. Saiba mais em "<- sério, termina aí.

ATUALIZAR:

Essa é uma pergunta que eu fiz há muito tempo, e a resposta aceita é o código que eu usei muitas e muitas vezes em projetos diferentes.

Eu peguei algumas das idéias nesta postagem e em outros projetos EmailSender para criar um projeto EmailSender na Codeplex . Ele foi projetado para teste e suporta meus serviços SMTP favoritos, como GoDaddy e Gmail.

CVertex
fonte
Eu tentei fazer isso usando métodos semelhantes em um idioma diferente. Encontrou o mesmo tipo de coisa: métodos documentados antigos que funcionavam antes, não funcionavam para mim. Então você fica se perguntando se o Google mudou alguma coisa ou se você fez algo errado.
AaronLS
2
@aaronls a única mudança recente parece estar relacionada à porta 465. Eu tentei enquanto procurava uma solução (eu estava apenas trabalhando na mesma), e o tempo limite da porta 465 o tempo todo. Se for esse o seu caso, tente com a porta 587.
eglasius
2
Esse problema ocorre devido à "verificação de palavras" (captcha). Se você entrar via interface da Web manualmente e preencher o captcha, seu SMTP começará a funcionar.
Robert Koritnik
4
FWIW, funciona para mim. você precisa usar 587 e .EnableSSL true. c # 4 / .NET 4 atualmente não suporta 465 / SSL alternativo. demandas do gmail para configurar outros clientes de email .
usar o seguinte código
1
Siga a resposta @eglasius e ative a configuração "Permitir aplicativos menos seguros" no Gmail para permitir que o gmail autentique sua conta.
precisa saber é o seguinte

Respostas:

290

CVertex, certifique-se de revisar seu código e, se isso não revelar nada, publique-o. Eu estava apenas ativando isso em um site de teste do ASP.NET em que estava trabalhando e funciona.

Na verdade, em algum momento, tive um problema no meu código. Eu não o localizei até que eu tivesse uma versão mais simples em um programa de console e vi que estava funcionando (nenhuma alteração no lado do Gmail, como você estava preocupado). O código abaixo funciona exatamente como os exemplos a que você se referiu:

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();
        }
    }
}

Também trabalhei usando uma combinação de web.config, http://msdn.microsoft.com/en-us/library/w355a94k.aspx e código (porque não há correspondência EnableSslno arquivo de configuração :().

eglasius
fonte
1
Trabalhou brilhantemente para mim em um aplicativo winforms C #. Obrigado, Freddy.
Andrew
13
Basta lembrar que um código como este é efetivamente transmitir suas credenciais do Gmail em texto simples para o usuário ...
Chris Marisic
3
existe realmente uma configuração correspondente para enableSsl no web.config, veja a resposta abaixo #
Wiebe Tijsma
4
@ Zidad que foi adicionado em 4.0.
eglasius
21
Também pode ser necessário ativar o acesso a "aplicativos menos seguros" na sua página de configurações do gmail: google.com/settings/security/lesssecureapps . Isso é necessário se você estiver recebendo a exceção "` A resposta do servidor foi: 5.5.1 Autenticação necessária.
Ravendarksky
73

O SEGUINTE SERÁ CERTAMENTE RESPOSTA À SUA PERGUNTA SE TODOS OS OUTROS FALHAREM :

Eu recebi exatamente o mesmo erro, ao que parece, o novo algoritmo de medição de força de senha do Google mudou, considerando minha senha atual como muito fraca e não me dizendo nada sobre ela (nem mesmo uma mensagem ou aviso) ... Como descobri isso ? Bem, eu escolhi mudar minha senha para ver se isso ajudaria (tentei de tudo sem sucesso) e quando mudei minha senha, funcionou!

Então, para um experimento, tentei alterar minha senha de volta para minha senha anterior para ver o que aconteceria, e o Gmail na verdade não me permitiu fazer isso, citando o motivo "desculpe, não podemos permitir que você salve essa alteração como você escolheu a senha é muito fraca "e não me permitiu voltar à minha senha antiga. Eu deduzi disso que estava errado porque: a) você precisa alterar sua senha uma vez a cada x quantidade de meses ou b). como eu disse antes, seus algoritmos de força de senha mudaram e, portanto, a senha fraca que eu tinha não foi aceita, mesmo que eles não tenham dito nada sobre isso ao tentar fazer login em QUALQUER LUGAR! Esse (número 2) é o cenário mais provável, pois minha senha fraca tinha cerca de 4 meses e me permitiu usá-la no Gmail.

É muito ruim que eles não tenham dito nada sobre isso, mas faz sentido. Como a maioria dos emails invadidos é acessada usando software fora do gmail, acho que você precisa de uma senha mais forte se quiser usar o Gmail fora do ambiente do Gmail.

Eu espero que isso ajude!

Erx_VB.NExT.Coder
fonte
2
Obrigado, como você diz, altere a senha para que fique forte e tudo funcione bem.
Gavin
1
Esse era exatamente o meu problema - todas as outras sugestões eram sobre configuração, mas minha configuração estava correta desde o início, mas continuei recebendo o erro. Mudar a senha fez toda a diferença,
André Vermeulen
Obrigado, finalmente consegui resolver esse problema. Meu caso foi ainda mais complicado, consegui enviar e-mails da minha máquina de desenvolvimento (que fica na Geórgia, no Cáucaso), mas os e-mails estavam falhando nos servidores de produção (Reino Unido). alterar a senha para o complexo um tudo funciona agora :)
Kirill Chilingarashvili
Obrigado. Eu tive o mesmo problema da minha conta do Gmail, que não possuía uma força de senha. Eu atualizei com um forte e meus códigos estão funcionando.
Thomas.Benz
Obrigado, sim, finalmente, basta alterar a senha para uma senha forte.
precisa saber é o seguinte
66

Além das outras etapas de solução de problemas acima, também gostaria de acrescentar que, se você ativou a autenticação de dois fatores (também conhecida como verificação em duas etapas ) na sua conta do GMail, deve gerar uma senha específica do aplicativo e usar essa nova funcionalidade. senha gerada para autenticar via SMTP .

Para criar um, visite: https://www.google.com/settings/ e escolha Autorizando aplicativos e sites para gerar a senha.

John Rasch
fonte
1
Eu não tinha a verificação em duas etapas ativada e não importava a segurança da senha, essa era a única maneira de solucionar o problema. Consegui usar outras contas do Gmail sem senhas em duas etapas e mais fracas, sem problemas ... para usar a conta que eu realmente queria usar, tive que ativar as duas etapas e usar uma senha específica do aplicativo.
Ian Robertson
Exatamente o que estou fazendo, ainda assim o mesmo erro: - / Está agindo como se minha senha não fosse forte o suficiente, mas estou usando a senha do aplicativo que o Gmail me deu !!!
Jerry rodeio
54
Turn On Access For Less Secure Apps and it will work for all no need to change password.

Link para a configuração do Gmail

insira a descrição da imagem aqui

Suhail Mumtaz Awan
fonte
1
Isso funcionou para mim. Ainda mais, quando eu tentei enviar e-mail o caminho acima, eu tenho realmente enviar e-mail do Google onde eles explicitamente dizer que eles bloquearam esta tentativa de aplicativo menos seguro e eles mencionaram esta maneira de corrigi-lo
Demarsch
1
Essa é a chave mais importante do quebra-cabeça, já que eu tinha todas as outras configurações configuradas e parecia não estar funcionando. Assim que eu coloquei essa configuração, funcionou como um encanto.
22718 Perdido
1
Isso funcionou para mim. Senha do aplicativo + SSL + NetworkCredentials. (VB.NET)
CrazyIvan1974
30

Também tive alguns problemas ao enviar e-mails da minha conta do Gmail, devido a várias das situações mencionadas acima. Aqui está um resumo de como eu o fiz funcionar e mantendo-o flexível ao mesmo tempo:

  • Antes de tudo, configure sua conta do GMail:
    • Ative o IMAP e afirme o número máximo certo de mensagens (você pode fazê-lo aqui)
    • Verifique se sua senha possui pelo menos 7 caracteres e é forte (de acordo com o Google)
    • Verifique se você não precisa digitar um código captcha primeiro. Você pode fazer isso enviando um email de teste do seu navegador.
  • Faça alterações no web.config (ou app.config, ainda não tentei isso, mas presumo que seja tão fácil fazê-lo funcionar em um aplicativo do 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 agora, sempre que você quiser enviar e-mails, basta ligar para SSLMail.SendMail:

por exemplo, em uma página com um controle 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

Ou em qualquer lugar do seu código, você pode ligar:

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

Espero que isso ajude quem estiver neste post! (Eu usei o VB.NET, mas acho que é trivial convertê-lo para qualquer linguagem .NET.)

Sebas
fonte
+1 "enableSsl =" true" -. Isso funciona para um aplicativo de legado que não define especificamente a propriedade Smtp.enableSsl sem recompilar as assembleias Excelente dica!
Metro Smurf
e não esqueça o firewall. A porta 587 não é uma porta comum para abrir.
Guy Lowe
13
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 você receber um erro como "O servidor SMTP requer uma conexão segura ou o cliente não foi autenticado. A resposta do servidor foi: 5.5.1 Autenticação necessária. Saiba mais em" como eu recebo antes disso, verifique se a linha está SMTPClientObj.UseDefaultCredentials = Falseincluída e esta linha deve antes do SMTPClientObj.Credentials.

Tentei mudar essas duas linhas da maneira oposta e o erro 5.5.1 Authentication Required retornou.

Terry Chng
fonte
isso é exatamente o que aconteceu comigo. Quem pensou que a ordem de definir propriedades consertaria / quebraria as coisas!
Bill Yang
Este também foi o problema para mim, troquei o pedido conforme sugerido e ele funciona bem - dores de cabeça, ugh!
eth0
13

Ah ... é incrível ... Primeiro, não consegui enviar um e-mail por nenhum motivo. Mas depois que mudei a sequência dessas duas linhas, como abaixo, ela funciona perfeitamente.

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

Espero que esta ajuda !!! :)

Wirol
fonte
1
Sim, o pedido faz a diferença. Especialmente quando você define a propriedade Credentials e não deseja usar credenciais padrão.
Stefan Cvetanovski
1
De acordo com a documentação, para usar Credenciais, você precisa definir UseDefaultCredentials = false. No entanto, essas duas configurações parecem estar secretamente entrelaçadas. Se você definir UseDefaultCredentials como true ou false, isso terá o efeito colateral de definir Credentials como null. E parece que definir credenciais pode ter efeito colateral definido UseDefaultCredentials = false. Não documentado como fazer isso, porém, pode ser um bug ou apenas um desenvolvedor coxo.
Aaron
10

O problema não é da capacidade técnica de enviar pelo gmail. Isso funciona para a maioria das situações. Se você não consegue enviar uma máquina, geralmente isso ocorre porque a máquina não foi autenticada com um ser humano nos controles pelo menos uma vez.

O problema que a maioria dos usuários enfrenta é que o Google decide alterar os limites de saída o tempo todo. Você sempre deve adicionar código defensivo à sua solução. Se você começar a ver erros, diminua a velocidade de envio e pare de enviar por um tempo. Se você continuar tentando enviar o Google, às vezes, adicionará um tempo extra ao seu período de atraso antes que você possa enviar novamente.

O que fiz no meu sistema atual é enviar com um atraso de 1,5 segundo entre cada mensagem. Se houver algum erro, pare por 5 minutos e inicie novamente. Isso geralmente funciona e permitirá que você envie até os limites da conta (a última vez que verifiquei foram 2.000 para logins de clientes principais por dia).

Jason Short
fonte
1
Este foi exatamente o meu problema! Quando implantei no Production, obtive o problema e, depois de fazer login no Gmail no próprio servidor, ele começou a funcionar novamente.
ThisGuy
9

Eu tinha o mesmo problema, mas a proteção contra vírus estava bloqueando os emails de "spam" enviados. Desativar isso me permitiu usar a porta 587 para enviar email SMTP via GMail

user464329
fonte
Desativei o Windows Defender e ele também começou a funcionar.
MorioBoncz
9

Se nada mais funcionou aqui para você, talvez seja necessário permitir o acesso à sua conta do Gmail a partir de aplicativos de terceiros. Este foi o meu problema. Para permitir o acesso, faça o seguinte:

  1. Faça login na sua conta do Gmail.
  2. Visite esta página https://accounts.google.com/DisplayUnlockCaptcha e clique no botão para permitir o acesso.
  3. Visite esta página https://www.google.com/settings/security/lesssecureapps e ative o acesso a aplicativos menos seguros.

Isso funcionou para mim, espero que funcione para outra pessoa!

Celt
fonte
8

Não tenho certeza de qual versão do .NET é necessária para isso, porque eglasius mencionou que não há uma enableSslconfiguração correspondente (estou usando o .NET 4.0, mas suspeito que funcione no .NET 2.0 ou posterior), mas essa configuração justamente funcionou para eu (e não requer que você use nenhuma configuração programática):

<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>

Pode ser necessário ativar o POP ou IMAP na sua conta do Gmail primeiro: https://mail.google.com/mail/?shva=1#settings/fwdandpop

Eu recomendo tentar com um cliente de correio normal primeiro ...

Wiebe Tijsma
fonte
2
que é novo na versão 4.0, compare as versões em -> msdn.microsoft.com/en-us/library/ms164242(v=VS.90).aspx
eglasius
Oi Eglasius ... OK, obrigado por isso! Estranho, eles só têm a abordagem programática no pré-4.0. Eu acho que todos nós esquecer as coisas agora e então :)
Wiebe Tijsma
6

@Andres Pompiglio: Sim, está certo, você deve alterar sua senha pelo menos uma vez. Este código funciona perfeitamente:

//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 você pode fazer uma chamada para a função usando:

Response.Write(SendMail(recipient Address, "[email protected]", "ccList if any", "subject", "body"))
maxcoder
fonte
O servidor SMTP requer uma conexão segura ou o cliente não foi autenticado. A resposta do servidor foi: 5.5.1 Autenticação necessária. Saiba mais em
Savas Adar
6

Eu estava usando conexão VPN corporativa. Foi por esse motivo que não pude enviar e-mails do meu aplicativo. Funciona se eu me desconectar da VPN.

Ned
fonte
5

Também descobri que a conta que eu costumava fazer login foi desativada pelo Google por algum motivo. Depois de redefinir minha senha (da mesma forma que costumava ser), fui capaz de enviar e-mails muito bem. Eu estava recebendo a mensagem 5.5.1 também.

RKL
fonte
5

Eu também tentei muitas soluções, mas fazer algumas alterações funcionará

host = smtp.gmail.com
port = 587
username = email@gmail.com
password = password
enabledssl = true

com smtpclient acima dos parâmetros são funcionais no gmail

Suresh
fonte
5

Eu estava recebendo o mesmo erro e nenhuma das soluções acima ajudou.

Meu problema era que eu estava executando o código em um servidor remoto, que nunca havia sido usado para fazer login na conta do Gmail.

Abri um navegador no servidor remoto e entrei no Gmail a partir daí. Ele fez uma pergunta de segurança para verificar se era eu, pois esse era um novo local. Depois de fazer a verificação de segurança, consegui me autenticar através do código.

Vlad Tamas
fonte
4

Eu encontrei o mesmo erro ( "O servidor SMTP requer uma conexão segura ou o cliente não foi autenticado. A resposta do servidor foi: 5.5.1 Autenticação necessária. Saiba mais em" ) e descobri que estava usando a senha errada. Corrigi as credenciais de login e elas foram enviadas corretamente.

Eu sei que é tarde, mas talvez isso ajude outra pessoa.

Albert Bori
fonte
4

Outra coisa que descobri é que você deve alterar sua senha pelo menos uma vez. E tente usar uma senha de nível seguro (não use o mesmo usuário da senha, 123456 etc.)

Peter Mortensen
fonte
4

Mais uma solução possível para você. Eu estava tendo problemas semelhantes ao conectar-me ao gmail via IMAP. Depois de experimentar todas as soluções que encontrei, você lerá aqui e em outros lugares no SO (por exemplo, habilite o IMAP, habilite um acesso menos seguro ao seu e-mail, usando https://accounts.google.com/b/0/displayunlockcaptcha e etc.), na verdade, configurei uma nova conta do Gmail mais uma vez.

No meu teste original, a primeira conta do Gmail que eu criei, eu havia me conectado à minha conta principal do Gmail. Isso resultou em um comportamento irregular, onde a conta errada estava sendo referenciada pelo Google. Por exemplo, a execução de https://accounts.google.com/b/0/displayunlockcaptcha abriu minha conta principal em vez da que eu havia criado para esse fim.

Então, quando criei uma nova conta e não a conectei à minha conta principal, depois de seguir todas as etapas apropriadas, como acima, descobri que funcionava bem!

Ainda não confirmei isso (ou seja, reproduzi), mas aparentemente o fez por mim ... espero que ajude.

sinewave440hz
fonte
4
  1. Primeiro, verifique a configuração da sua conta do Gmail e ative em "Acesso a aplicativos menos seguros" insira a descrição da imagem aqui

É altamente recomendável que você use um aplicativo seguro, como o Gmail, para acessar sua conta. Todos os aplicativos criados pelo Google atendem a esses padrões de segurança. Usar um aplicativo menos seguro, por outro lado, pode deixar sua conta vulnerável. Saber mais.

  1. Conjunto

    smtp.UseDefaultCredentials = false;

    antes

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

Um ou mais motivos existem para esses erros.

  • Faça login com seu Gmail (ou qualquer outro se) em seu sistema local.

  • Verifique também o aplicativo menos seguro e defina-o como "Ligar", aqui está o link para o GMAIL. https://www.google.com/settings/security/lesssecureapps

  • verifique EnableSsl no seu código de e-mail e defina-o como verdadeiro.

    smtp.EnableSsl = true;
  • Verifique também qual porta você está usando atualmente. 25 é Global, mas você também pode consultá-lo como 587. verifique aqui. Toda a comunicação SMTP ocorre acima de 25?

  • SE ESTIVER REMOTO : Verifique a resposta de Vlad Tamas acima.

Bharat
fonte
e se eu não quiser ativar as configurações de aplicativo menos seguras, como outros clientes de email fazem isso por que não consigo fazer o mesmo com c #?
user734028
3

Você também pode se conectar via porta 465, mas devido a algumas limitações do espaço para nome System.Net.Mail, talvez seja necessário alterar seu código. Isso ocorre porque o espaço para nome não oferece a capacidade de fazer conexões SSL implícitas. Isso é discutido em http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx e I fornecemos um exemplo de como usar o CDO (Collaborative Data Object) em outra discussão ( GMail SMTP via erros de C # .Net em todas as portas ).

Bryan Allred
fonte
3

Eu tive esse problema resolvido. Aparentemente, essa mensagem é usada em vários tipos de erro. Meu problema era que havia atingido o máximo de 500 e-mails enviados.

faça login na conta e tente enviar um email manualmente. Se o limite for atingido, você será informado

Ayson Baxter
fonte
2
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;
somesh
fonte
1

Altere sua senha do Gmail e tente novamente. Depois disso, ela funcionará.

Não sei por que, mas toda vez que você altera sua hospedagem, é necessário alterar sua senha.

Jo Smo
fonte