使用.net中的SmtpClient发送邮件

Man*_*pta 21 .net c# asp.net smtpclient

我无法使用smtp客户端发送邮件.这是代码:

SmtpClient client=new SmtpClient("Host");
client.Credentials=new NetworkCredential("username", "password");
MailMessage mailMessage = new MailMessage();
mailMessage.from="sender@gmail.com";
mailMessage.To.Add("recipient@gmail.com");
mailMessage.body="body";
mailMessage.subject="subject";
client.Send(mailMessage);
Run Code Online (Sandbox Code Playgroud)

问题是,当我在ASP.NET应用程序中使用此代码时,我不会收到任何邮件.在asp.net中,我将从邮件地址更改为NetworkCredential中给出的用户名,我收到邮件.

但是在C#windows应用程序中,即使发件人的电子邮件地址无效,我也可以收到电子邮件.

use*_*983 17

我发现在设置'UseDefaultCredentials = false'之前设置SmtpClient Credentials属性UseDefaultCredentials = false会导致忽略凭据.

失败:

SmtpClient smtp = new SmtpClient;
smtp.Credentials = new NetworkCredential("user","pass");
smtp.UseDefaultCredentials = false;
Run Code Online (Sandbox Code Playgroud)

作品:

SmtpClient smtp = new SmtpClient;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential("user","pass");
Run Code Online (Sandbox Code Playgroud)

去搞清楚.

  • 我没有意识到的是,设置Host和Port的行为就像在web.config smtp / network条目中的LOOKUP一样。一旦找到匹配项,它将拉出用户名和密码并使用它们。希望这对其他人有帮助。 (2认同)

Ogn*_*rov 7

简短的回答是:不要使用 .net 的内部 SMTP 客户端类 - 使用 MailKit

长答案:

  1. 它在 MS 文档中被标记为已过时

[System.Obsolete("SmtpClient 及其网络类型设计不佳,我们强烈建议您使用https://github.com/jstedfast/MailKithttps://github.com/jstedfast/MimeKit代替")] 公共类SmtpClient:IDisposable

  1. 使用 oss lib MailKit
  2. 阐述:因为你迟早会面对它的缺陷。在这里阅读或在互联网上阅读。
  3. 以下是发送纯消息和多部分消息的示例。

我故意没有复制粘贴此处文档中的示例,因为文档可能会随着时间的推移而发生变化,最好阅读 .


thi*_*eek 1

这意味着您的邮件服务器不允许邮件中继。您的邮件服务器仅允许您从经过身份验证的电子邮件 ID 作为用户名发送邮件。一般来说,这样做是为了防止邮件以经过验证的身份之外的其他身份发送。