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
среща същата грешка, UseDefaultCredentials трябва да се зададе първо, преди да се използва свойството Credentials. малко контраинтуитивно, свойствата не трябва да зависят от реда - 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 по същество нулира Credentials до null. Ето защо си имал проблеми. Но това също означава, че 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 ЗАЩО MICROSOFT ЩЕ НАПРАВИ ТОВА?! Не мога да повярвам, че наистина проработи... - person Joshua Pech; 17.03.2015
comment
Не мога да повярвам колко часове загубих за това, благодаря за отговора! - person Omar Mneimneh; 01.04.2020

Stackoverflow каза преди

Във вашия случай това означава, че трябва да го изпратите с имейл адреса, с който сте влезли в Google.

Stackoverflow също казва

Така че може би има защитна стена, която пречи на връзката. Срещам този проблем точно сега, докато тествам вашия код. Опитайте предложения TELNET тест.

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.

Добавете истински мрежови идентификационни данни - потребителско име и парола

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