Отправка электронной почты через SMTP-сервер Gmail с помощью C#

почему-то ни принятый ответ, ни какие-либо другие не работают для меня "отправка писем .Чистый через Gmail". Почему они не работают?

UPDATE: я пробовал все ответы (принятые и другие) в другом вопросе, но ни один из них не работает.

Я просто хотел бы знать, работает ли он для кого-то еще, иначе Google, возможно, что-то изменил (что произошло раньше).

когда я пробую фрагмент кода, который использует SmtpDeliveryMethod.Network, Я быстро получаю SmtpException при отправке (сообщение). Сообщение

SMTP-сервер требует защищенного соединения или клиент не прошел проверку подлинности.

ответ сервера:

Проверка Подлинности 5.5.1 Требуется. Узнайте больше на"

обновление:

это вопрос, который я задал давно, и принятый ответ код, который я использовал много, много раз в разных проектах.

Я взял некоторые идеи в этом посте и других проектах EmailSender, чтобы создать проект EmailSender в Codeplex. Он предназначен для тестируемости и поддерживает мои любимые службы SMTP, такие как GoDaddy и Gmail.

27 ответов


CVertex, обязательно просмотрите свой код и, если это ничего не покажет, опубликуйте его. Я просто включение этого на сайте ASP.NET тест я работал, и он работает.

На самом деле, в какой-то момент у меня возникла проблема с моим кодом. Я не заметил этого, пока у меня не была более простая версия на консольной программе и не увидел, что она работает (никаких изменений на стороне Gmail, как вы беспокоились). Приведенный ниже код работает так же, как образцы, на которые вы ссылались:

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("myusername@gmail.com", "mypwd"),
                EnableSsl = true
            };
            client.Send("myusername@gmail.com", "myusername@gmail.com", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

Я также получил его работа с использованием комбинации web.config,http://msdn.microsoft.com/en-us/library/w355a94k.aspx и код (потому что нет соответствия EnableSsl в файле конфигурации :( ).


СЛЕДУЮЩЕЕ ПОЧТИ НАВЕРНЯКА БУДЕТ ОТВЕТ НА ВАШ ВОПРОС ЕСЛИ ВСЕ ОСТАЛЬНОЕ НЕ УДАЛОСЬ:

Я получил точно такую же ошибку, оказывается, новый алгоритм измерения пароля Google изменился, считая мой текущий пароль слишком слабым и не говоря мне об этом (даже не сообщение или предупреждение)... Как я это обнаружил? Ну, я решил изменить свой пароль, чтобы увидеть, поможет ли это (пробовал все остальное безрезультатно), и когда я сменил пароль, сработало!

затем, для эксперимента, я попытался изменить свой пароль обратно на мой предыдущий пароль, чтобы увидеть, что произойдет, и Gmail на самом деле не позволил мне сделать это, сославшись на причину "извините, мы не можем позволить вам сохранить это изменение, поскольку ваш выбранный пароль слишком слаб" и не позволил мне вернуться к моему старому паролю. Я понял из этого, что это ошибка, потому что либо a) вам нужно изменить свой пароль один раз в x месяцев или b). как я сказал раньше их алгоритмы силы пароля менялись, и поэтому слабый пароль, который у меня был, не был принят, хотя они ничего не говорили об этом при попытке войти в любом месте! Это (номер 2) является наиболее вероятным сценарием, так как мой слабый пароль был около 4 месяцев, и он позволил мне использовать его в Gmail.

очень плохо, что они ничего не сказали об этом, но это имеет смысл. Потому что большинство угнанных писем регистрируются с помощью программного обеспечения за пределами gmail, и я предполагаю, что вы требуется иметь более надежный пароль, если вы хотите использовать Gmail вне среды Gmail.

надеюсь, это поможет!


