C# SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器响应为:是否需要5.5.1身份验证?

C# SMTP服务器需要安全连接,或者客户端未通过身份验证。服务器响应为:是否需要5.5.1身份验证?,c#,smtp,C#,Smtp,我想从我的应用程序中发送电子邮件,我已经编写了以下发送邮件的代码 MailMessage msg = new MailMessage(); msg.From = new MailAddress("mymailid"); msg.To.Add("receipientid"); msg.Subject = "test"; msg.Body = "Test Content"; msg.Priority = MailPriority.High;

我想从我的应用程序中发送电子邮件,我已经编写了以下发送邮件的代码

    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);
我在本地主机上运行它,所以我在发送它时犯了什么错误

当我发送按钮时,它会出现如下错误

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>


我应该如何解决此错误并发送邮件???

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

下面是我经常首先检查的一般问题

client.UseDefaultCredentials = true;
将其设置为false


注意@Joe King's-在设置客户端之前,您必须先设置client.UseDefaultCredentials。Credentials

请这样尝试,我只是做了一些轻微的更改:

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文件。

尝试登录您的gmail帐户。如果您使用gmail SMTP发送电子邮件,它会被锁定。我不知道在它被锁定之前你可以发送的电子邮件的限制,但是如果你登录一次,它就可以通过代码再次工作。
确保您的webconfig设置正确。

下面是我的代码。我也有同样的错误,但问题是我的密码错误。下面的代码将非常有效。试试看

            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);
MailMessage mail=newmailmessage();
SmtpClient SmtpServer=新的SmtpClient(“smtp.gmail.com”);
mail.From=新邮件地址(“fromaddress@gmail.com");
mail.To.Add(“toaddress1@gmail.com");
mail.To.Add(“toaddress2@gmail.com");
mail.Subject=“密码恢复”;
mail.Body+=“”;
mail.Body+=“”;
mail.Body+=“”;
mail.Body+=“”;
mail.Body+=“用户名:HAi”;
mail.Body+=“”;
mail.Body+=“”;
mail.Body+=“密码:aaaaaaaa”;
mail.Body+=“”;
mail.Body+=“”;
mail.Body+=“”;
mail.Body+=“”;
mail.IsBodyHtml=true;
SmtpServer.Port=587;
SmtpServer.Credentials=新系统.Net.NetworkCredential(“sendfrommaildress.com”,“password”);
SmtpServer.EnableSsl=true;
发送(邮件);

您可以在中引用它。

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

我也有同样的问题

我找到了这个解决方案:

谷歌可能会阻止一些不使用现代安全标准的应用程序或设备的登录尝试。由于这些应用和设备更容易入侵,阻止它们有助于确保您的帐户更安全

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

  • iOS 6或更低版本的iPhone或iPad上的邮件应用程序
  • 8.1版本之前的Windows phone上的邮件应用程序
  • 一些桌面邮件客户端,如Microsoft Outlook和Mozilla Thunderbird
因此,您必须在您的google帐户中启用不太安全的登录(或不太安全的应用程序访问)

登录google帐户后,转到:



在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);
    }
}
使用(MailMessage=newmailmessage())
{
mail.From=新邮件地址(“email@gmail.com");
mail.To.Add(“somebody@domain.com");
mail.Subject=“你好,世界”;
mail.Body=“你好”;
mail.IsBodyHtml=true;
mail.Attachments.Add(新附件(“C:\\file.zip”);
使用(SmtpClient smtp=newsmtpclient(“smtp.gmail.com”,587))
{
smtp.Credentials=新的网络凭据(“email@gmail.com“,”密码“);
smtp.EnableSsl=true;
smtp.发送(邮件);
}
}

确保在调用
SmtpClient.UseDefaultCredentials=false
后设置
SmtpClient.Credentials

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

一些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);
确保允许访问不太安全的应用程序

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

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

您应该考虑在配置文件中指定SMTP配置数据,并且不要在代码中覆盖它们——参见

的SMTP配置数据。


从此打开不太安全的应用程序,然后砰的一声…

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

  • 使用
    smtp.gmail.com
    而不是
    smtp.google.com
  • 使用端口587
  • 设置
    client.UseDefaultCredentials=false设置凭据之前
  • 打开开关
  • 设置
    client.EnableSsl=true
  • 如果这些步骤没有帮助,请检查此项。
    也许,你能找到一些有用的东西
    <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>
    
    client.Credentials = new NetworkCredential("mymailid", "mypassword");
    
    client.Credentials = new NetworkCredential("mymailid", "mypassword", "smtp.gmail.com");
    
    using (SmtpClient client = new SmtpClient())
    {
        client.EnableSsl = true;
        client.UseDefaultCredentials = false;
        client.Credentials = new NetworkCredential(username, password);
        client.Host = "smtp.office365.com";
        client.Port = 587;
        client.DeliveryMethod = SmtpDeliveryMethod.Network;
    
        client.Send(msg);
    }