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

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

ОБНОВЛЕНИЕ: я попробовал все ответы (принятые и другие) в другом вопросе, но ни один из них не работает.

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

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

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

Ответ сервера был:

5.5.1 Требуется аутентификация. Узнайте больше на "<- серьезно, это заканчивается там.

ОБНОВИТЬ:

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

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

31 ответ

Решение

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 в конфигурационном файле:().

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

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

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

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

Затем, для эксперимента, я попытался изменить свой пароль обратно на свой предыдущий пароль, чтобы посмотреть, что произойдет, и Gmail на самом деле не позволил мне это сделать, сославшись на причину: "извините, мы не можем позволить вам сохранить это изменение как выбранное вами". пароль слишком слаб "и не позволил бы мне вернуться к моему старому паролю. Из этого я понял, что это ошибка, потому что либо а) вам нужно менять пароль один раз каждые x месяцев, либо б). как я уже говорил, их алгоритмы надежности паролей изменились, и поэтому слабый пароль, который я имел, не был принят, хотя они ничего не говорили об этом, когда пытались войти НИКОГДА! Это (номер 2) наиболее вероятный сценарий, так как моему слабому паролю было около 4 месяцев, и это позволило мне использовать его в Gmail.

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

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

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

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

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

  • Прежде всего настройте учетную запись GMail:
    • Включите IMAP и подтвердите правильное максимальное количество сообщений (вы можете сделать это здесь)
    • Убедитесь, что ваш пароль не менее 7 символов и является надежным (согласно Google)
    • Убедитесь, что вам не нужно вводить код с картинки. Вы можете сделать это, отправив тестовое электронное письмо из браузера.
  • Внесите изменения в 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:

например, на странице с элементом управления P asswordRecovery:

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

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

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

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

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,

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

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

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

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

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

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

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

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

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

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

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

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

<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

Я рекомендую сначала попробовать это с обычным почтовым клиентом...

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

@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"))

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

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

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

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

  1. Сначала проверьте настройки учетной записи Gmail и включите "Доступ к менее защищенным приложениям".

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

  1. Задавать

    smtp.UseDefaultCredentials = false;
    

    до

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

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

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

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

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

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

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

Если у вас есть 2-ступенчатая проверка в учетной записи Gmail, вам нужно будет сгенерировать пароль для приложения. https://support.google.com/accounts/answer/185833?p=app_passwords_sa&hl=en&visit_id=636903322072234863-1319515789&rd=1 Выберите Как создать пароль приложения и следуйте приведенным инструкциям. Скопируйте и вставьте сгенерированный пароль приложения куда-нибудь, поскольку вы не сможете восстановить его после нажатия кнопки Готово.

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

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

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

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

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

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

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

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

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

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

Google больше не разрешает «менее безопасные приложения», так что это невозможно для обычных пользователей Gmail.

Изменения Google после мая 2022 года.

Для этих изменений мы должны внести следующие изменения в наш код.

  1. Сначала перейдите к безопасности учетной записи Gmail.

  2. Включите двухфакторную аутентификацию.

  3. Настройте пароль приложения в учетной записи Google.

  4. Используйте пароль приложения в приложении.

                 MailMessage mail = new MailMessage();
         mail.To.Add(email.Text.ToString().Trim());
         mail.From = new MailAddress("your_Gmail_address");
         mail.Subject = "Hello test email";
         mail.Body = "<p>hello user<br/> How are you?</p>";
         mail.IsBodyHtml = true;
    
         SmtpClient smtp = new SmtpClient();
         smtp.Port = 587; // 25 465
         smtp.EnableSsl = true;
         smtp.UseDefaultCredentials = false;
         smtp.Host = "smtp.gmail.com";
         smtp.Credentials = new System.Net.NetworkCredential("your_Gmail_address", "Your_gmail_app_password");
         smtp.Send(mail);
    

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

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

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

Вы также можете подключиться через порт 465, но из-за некоторых ограничений пространства имен System.Net.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 на всех портах).

  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 из незащищенных приложений и удаление аутентификации за 2 шага:

Host = "smtp.gmail.com",
Port = 587,
EnableSsl = true,
DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(MailAddress, Password)

Измените свой пароль Gmail и попробуйте еще раз, после этого он должен работать.

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

Другие вопросы по тегам