首页 文章

SMTP服务器需要安全连接或客户端未经过身份验证 . 服务器响应是:5.5.1身份验证是否必需?

提问于
浏览
69

我想从我的应用程序发送一封电子邮件,我写了以下代码来发送邮件

MailMessage msg = new MailMessage();

    msg.From = new MailAddress("mymailid");
    msg.To.Add("receipientid");
    msg.Subject = "test";
    msg.Body = "Test Content";
    msg.Priority = MailPriority.High;

    SmtpClient client = new SmtpClient();

    client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
    client.Host = "smtp.gmail.com";
    client.Port = 587;
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.EnableSsl = true;
    client.UseDefaultCredentials = true;

    client.Send(msg);

我在localhost上运行它,所以我正在做什么错误发送它 .

当我发送按钮时,它给出了一个错误

SMTP服务器需要安全连接或客户端未经过身份验证 . 服务器响应为:5.5.1需要身份验证 .

Web.config文件中的代码

<appSettings>
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />   
    <add key="smtpServer" value="smtp.gmail.com" />
    <add key="EnableSsl" value = "true"/>
    <add key="smtpPort" value="587" />
    <add key="smtpUser" value="sender@gmail.com" />
    <add key="smtpPass" value="mypassword" />
    <add key="adminEmail" value="sender@gmail.com" />
  </appSettings>
  <system.net>
    <mailSettings>
      <smtp from="sender@gmail.com">
        <network host="smtp.gmail.com" password="mypassword" port="587" userName="sender@gmail.com"  enableSsl="true"/>
      </smtp>
    </mailSettings>
  </system.net>

我该怎么做才能解决这个错误并发送邮件?

