21

我无法使用 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);

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

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

4

5 回答 5

19

我发现在设置“ UseDefaultCredentials = false ”之前设置 SmtpClient Credentials 属性UseDefaultCredentials = false会导致凭据被忽略。

失败:

SmtpClient smtp = new SmtpClient;
smtp.Credentials = new NetworkCredential("user","pass");
smtp.UseDefaultCredentials = false;

作品:

SmtpClient smtp = new SmtpClient;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential("user","pass");

去搞清楚。

** 更新 **

顺序在这里很重要的原因是属性上的设置器实际上UseDefaultCredentials通过反编译的代码将 设置为:Credentialsnull

/// <summary>Gets or sets a <see cref="T:System.Boolean" /> value that controls whether the <see cref="P:System.Net.CredentialCache.DefaultCredentials" /> are sent with requests.</summary>
/// <returns>
/// <see langword="true" /> if the default credentials are used; otherwise <see langword="false" />. The default value is <see langword="false" />.</returns>
/// <exception cref="T:System.InvalidOperationException">You cannot change the value of this property when an e-mail is being sent.</exception>
public bool UseDefaultCredentials
{
  get
  {
    return this.transport.Credentials is SystemNetworkCredential;
  }
  set
  {
    if (this.InCall)
      throw new InvalidOperationException(SR.GetString("SmtpInvalidOperationDuringSend"));
    this.transport.Credentials = value ? (ICredentialsByHost) CredentialCache.DefaultNetworkCredentials : (ICredentialsByHost) null;
  }
}
于 2014-07-28T00:29:25.753 回答
4

简短的回答:不要使用 .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. 这是发送普通消息和多部分消息的示例。

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

于 2019-02-12T14:07:07.217 回答
1

这意味着您的邮件服务器不允许邮件中继。您的邮件服务器只允许您从经过身份验证的电子邮件 ID 作为用户名发送邮件。通常这样做是为了防止邮件作为经过身份验证的身份以外的不同身份发送。

于 2010-03-18T14:50:18.397 回答
0

尝试这个 :

MailMessage mail = new MailMessage("emailfrom","emailto");

mail.From = new MailAddress("emailfrom");
mail.Subject = txtsbjct.Text;
string Body = txtmsg.Text;
mail.Body = Body;

mail.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient();
smtp.Host = "smtp.gmail.com"; //Or Your SMTP Server Address
smtp.Credentials = new System.Net.NetworkCredential("youremail", "yourpassword");

smtp.EnableSsl = true;
smtp.Send(mail);
txtemail.Text = "";
txtmsg.Text = "";
txtsbjct.Text = "";
Label1.Text = "your email has been send";
mail = null;
smtp = null;
于 2010-08-11T10:07:30.940 回答
-4
void sendEmail(string strFrom
                        , string strTo
                        , string strSubject
                        , string strBody)
   {

       MailMessage objMailMessage = new MailMessage();
       System.Net.NetworkCredential objSMTPUserInfo =
           new System.Net.NetworkCredential();
       SmtpClient objSmtpClient = new SmtpClient();

       try
       {
           objMailMessage.From = new MailAddress(strFrom);
           objMailMessage.To.Add(new MailAddress(strTo));
           objMailMessage.Subject = strSubject;
           objMailMessage.Body = strBody;

           objSmtpClient = new SmtpClient("172.0.0.1"); /// Server IP
           objSMTPUserInfo = new System.Net.NetworkCredential
           ("User name", "Password","Domain");
           objSmtpClient.Credentials = objSMTPUserInfo;
           objSmtpClient.UseDefaultCredentials = false;
           objSmtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;

           objSmtpClient.Send(objMailMessage);
       }
       catch (Exception ex)
       { throw ex; }

       finally
       {
           objMailMessage = null;
           objSMTPUserInfo = null;
           objSmtpClient = null;
       }
   }
于 2015-09-17T04:48:37.133 回答