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

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

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

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

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

Для SMTP-сервера требуется безопасное соединение, или клиент не прошел аутентификацию.

Ответ сервера:

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

UPDATE:

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

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

Ответ 1

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("[email protected]", "mypwd"),
                EnableSsl = true
            };
            client.Send("[email protected]", "[email protected]", "test", "testbody");
            Console.WriteLine("Sent");
            Console.ReadLine();
        }
    }
}

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

Ответ 2

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

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

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

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

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

Ответ 3

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

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

Ответ 5

У меня возникли проблемы с отправкой писем с моей учетной записи 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="[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

И теперь, когда вы хотите отправлять электронные письма, вам нужно только позвонить 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("[email protected]")
    SSLMail.SendMail(e)
End Sub

End Class

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

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

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

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

Ответ 10

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

Ответ 11

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

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

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

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

Ответ 12

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

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

Ответ 13

@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, "[email protected]", "ccList if any", "subject", "body"))

Ответ 14

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

Ответ 15

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

Ответ 16

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

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

с smtpclient над параметрами работают в gmail

Ответ 17

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

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

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

Ответ 19

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

Ответ 20

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

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

Ответ 21

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

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

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

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

Ответ 22

  • Сначала проверьте настройки учетной записи gmail и включите "Доступ для менее безопасных приложений". введите описание изображения здесь

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

  1. Установите

    smtp.UseDefaultCredentials = false;
    

    до

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

Ответ 23

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

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

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

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

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

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

Ответ 24

Вы также можете подключиться через порт 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 через ошибки С#.Net во всех портах).

Ответ 25

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

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

Ответ 26

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;

Ответ 27

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

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

Ответ 28

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