it-swarm-es.com

Envío de correo electrónico a través del servidor SMTP de Gmail con C #

Por alguna razón, ni la respuesta aceptada ni ninguna otra para mí funcionan para " Enviar correo electrónico en .NET a través de Gmail ". ¿Por qué no trabajarían?

ACTUALIZACIÓN: He intentado todas las respuestas (aceptadas y de otro tipo) en la otra pregunta, pero ninguna de ellas funciona.

Solo me gustaría saber si funciona para alguien más, de lo contrario, Google podría haber cambiado algo (lo que ha ocurrido antes).

Cuando intento el fragmento de código que usa SmtpDeliveryMethod.Network, recibo rápidamente una SmtpException en Enviar (mensaje). El mensaje es

El servidor SMTP requiere una conexión segura o el cliente no fue autenticado.

La respuesta del servidor fue:

5.5.1 Se requiere autenticación. Aprende más en "<- en serio, ahí termina.

ACTUALIZACIÓN:

Esta es una pregunta que hice hace mucho tiempo, y la respuesta aceptada es el código que he usado muchas, muchas veces en diferentes proyectos.

He tomado algunas de las ideas de esta publicación y otros proyectos de EmailSender para crear un proyecto de EmailSender en Codeplex . Está diseñado para probarse y es compatible con mis servicios SMTP favoritos, como GoDaddy y Gmail.

229
CVertex

CVertex, asegúrese de revisar su código y, si eso no revela nada, publíquelo. Acabo de habilitar esto en un sitio de prueba ASP.NET en el que estaba trabajando, y funciona.

En realidad, en algún momento tuve un problema con mi código. No lo detecté hasta que tuve una versión más simple en un programa de consola y vi que funcionaba (no hubo cambios en el lado de Gmail, ya que estaba preocupado). El siguiente código funciona igual que las muestras a las que hizo referencia:

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

También lo puse en funcionamiento usando una combinación de web.config, http://msdn.Microsoft.com/en-us/library/w355a94k.aspx y el código (porque no hay EnableSsl coincidente en el archivo de configuración: ().

283
eglasius

LA SIGUIENTE VOLUNTAD CASI CERAMENTE SERÁ LA RESPUESTA A SU PREGUNTA SI TODO LO MÁS HA FALLADO :

Recibí exactamente el mismo error, resulta que el nuevo algoritmo de medición de la fuerza de la contraseña de Google ha cambiado considerando que mi contraseña actual es demasiado débil, y no me dice nada al respecto (ni siquiera un mensaje o advertencia) ... ¿Cómo descubrí esto? ? Bueno, elegí cambiar mi contraseña para ver si ayudaría (probé todo lo demás en vano) y cuando cambié mi contraseña, ¡funcionó!

Luego, para un experimento, intenté cambiar mi contraseña de nuevo a mi contraseña anterior para ver qué sucedería, y Gmail no me permitió hacerlo, citando el motivo "lo sentimos, no podemos permitirle guardar este cambio como lo eligió. la contraseña es demasiado débil "y no me permitiría volver a mi contraseña anterior. A partir de esto, me di cuenta de que se estaba produciendo un error porque a) necesita cambiar su contraseña una vez cada x cantidad de meses o b). como dije antes, sus algoritmos de seguridad de contraseñas cambiaron y, por lo tanto, la contraseña débil que tenía no fue aceptada, ¡aunque no dijeron nada sobre esto cuando intentaron iniciar sesión EN CUALQUIER LUGAR! Este (el número 2) es el escenario más probable, ya que mi contraseña débil tenía aproximadamente 4 meses y me permitió usarla en Gmail.

Es bastante malo que no hayan dicho nada sobre esto, pero tiene sentido. Debido a que la mayoría de los correos electrónicos secuestrados inician sesión utilizando software fuera de Gmail, y supongo que se requiere que tenga una contraseña más segura si desea usar Gmail fuera del entorno de Gmail.

¡Espero que esto ayude!

66

Además de los otros pasos de solución de problemas anteriores, también me gustaría agregar que si ha habilitado la autenticación de dos factores (también conocida como verificación de dos pasos ) en su cuenta de GMail, usted debe generar una aplicación - contraseña específica y use esa contraseña recién generada para autenticarse a través de SMTP .

Para crear uno, visite: https://www.google.com/settings/ y elija Autorizar aplicaciones y sitios para generar la contraseña.

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

Enlace a la configuración de Gmail

enter image description here

50
Suhail Mumtaz Awan