15 回答

  • 37

    首先检查gmail的安全相关问题 . 您可能已在gmail中启用了双重身份验证 . 如果您收到任何安全警报,请检查您的Gmail收件箱 . 在这种情况下,请检查@mjb的其他答案,如下所示

    以下是我总是首先检查这些问题的一般事项

    client.UseDefaultCredentials = true;
    

    将其设置为false .

    注意@Joe King的answer - 你必须设置client.UseDefaultCredentials before 你设置client.Credentials

  • 1

    您应该考虑在配置文件中指定SMTP配置数据,而不是在代码中覆盖它们 - 请参阅http://www.systemnetmail.com/faq/4.1.aspx上的SMTP配置数据

    <system.net>
                <mailSettings>
                    <smtp deliveryMethod="Network" from="admin@example.com">
                        <network defaultCredentials="false" host="smtp.example.com" port="25" userName="admin@example.com" password="password"/>
                    </smtp>
                </mailSettings>
            </system.net>
    
  • 2

    打开这个不太安全的应用程序link并繁荣......

  • 88

    我也有同样的问题 .

    我找到了这个解决方案:

    Google可能阻止某些不使用现代安全标准的应用或设备尝试登录 . 由于这些应用和设备更易于破解,因此阻止它们有助于确保您的帐户更安全 .

    一些不支持最新安全标准的应用程序示例包括:

    • 适用于iOS 6或更低版本的iPhone或iPad上的Mail应用程序

    • 8.1版本之前的Windows手机上的Mail应用程序

    • 某些桌面邮件客户端,如Microsoft Outlook和Mozilla Thunderbird

    因此,您必须在Google帐户中启用 Less Secure Sign-In .

    登录Google帐户后,请转到:

    https://www.google.com/settings/security/lesssecureapps

    在C#中,您可以使用以下代码:

    using (MailMessage mail = new MailMessage())
    {
        mail.From = new MailAddress("email@gmail.com");
        mail.To.Add("somebody@domain.com");
        mail.Subject = "Hello World";
        mail.Body = "<h1>Hello</h1>";
        mail.IsBodyHtml = true;
        mail.Attachments.Add(new Attachment("C:\\file.zip"));
    
        using (SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587))
        {
            smtp.Credentials = new NetworkCredential("email@gmail.com", "password");
            smtp.EnableSsl = true;
            smtp.Send(mail);
        }
    }
    

    Michael Freidgeim在以下评论区分享的信息:
    类似的答案与截图https://stackoverflow.com/a/32457468/52277

  • 16

    确保设置 SmtpClient.Credentials after ,调用 SmtpClient.UseDefaultCredentials = false .

    顺序很重要,因为设置 SmtpClient.UseDefaultCredentials = false 会将 SmtpClient.Credentials 重置为null .

  • 0

    我已经搜索并尝试了几个小时不同的事情 . 总而言之,我必须考虑以下几点:

    • 使用 smtp.gmail.com 而不是 smtp.google.com

    • 使用端口587

    • 在设置凭据之前设置 client.UseDefaultCredentials = false;

    • 打开Access for less secure apps

    • 设置 client.EnableSsl = true;

    如果这些步骤没有帮助,请检查answer .
    也许,你也可以在这个System.Net.Mail FAQ找到有用的东西 .

  • 0

    尝试登录您的Gmail帐户 . 如果您使用gmail SMTP发送电子邮件,它将被锁定 . 我不知道您可以在锁定之前发送的电子邮件的限制,但如果您登录一次,那么它将再次从代码中运行 . 确保您的webconfig设置良好 .

  • 7

    试试这种方式,我做了一些轻微的改变:

    MailMessage msg = new MailMessage();
    
    msg.From = new MailAddress("mymailid@gmail.com");
    msg.To.Add("receipientid@gmail.com");
    msg.Subject = "test";
    msg.Body = "Test Content";
    //msg.Priority = MailPriority.High;
    
    
    using (SmtpClient client = new SmtpClient())
    {
        client.EnableSsl = true;
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential("mymailid@gmail.com", "mypassword");
        client.Host = "smtp.gmail.com";
        client.Port = 587;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
    
        client.Send(msg);
    }
    

    如果您有邮件设置,请显示您的app.config文件 .

  • 1

    即使我将“UseDefaultCredentials”设置为false,我也遇到了同样的问题 . 后来我发现根本原因是我在我的帐户中打开了“两步验证” . 关闭后,问题就消失了 .

  • 1

    enter image description here
    确保允许访问安全性较低的应用 .

    MailMessage mail = new MailMessage();
            mail.From = new MailAddress("xx@gmail.com");
            mail.Sender = new MailAddress("xx@gmail.com");
            mail.To.Add("external@emailaddress");
            mail.IsBodyHtml = true;
            mail.Subject = "Email Sent";
            mail.Body = "Body content from";
    
            SmtpClient smtp = new SmtpClient("smtp.gmail.com", 587);
            smtp.UseDefaultCredentials = false;
    
            smtp.Credentials = new System.Net.NetworkCredential("xx@gmail.com", "xx");
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            smtp.EnableSsl = true;
    
            smtp.Timeout = 30000;
            try
            {
    
                smtp.Send(mail);
            }
            catch (SmtpException e)
            {
                textBox1.Text= e.Message;
            }
    
  • 0

    下面是我的代码 . 我也有同样的错误,但问题是我给了我的密码错误 . 下面的代码将完美地工作..它

    MailMessage mail = new MailMessage();
                SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");              
                mail.From = new MailAddress("fromaddress@gmail.com");
                mail.To.Add("toaddress1@gmail.com");
                mail.To.Add("toaddress2@gmail.com");
                mail.Subject = "Password Recovery ";
                mail.Body += " <html>";
                mail.Body += "<body>";
                mail.Body += "<table>";
    
                mail.Body += "<tr>";
                mail.Body += "<td>User Name : </td><td> HAi </td>";
                mail.Body += "</tr>";
    
                mail.Body += "<tr>";
                mail.Body += "<td>Password : </td><td>aaaaaaaaaa</td>";
                mail.Body += "</tr>";
    
                mail.Body += "</table>";
                mail.Body += "</body>";
                mail.Body += "</html>";
    
                mail.IsBodyHtml = true;
                SmtpServer.Port = 587;
                SmtpServer.Credentials = new System.Net.NetworkCredential("sendfrommailaddress.com", "password");
                SmtpServer.EnableSsl = true;
    
                SmtpServer.Send(mail);
    

    你可以在Sending mail中提供它

  • 8

    如果是新的Google帐户,则必须通过常规用户界面发送电子邮件(第一个) . 之后,您可以使用应用程序/机器人发送消息 .

  • 1

    一些smtp服务器(安全服务器)要求你提供用户名和电子邮件,如果它的gmail然后大多数机会你需要解决的“安全登录”问题,否则你可以尝试:

    public static void SendEmail(string address, string subject, 
        string message, string email, string username, string password, 
        string smtp, int port)
    {
        var loginInfo = new NetworkCredential(username, password);
        var msg = new MailMessage();
        var smtpClient = new SmtpClient(smtp, port);
    
        msg.From = new MailAddress(email);
        msg.To.Add(new MailAddress(address));
        msg.Subject = subject;
        msg.Body = message;
        msg.IsBodyHtml = true;
    
        smtpClient.EnableSsl = true;
        smtpClient.UseDefaultCredentials = false;
        smtpClient.Credentials = loginInfo;
        smtpClient.Send(msg);
    }
    

    请注意,来自和用户名的电子邮件是不同的,而不像某些实现将它们称为相同 .

    调用此方法可以这样完成:

    SendEmail("to-mail@gmail.com", "test", "Hi it worked!!", 
       "from-mail", "from-username", "from-password", "smtp", 587);
    
  • 3

    在转动less secure option on并尝试其他解决方案后,如果您仍然面临同样的问题,请尝试使用此重载:

    client.Credentials = new NetworkCredential("mymailid", "mypassword");
    

    代替:

    client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
    
  • 31

    尝试启用允许不太安全的应用访问 .

    在这里,您可以在登录后启用不太安全的应用程序Gmail中 .

    https://myaccount.google.com/lesssecureapps

    谢谢 .

相关问题