в дополнение к другим шагам по устранению неполадок выше, я также хотел бы добавить, что если вы включили двухфакторную аутентификацию (также известную как двухэтапной проверки) на вашей учетной записи GMail, вы необходимо создать пароль для конкретного приложения и использовать этот вновь сгенерированный пароль для аутентификации через SMTP.

создать, на странице: https://www.google.com/settings/ и авторизация приложений и сайтов для генерации пароля.


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

ссылка на настройки Gmail

enter image description here


у меня были некоторые проблемы с отправкой писем из моей учетной записи gmail, которые были вызваны несколькими из вышеупомянутых ситуаций. Вот краткое изложение того, как я заставил его работать, и сохраняя его гибким в то же время:

  • прежде всего настройте свою учетную запись GMail:
    • включить IMAP и утвердить нужное максимальное количество сообщений (вы можете сделать это здесь)
    • убедитесь, что ваш пароль не менее 7 символов и сильна (по данным Google)
    • убедитесь, что вам не нужно сначала ввести код captcha. Вы можете сделать это, отправив тестовое письмо из браузера.
  • внести изменения в web.config (или app.config, я еще не пробовал, но я предполагаю, что так же легко заставить его работать в приложении windows):
<configuration>
    <appSettings>
        <add key="EnableSSLOnMail" value="True"/>   
    </appSettings>

    <!-- other settings --> 

    ...

    <!-- system.net settings -->
    <system.net>
        <mailSettings>
            <smtp from="yourusername@gmail.com" deliveryMethod="Network">
                <network 
                    defaultCredentials="false" 
                    host="smtp.gmail.com" 
                    port="587" 
                    password="stR0ngPassW0rd" 
                    userName="yourusername@gmail.com"
                    />
                <!-- 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

и теперь, когда вы хотите отправить электронную почту все, что вам нужно сделать, это позвонить SSLMail.SendMail:

например, на странице с Элемент управления 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("webmaster@example.com")
    SSLMail.SendMail(e)
End Sub

End Class

или в любом месте вашего кода Вы можете позвонить:

SSLMail.SendMail(New system.Net.Mail.MailMessage("from@from.com","to@to.com", "Subject", "Body"})

Я надеюсь, что это поможет всем, кто сталкивается с этим сообщением! (Я использовал VB.NET но я думаю, что тривиально конвертировать его на любой язык .NET.)


Dim SMTPClientObj As New Net.Mail.SmtpClient
SMTPClientObj.UseDefaultCredentials = False
SMTPClientObj.Credentials = New System.Net.NetworkCredential("myusername@gmail.com", "mypwd")
SMTPClientObj.Host = "smtp.gmail.com"
SMTPClientObj.Port = 587
SMTPClientObj.EnableSsl = True
SMTPClientObj.Send("myusername@gmail.com","yourusername@gmail.com","test","testbody")

Если вы получаете ошибку "SMTP-сервер требует защищенного соединения или клиент не прошел проверку подлинности. Ответ сервера: 5.5.1 требуется аутентификация. Узнайте больше на" как я получаю до этого, убедитесь, что строка SMTPClientObj.UseDefaultCredentials = False включено, и эта строка должна перед SMTPClientObj.Credentials.

Я попытался переключить эти 2 строки в противоположную сторону и 5.5.1 требуется проверка подлинности ошибка вернулся.


О...это удивительно... Сначала я не мог отправить письмо по каким-либо причинам. Но после того, как я изменил последовательность этих двух строк, как показано ниже, она работает отлично.

//(1)
client.UseDefaultCredentials = true;
//(2)
client.Credentials = new System.Net.NetworkCredential("username@gmail.com", "password");

надеюсь, что это поможет!!! :)


проблема не в технической возможности отправки через gmail. Это работает в большинстве ситуаций. Если вы не можете получить машину для отправки, это обычно связано с тем, что машина не была аутентифицирована с человеком в элементах управления хотя бы один раз.

