5.7.57 SMTP - 客户端在 MAIL FROM 期间未经身份验证,无法发送匿名邮件错误。

89

我需要使用我的web应用程序发送邮件。给定以下代码显示:The SMTP server requires a secure connection or the client was not authenticated. The server response was:

5.7.57 SMTP; 在MAIL FROM期间,客户端未经身份验证即无法发送匿名邮件。

帮我找到一个合适的解决方案。谢谢。

代码:

protected void btnsubmit_Click(object sender, EventArgs e)
 {

   Ticket_MailTableAdapters.tbl_TicketTableAdapter tc;
   tc = new Ticket_MailTableAdapters.tbl_TicketTableAdapter();
   DataTable dt = new DataTable();
   dt = tc.GetEmail(dpl_cate.SelectedValue);
   foreach (DataRow row in dt.Rows)
    {
    string eml = (row["Emp_Email"].ToString());
    var fromAddress = "emailAddress";
    var toAddress = eml;
    const string fromPassword = "*****";
    string body = "Welcome..";
 // smtp settings
    var smtp = new System.Net.Mail.SmtpClient();
       {
         smtp.Host = "smtp.office365.com";
         smtp.Port = 587;
         smtp.EnableSsl = true;

         smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
         smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
         smtp.UseDefaultCredentials = false;
         smtp.Timeout = 600000;
       }
  // Passing values to smtp object
     smtp.Send(fromAddress, toAddress, subject, body);
     }
  } 
 }

2
为什么不增加超时时间? - Mahesh Kava
1
你是匿名的还是真的想用那个登录信息发送到office.com? - fk2
1
@reshma,你做了哪些更改?我也遇到了同样的问题。 - Rishi Jagati
1
我已经成功使用所示的SMTP配置发送电子邮件,但是我按照Kiquenet的写法将smtp.UseDefaultCredentials = false;移动到smtp.Credentials = ...之前。 - Raphael
21个回答

45

@Reshma- 如果你还没有弄清楚,下面是我尝试过并解决了同样问题的方法:

  1. 确保你设置的NetworkCredentials是正确的。例如,在我的情况下,由于是办公室SMTP,除了域名之外,必须在NetworkCredential中使用用户名而不是实际的电子邮件地址。

  2. 首先将"UseDefaultCredentials"设置为false,然后再设置凭据。如果你在此之后设置了"UseDefaultCredentials",它会将NetworkCredential重置为null。

希望这有所帮助。


13
明白了!我不知道“UseDefaultCredentials”会清除凭据。谢谢! - nwestfall
1
在我的情况下,先后顺序并不重要。只要“UseDefaultCredentials”为false。它就能正常工作。我想知道为什么。 - Weihui Guo
1
在我的情况下,有些情况下(但并非大多数情况),某人意外地打开了多重身份验证。您可以使用电子邮件帐户访问此页面,以查看这些情况下是否启用了多重身份验证(也会在尝试发送电子邮件时触发):https://mysignins.microsoft.com/security-info - hamboy

38
你似乎将From地址传递为emailAddress,这不是正确的电子邮件地址。对于Office365,From需要是Office365系统上真实存在的地址。 如果你将你的电子邮件地址硬编码作为From并输入你的Office 365密码,可以验证它是否有效。 当然不要把它留在那里。

20

我在这上面花费了太多时间,然而解决方案却非常简单。我只需要使用我的“MX”作为主机并使用端口25。

        var sClient = new SmtpClient("domain-com.mail.protection.outlook.com");
        var message = new MailMessage();

        sClient.Port = 25;
        sClient.EnableSsl = true;
        sClient.Credentials = new NetworkCredential("user", "password");
        sClient.UseDefaultCredentials = false;

        message.Body = "Test";
        message.From = new MailAddress("test@test.com");
        message.Subject = "Test";
        message.CC.Add(new MailAddress("dude@good.com"));

        sClient.Send(message);

4
对我来说,sClient.EnableSsl = true; 没有被定义。 - Muhammad Ali
8
您需要首先将 "UseDefaultCredentials" 设置为 false,然后再设置凭据(Credentials)。如果您在此之后设置了 "UseDefaultCredentials",则会将 NetworkCredential 重置为 null。 - Kiquenet
4
你如何获取 MX 值? - Kiquenet
2
使用MX记录作为主机可以使您仅向内部电子邮件地址发送电子邮件(即仅发送到与发送地址相同的域)。 - Lez
显示剩余3条评论

18

我曾经也有同样的问题。

添加域名解决了它。

mySmtpClient.Credentials = New System.Net.NetworkCredential("email@domain.com", "password", "domain.com")

3
这对我来说是正确的解决方案。我有一个应用程序运行了一年多,每天发送电子邮件,突然它停止工作了。修复它的更改是这个,即使我的网络凭据实际上不是我的电子邮件,这个修复方法也起作用了。 - EJA
5
不是添加域名,而是将电子邮件地址作为用户名使用解决了我的问题。 NetworkCredential(email, password); - Weihui Guo

15
在我的情况下,我遵循了以下三个步骤,它有效果。
如果您遇到以下任一错误: 535 5.7.3 验证失败 5.7.57 客户端未经授权发送邮件 您应该检查以下几个方面:
1. 在许可的邮箱上启用客户端SMTP提交: 从Microsoft 365管理员中心进入活动用户并选择用户。 转到邮件选项卡。 在电子邮件应用程序部分,选择管理电子邮件应用程序。 验证已选中(已启用)身份验证SMTP设置。 选择保存更改。
2. 禁用所使用的受许可邮箱上的多因素身份验证(MFA): 在Microsoft 365管理员中心中,选择左侧导航菜单中的“用户”>活动用户。 在活动用户页面上,选择多因素身份验证。 在多重身份验证页面上,选择用户并禁用多因素身份验证状态。
3. 通过将启用安全默认值切换为“否”来禁用Azure安全默认值: 作为安全管理员、条件访问管理员或全局管理员登录Azure门户。 浏览到Azure Active Directory>属性。 选择“管理安全默认值”。 将启用安全默认值切换为“否”。 选择保存。

微软参考链接


1
第一步对我有用。我取消了已认证的SMTP。当勾选并保存后,我的CSharp程序通过电子邮件开始工作。 - Chirag

13

在我的情况下,Office 365中的“FROM”账户已开启了两步验证功能。一旦该功能关闭,邮件就能成功发送。


1
两步验证怎么样? - Kiquenet

12

上面评论中只提到了两个主要原因:

  1. 您设置的NetworkCredentials应该是正确的。请尝试实际登录该帐户进行验证。
  2. 您需要先将UseDefaultCredentials设置为false,然后再设置凭据 或 将smtp.UseDefaultCredentials = false;放在smtp.Credentials指定之前。

7

这是一个老问题,但由于这个错误在谷歌上的排名第一,我想更新一下我的处理进展。

我花了很长时间来解决这个问题。最终,我不得不多次更改我的Office 365帐户密码,直到我的代码成功发送电子邮件为止。

没有必要更改任何代码内容。


3
我只改了一次,尝试登录时它告诉我密码已过期。 - Kevin .NET

5

如果您使用的是Office 365,请按照以下步骤操作:

  1. 使用Azure PowerShell检查密码过期时间:Get-MsolUser -All | select DisplayName, LastPasswordChangeTimeStamp
  2. 使用新密码更改密码(不能使用旧密码)。您可以最终回到旧密码,但需要将其更改两次。

希望对您有所帮助!


4

可能你尝试发送邮件的账户密码已过期。请检查你的密码策略过期日期。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接