Класс c # SmtpClient не может отправлять электронную почту с помощью Gmail

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

Те же настройки отлично работают в Thunderbird.

Вот код. Я также пробовал порт 465, но безуспешно.

SmtpClient ss = new SmtpClient("smtp.gmail.com", 587);
ss.Credentials = new NetworkCredential("username", "pass");
ss.EnableSsl = true;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;

MailMessage mm = new MailMessage("[email protected]", "[email protected]", "subject here", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.Send(mm);

Вот ошибка

«SMTP-серверу требуется безопасное соединение, или клиент не прошел аутентификацию. Ответ сервера был: 5.5.1 Требуется аутентификация. Подробнее см."

Вот трассировка стека

   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from)
   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at email_example.Program.Main(String[] args) in C:\Users\Vince\Documents\Visual Studio 2008\Projects\email example\email example\Program.cs:line 23
   at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

person Razor    schedule 21.08.2009    source источник


Ответы (7)


Вы не поверите, что решило мою проблему.

Свойство Credentials

ss.Credentials = new NetworkCredential("username", "pass");

должен быть объявлен после

ss.UseDefaultCredentials = false;

Итак, окончательный листинг рабочего кода

SmtpClient ss = new SmtpClient("smtp.gmail.com", 587);
ss.EnableSsl = true;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;
ss.Credentials = new NetworkCredential("username", "pass");