También he tenido algunos problemas para enviar correos electrónicos desde mi cuenta de gmail, debido a varias de las situaciones mencionadas anteriormente. Aquí hay un resumen de cómo lo puse en funcionamiento y lo mantuve flexible al mismo tiempo:

  • En primer lugar, configure su cuenta de Gmail:
    • Habilite IMAP y establezca el número máximo correcto de mensajes (puede hacerlo aquí)
    • Asegúrese de que su contraseña tenga al menos 7 caracteres y sea segura (según Google)
    • Asegúrate de no tener que ingresar primero un código captcha. Puede hacerlo enviando un correo electrónico de prueba desde su navegador.
  • Haga cambios en web.config (o app.config, no lo he intentado todavía, pero supongo que es igual de fácil hacer que funcione en una aplicación de 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

Y ahora, cuando quiera enviar correos electrónicos, todo lo que necesita hacer es llamar a SSLMail.SendMail:

p.ej. en una página con un control 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 en cualquier parte de tu código puedes llamar:

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

Espero que esto ayude a cualquiera que se encuentre con este post! (Utilicé VB.NET pero creo que es trivial convertirlo a cualquier lenguaje .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")

Si recibe un error como "El servidor SMTP requiere una conexión segura o el cliente no fue autenticado. La respuesta del servidor fue: 5.5.1 Se requiere autenticación. Obtenga más información en" tal como aparece antes de esto, asegúrese de que la línea SMTPClientObj.UseDefaultCredentials = False esté incluida y esto la línea debe estar delante de SMTPClientObj.Credentials.

Intenté cambiar estas 2 líneas de manera opuesta y el 5.5.1 Autenticación requerida error devuelto.

13
Terry Chng

Oh ... Es increíble ... Primero no pude enviar un correo electrónico por ningún motivo. Pero después de cambiar la secuencia de estas dos líneas como se muestra a continuación, funciona perfectamente.

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

¡¡¡Espero que esto ayude!!! :)

12
Wirol

Tuve el mismo problema, pero resultó que mi protección contra virus estaba bloqueando el correo electrónico saliente "spam". Apagar esto me permitió usar el puerto 587 para enviar correos electrónicos SMTP a través de GMail

9
user464329

Pasos simples para solucionar esto:

1) Inicia sesión en tu Gmail

2) Vaya a esta página https://www.google.com/settings/security/lesssecureapps & configure en "Activar"

9
Kevin

El problema no es el de la capacidad técnica para enviar a través de gmail. Eso funciona para la mayoría de las situaciones. Si no puede hacer que se envíe una máquina, generalmente se debe a que la máquina no se ha autenticado con un humano en los controles al menos una vez.

El problema que enfrenta la mayoría de los usuarios es que Google decide cambiar los límites de salida todo el tiempo. Siempre debe agregar código defensivo a su solución. Si comienza a ver los errores, baje la velocidad de envío y deje de enviar por un tiempo. Si sigue intentando enviar Google, algunas veces agregará tiempo adicional a su período de demora antes de que pueda volver a enviar.

Lo que he hecho en mi sistema actual es enviar con un retraso de 1.5 segundos entre cada mensaje. Luego, si aparece algún error, pare durante 5 minutos y luego comience de nuevo. Por lo general, esto funciona y le permitirá enviar hasta los límites de la cuenta (la última vez que verifiqué fue de 2,000 inicios de sesión de clientes principales por día).

9
Jason Short