проблема, с которой сталкиваются большинство пользователей, заключается в том, что Google решает постоянно изменять исходящие ограничения. Вы всегда должны добавлять защитный код в свое решение. Если вы начинаете видеть ошибки, сойдите с скорости отправки и просто остановитесь посылаю на время. Если вы продолжаете пытаться отправить Google иногда добавляет дополнительное время к периоду задержки, прежде чем вы можете отправить снова.

то, что я сделал в моей текущей системе, - это отправить с задержкой 1,5 секунды между каждым сообщением. Затем, если я получу какие-либо ошибки, остановитесь на 5 минут, а затем начните снова. Это обычно работает и позволит вам отправлять до пределов учетной записи (последний раз я проверял, что это было 2,000 для входа клиентов premier в день).


У меня была такая же проблема, но оказалось, что это моя защита от вирусов блокирует исходящие "спамом". Отключение этого позволило мне использовать порт 587 для отправки SMTP-почты через GMail


простые шаги, чтобы исправить это:

1) Войдите в свой Gmail

2)Перейдите на эту страницу https://www.google.com/settings/security/lesssecureapps Установите "включить"


Я не уверен, какая версия .NET требуется для этого, потому что eglasius упомянул, что нет соответствия enableSsl настройка (я использую .NET 4.0, но я подозреваю, что он работает в .NET 2.0 или более поздней версии), но эта конфигурация justed работала для меня (и не требует использования какой-либо программной конфигурации):

<system.net>
  <mailSettings>
    <smtp from="myusername@gmail.com" deliveryMethod="Network">
      <network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" port="587" password="password" userName="myusername@gmail.com"/>
    </smtp>
  </mailSettings>
</system.net>

возможно, вам придется сначала включить POP или IMAP в своей учетной записи Gmail: https://mail.google.com/mail/?shva=1#settings/fwdandpop

I рекомендуется сначала попробовать его с обычным почтовым клиентом...


Если здесь больше ничего не работает, вам может потребоваться разрешить доступ к вашей учетной записи gmail из сторонних приложений. Это была моя проблема. Чтобы разрешить доступ, выполните следующие действия:

  1. войдите в свою учетную запись gmail.
  2. посетите эту страницу https://accounts.google.com/DisplayUnlockCaptcha и нажмите на кнопку, чтобы разрешить доступ.
  3. посетите эту страницу https://www.google.com/settings/security/lesssecureapps и включить доступ для менее безопасных приложений.

этот работал для меня, надеюсь, что это работает для кого-то другого!


@Andres Pompiglio: Да, правильно, вы должны изменить свой пароль хотя бы один раз.. этот код работает просто отлично:

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

и вы можете сделать вызов с помощью функции:

Response.Write(SendMail(recipient Address, "UserName@gmail.com", "ccList if any", "subject", "body"))

Я также обнаружил, что учетная запись, которую я использовал для входа в систему, была деактивирована google по какой-то причине. Как только я сбросил свой пароль (так же, как раньше), я смог отправить электронные письма просто отлично. Я также получал сообщение 5.5.1.


Я также пытался многие решения, но внести некоторые изменения он будет работать

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

С smtpclient выше параметры работают в gmail


Я использовал корпоративное VPN-соединение. Именно по этой причине я не мог отправить электронное письмо из своего приложения. Он работает, если я отключаюсь от VPN.


Я столкнулся с этой же ошибкой ( "SMTP-сервер требует защищенного соединения или клиент не прошел проверку подлинности. Ответ сервера: 5.5.1 требуется аутентификация. Узнайте больше на" ) и узнал, что я использовал неправильный пароль. Я исправил учетные данные для входа, и он отправлен правильно.

Я знаю, что это поздно, но, возможно, это поможет кому-то еще.


еще одна вещь, которую я нашел, это то, что вы должны изменить свой пароль хотя бы один раз. И попробуйте использовать пароль безопасного уровня (не используйте того же пользователя, что и пароль, 123456 и т. д.)