MailMessage mm = new MailMessage("[email protected]", "[email protected]", "subject here", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.Send(mm);

Это ошибка?

person Razor    schedule 21.08.2009
comment
Я бы сказал нет, потому что, когда я перешел на UseDefaultCredentials = true, я бы хотел, чтобы все существующие учетные данные были перезаписаны. - person kenny; 21.08.2009
comment
Да, но здесь мы сталкиваемся с обратным. Перезаписать учетные данные, если для DefaultCredentials установлено значение false. Звучит неправильно. - person Bdiem; 21.08.2009
comment
Кенни, кажется немного противоречащим интуиции, что вам нужно объявлять свойства в правильном порядке. - person Razor; 22.08.2009
comment
Вы все равно можете получить эту ошибку при превышении лимитов отправки или если на рассматриваемой машине никогда не было реального пользователя, входящего в систему через браузер. Это сбивает с толку, что Google возвращает эту ошибку, но они это делают. - person Jason Short; 26.08.2009
comment
возникла такая же ошибка, перед использованием свойства Credentials необходимо установить UseDefaultCredentials. немного противоречиво, свойства не должны зависеть от порядка - person Michael Buen; 29.03.2010
comment
@VincePanuccio Я все еще не могу отправить электронное письмо даже после того, как сделал все, что вы опубликовали выше, я получаю это Server does not support secure connections., а когда я отключаю безопасное соединение, я получаю это The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.0 Must issue a STARTTLS command first. n58sm2181990een.10. не могли бы вы помочь мне советами - person Smith; 07.02.2012
comment
Какую версию .NET вы используете? Насколько я понимаю, в класс Smtp в .NET 4 были внесены некоторые изменения. Попробуйте выполнить приведенный выше код под .NET 2 CLI и посмотрите, как вы это сделаете. - person Razor; 08.02.2012
comment
@VincePanuccio Я изучил, что происходит, с помощью отражателя. Установка ss.UseDefaultCredentials = false по существу сбрасывает учетные данные до нуля. Вот почему у вас были проблемы. Но это также означает, что ss.UseDefaultCredentials = false вообще не нужен, в конечном итоге он ничего не делает. - person galets; 22.03.2012
comment
У меня не работало на 465 порте. Я просто перешел на 587, и все заработало. SmtpClient smtpClient = новый SmtpClient (smpt.gmail.com, Convert.ToInt32 (587)); - person Gaurang Jadia; 07.05.2012
comment
Почему вы используете Convert.ToInt32 для int? - person Casey; 12.02.2014
comment
R # @ U # * FH # $ * Ih ПОЧЕМУ МАЙКРОСОФТ ДЕЛАЛ ЭТО ?! Не могу поверить, что это действительно сработало ... - person Joshua Pech; 17.03.2015
comment
Не могу поверить, сколько часов я потратил на это, спасибо за ответ! - person Omar Mneimneh; 01.04.2020

Stackoverflow, упомянутый ранее

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

Stackoverflow также говорит

Так что, возможно, есть брандмауэр, который мешает соединению. Я столкнулся с этой проблемой прямо сейчас при тестировании вашего кода. Попробуйте предлагаемый TELNET-Test.

person Bdiem    schedule 21.08.2009

У меня работает только с 25 портом.

person karabara    schedule 23.09.2011

Это работает, но не очень благоприятно для производительности. Проверьте client.SendAsync: http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx

Пример использования:

 var message = new MailMessage("from", "to", "subject", "body");
 var client = new SmtpClient("smtp.gmail.com", 587)
            {
                Credentials = new NetworkCredential("login", "password"),
                EnableSsl = true
            };
            client.SendCompleted += (s, e) =>
            {
                client.Dispose();
                message.Dispose();
            };
            client.SendAsync(message, null);
person Mark Olschesky    schedule 21.11.2012

Эта работа на высоте. Создайте шаблон письма в отдельном файле MailTemplate.html.

Добавьте подлинные NetworkCredentials - логин и пароль

private void SendMail()
    {
    string filename = Server.MapPath("~/MailTemplate.html");
    string username = UserName.Text.ToString();

    string mailbody = System.IO.File.ReadAllText(filename);
    mailbody = mailbody.Replace("##NAME##", username);
    string to = Email.Text;
    string from = "[email protected]";

    MailMessage message = new MailMessage(from, to);
    message.Subject = "Auto Response Email";
    message.Body = mailbody;
    message.BodyEncoding = Encoding.UTF8;
    message.IsBodyHtml = true;
    SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
    System.Net.NetworkCredential basicCredential = new System.Net.NetworkCredential("[email protected]", "test123#");
    client.EnableSsl = true;
    client.UseDefaultCredentials = true;
    client.Credentials = basicCredential;
    try
    {
        client.Send(message);
        SuccessMessage.Text = "Email Sending successfully";

    }
    catch (Exception ex)
    {

        ErrorMessage.Text = ex.Message.ToString();
    }
}

MailTemplate.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Title</title>
</head>
<body>
    <div style="border: thin solid #0066FF; width: 550px; margin: 25px auto; padding: 15px; font-family: 'Microsoft Himalaya'; font-size: x-large; font-style: normal; color: #0066FF; background-color: #EfEFF2;">
        <br />
        <p style="vertical-align: middle">Dear ##NAME##,</p>
    </div>
</body>
</html>
person Shibu Thomas    schedule 14.01.2016

Я могу проверить, что установка UseDefaultCredentials на false ДОЛЖНА быть выполнена до создания NetworkCredentials. У меня такая же проблема.

person Johann Blake    schedule 22.03.2010

В моем случае все работает нормально:

private void btnTestConnection_Click(object sender, EventArgs e)
     {
    btnTestConnection.Enabled = false;
    SmtpClient ss = new SmtpClient(txtSmtpHostName.Text.Trim(), Convert.ToInt32(numSmtpHostPort.Value));
    ss.EnableSsl = chkSmtpSecureType.Checked;
    ss.Timeout = 10000;
    ss.DeliveryMethod = SmtpDeliveryMethod.Network;
    ss.UseDefaultCredentials = false;
    ss.Credentials = new NetworkCredential(txtSmtpAccount.Text.Trim(), txtSmtpPassword.Text);

    MailMessage mm = new MailMessage(txtSmtpFromEmail.Text.Trim(), "[email protected]", "subject", "my body");
    mm.BodyEncoding = UTF8Encoding.UTF8;
    mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
    ss.SendCompleted += (s, b) =>
    {
        ss.Dispose();
        mm.Dispose();
    };
    try
    {
        ss.Send(mm);
        ss.Dispose();
        mm.Dispose();
        MessageBox.Show("Connection successfully");
    }
    catch (Exception ep)
    {
        MessageBox.Show("Connection error: " + ep.Message, "Smtp Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    btnTestConnection.Enabled = true;
}
person Ahosan Karim Asik    schedule 29.07.2015