No estoy seguro de qué versión .NET se requiere para esto porque eglasius mencionó que no hay una configuración enableSsl coincidente (estoy usando .NET 4.0, pero sospecho que funciona en .NET 2.0 o posterior), pero esta configuración solo funcionó para mí (y no requiere que uses ninguna configuración 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>

Es posible que primero tenga que habilitar POP o IMAP en su cuenta de Gmail: https://mail.google.com/mail/?shva=1#settings/fwdandpop

Recomiendo probarlo primero con un cliente de correo normal ...

8
Wiebe Tijsma

Si nada más ha funcionado aquí para usted, es posible que deba permitir el acceso a su cuenta de gmail desde aplicaciones de terceros. Este fue mi problema Para permitir el acceso haga lo siguiente:

  1. Inicia sesión en tu cuenta de gmail.
  2. Visite esta página https://accounts.google.com/DisplayUnlockCaptcha y haga clic en el botón para permitir el acceso.
  3. Visite esta página https://www.google.com/settings/security/lesssecureapps y habilite el acceso para aplicaciones menos seguras.

Esto funcionó para mí, espero que funcione para alguien más.

8
Celt

Estaba usando la conexión VPN corporativa. Fue la razón por la que no pude enviar correos electrónicos desde mi aplicación. Funciona si me desconecto de VPN.

6
Ned

@Andres Pompiglio: Sí, es correcto, debe cambiar su contraseña al menos una vez ... estos códigos funcionan bien:

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

Y puedes hacer una llamada a la función usando:

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

También descubrí que la cuenta que solía iniciar sesión estaba desactivada por Google por algún motivo. Una vez que restablecí mi contraseña (al mismo que solía ser), pude enviar correos electrónicos muy bien. Estaba recibiendo mensaje 5.5.1 también.

5
RKL

También he intentado muchas soluciones pero hacer algunos cambios funcionará

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

con smtpclient los parámetros anteriores funcionan en gmail

5
Suresh

Otra solución posible para usted. Estaba teniendo problemas similares al conectarse a gmail a través de IMAP. Después de probar todas las soluciones que encontré sobre las que leerá aquí y en otras partes en SO (por ejemplo, habilite IMAP, habilite un acceso menos seguro a su correo, usando https://accounts.google. com/b/0/displayunlockcaptcha y así sucesivamente), realmente configuro una nueva cuenta de gmail una vez más.

En mi prueba original, la primera cuenta de gmail que había creado, me había conectado a mi cuenta principal de gmail. Esto dio lugar a un comportamiento errático en el que Google hacía referencia a la cuenta incorrecta. Por ejemplo, al ejecutar https://accounts.google.com/b/0/displayunlockcaptcha abrí mi cuenta principal en lugar de la que había creado para este fin.

Entonces, cuando creé una nueva cuenta y no la conecté a mi cuenta principal, después de seguir todos los pasos apropiados como se indicó anteriormente, ¡encontré que funcionó bien!

Todavía no lo he confirmado (es decir, se ha reproducido), pero aparentemente lo hizo por mí ... espero que ayude.

4
sinewave440hz

Recibí el mismo error y ninguna de las soluciones anteriores me ayudó.

Mi problema era que estaba ejecutando el código desde un servidor remoto, que nunca se había utilizado para iniciar sesión en la cuenta de gmail.

Abrí un navegador en el servidor remoto e inicié sesión en gmail desde allí. Hizo una pregunta de seguridad para verificar que era yo, ya que esta era una nueva ubicación. Después de realizar el control de seguridad, pude autenticarme a través del código.

4
Vlad Tamas

Me encontré con este mismo error ( "El servidor SMTP requiere una conexión segura o el cliente no se autenticó. La respuesta del servidor fue: 5.5.1 Requiere autenticación. Obtenga más información en" ) y descubrí que estaba usando contraseña incorrecta. Fijé las credenciales de inicio de sesión, y se envió correctamente.

Sé que esto es tarde, pero tal vez esto ayude a alguien más.

4
Albert Bori

Active las aplicaciones menos seguras para su cuenta: https://www.google.com/settings/security/lesssecureapps

4
Burak Kalkan
  1. Primero verifique la configuración de su cuenta de gmail y active desde "Acceso para aplicaciones menos seguras"  enter image description here

Le recomendamos encarecidamente que utilice una aplicación segura, como Gmail, para acceder a su cuenta. Todas las aplicaciones hechas por Google cumplen con estos estándares de seguridad. El uso de una aplicación menos segura, por otro lado, podría dejar su cuenta vulnerable. Aprende más.

  1. Conjunto

    smtp.UseDefaultCredentials = false;
    

    antes de

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

Otra cosa que he encontrado es que debes cambiar tu contraseña al menos una vez. Y trate de usar una contraseña de nivel seguro (no use el mismo usuario que la contraseña, 123456, etc.)

4
Andres Pompiglio

Tuve este problema resuelto Aparentemente ese mensaje se usa en múltiples tipos de error. Mi problema era que había alcanzado mi máximo de 500 correos enviados.

inicia sesión en la cuenta e intenta enviar un correo manualmente. Si se ha alcanzado el límite se lo informará.

3
Ayson Baxter

También puede conectarse a través del puerto 465, pero debido a algunas limitaciones del espacio de nombres System.Net.Mail, es posible que tenga que modificar su código. Esto se debe a que el espacio de nombres no ofrece la capacidad de realizar conexiones SSL implícitas. Esto se discute en http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx , y he proporcionado un ejemplo de cómo usar el CDO (Objeto de datos de colaboración) en otra discusión ( GMail SMTP a través de C # .Net errores en todos los puertos ).

3
Bryan Allred

Una o más razones existen para estos errores.

  • Inicia sesión con tu Gmail (o cualquier otro si) en tu sistema local.

  • También busque la aplicación Less Secure y configúrela en "Activar" aquí está el enlace para GMAIL. https://www.google.com/settings/security/lesssecureapps

  • verifica EnableSsl en tu código de correo electrónico, y también configúralo en verdadero.

    smtp.EnableSsl = true;
    
  • También verifique qué puerto está utilizando actualmente. 25 es Global, pero también puede verificarlo para otros como 587. marque aquí. ¿Toda la comunicación SMTP ocurre más de 25?

  • SI ESTÁ EN EL CONTROL REMOTO : Verifique la respuesta de Vlad Tamas arriba.

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

Cambie su contraseña de gmail e inténtelo de nuevo, debería funcionar después de eso.

No sé por qué, pero cada vez que cambie su alojamiento, tendrá que cambiar su contraseña.

1
Jo Smo

Si tiene un paso de verificación de 2 pasos en su cuenta de Gmail, deberá generar una contraseña de la aplicación. https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=en&visit_id=636903322072234863-1319515789&rd=1 Seleccione Cómo generar una opción de contraseña de aplicación y siga los pasos que se proporcionan. Copie y pegue la contraseña de la aplicación generada en algún lugar, ya que no podrá recuperarla después de hacer clic en HECHO.

0
Faith Nassiwa