Я получал ту же ошибку, и ни одно из вышеперечисленных решений не помогло.

моя проблема заключалась в том, что я запускал код с удаленного сервера, который никогда не использовался для входа в учетную запись gmail.

Я открыл браузер на удаленном сервере и вошел в gmail оттуда. Он задал вопрос безопасности, чтобы убедиться, что это я, так как это было новое место. После проверки безопасности я смог аутентифицироваться с помощью кода.


еще одно возможное решение для вас. У меня были аналогичные проблемы с подключением к gmail через IMAP. Попробовав все решения, с которыми я столкнулся, что вы будете читать здесь и в другом месте на SO (например. включите IMAP, включите менее безопасный доступ к вашей почте, используя https://accounts.google.com/b/0/displayunlockcaptcha и так далее), я фактически создал новую учетную запись gmail еще раз.

в моем исходном тесте, первая учетная запись gmail, которую я создал, я подключился к моей основной учетной записи gmail. Это привело к неустойчивому поведению, когда Google ссылался на неправильную учетную запись. Например, запуск https://accounts.google.com/b/0/displayunlockcaptcha открыл мой основной счет, а не тот, который я создал для этой цели.

поэтому, когда я создал новую учетную запись и не подключил ее к моей основной учетной записи, после выполнения всех соответствующих шагов, как указано выше, я обнаружил, что она работает нормально!

Я еще не подтвердили это (т. е. воспроизводится), но, по-видимому, он сделал это для меня...надеюсь, это поможет.


включите менее безопасные приложения для своей учетной записи:https://www.google.com/settings/security/lesssecureapps


  1. сначала проверьте настройки учетной записи gmail и включите " доступ для менее безопасных приложений" enter image description here

мы настоятельно рекомендуем вам использовать безопасное приложение, например Gmail, для доступа к вашей учетной записи. Все приложения от Google соответствуют этим стандартам безопасности. С другой стороны, использование менее безопасного приложения может сделать вашу учетную запись уязвимой. Учить больше.

  1. Set

    smtp.UseDefaultCredentials = false;
    

    перед

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

вы также можете подключиться через порт 465, но из-за некоторых ограничений системы.Сеть.Пространство имен Mail может потребоваться изменить код. Это связано с тем, что пространство имен не дает возможности создавать неявные SSL-соединения. Это обсуждается на http://blogs.msdn.com/b/webdav_101/archive/2008/06/02/system-net-mail-with-ssl-to-authenticate-against-port-465.aspx, и я привел пример того, как использовать CDO (Collaborative Data Object) в другом обсуждении (GMail SMTP через C# .Net ошибки на всех портах).


Я решил эту проблему. Это сообщение используется в нескольких типах ошибок. Моя проблема заключалась в том, что я достиг своего максимума 500 отправленных писем.

войдите в учетную запись и вручную попробуйте отправить письмо. Если предел был достигнут, он сообщит вам


для этой ошибки существует одна или несколько причин.

  • войдите в систему с помощью Gmail (или любого другого if ) в локальной системе.

  • также проверьте менее безопасное приложение и установите его в положение "включить" вот ссылка для GMAIL. https://www.google.com/settings/security/lesssecureapps

  • проверьте наличие EnableSsl в коде электронной почты, а также установите его в true.

    smtp.EnableSsl = true;
    
  • также проверить какой порт вы используете в настоящее время. 25 является глобальным, но вы можете проверить его для других, таких как 587. проверьте здесь. все SMTP-сообщения происходят через 25?

  • ЕСЛИ ВЫ НАХОДИТЕСЬ НА ПУЛЬТЕ : Проверь ответы Влад Тамас выше.


  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;

измените пароль gmail и повторите попытку, после этого он должен работать.

Не знаю, почему, но каждый раз, когда вы изменить свой хостинг, вы должны изменить свой пароль.