Sending mail using SmtpClient in .net
I figured out that setting the SmtpClient Credentials property before setting the ' UseDefaultCredentials = false ' UseDefaultCredentials = false
causes the credentials to be ignored.
Fails:
SmtpClient smtp = new SmtpClient;smtp.Credentials = new NetworkCredential("user","pass");smtp.UseDefaultCredentials = false;
Works:
SmtpClient smtp = new SmtpClient;smtp.UseDefaultCredentials = false;smtp.Credentials = new NetworkCredential("user","pass");
Go figure.
** UPDATE **
The reason the order is important here is that the setter on the UseDefaultCredentials
property actually sets the Credentials
to null
via the decompiled code:
/// <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; }}
The short answer : Do not use .net the internal SMTP client class - use MailKit.
The long answer :
- It is marked as obsolete in MS docs
[System.Obsolete("SmtpClient and its network of types are poorly designed, we strongly recommend you use https://github.com/jstedfast/MailKit and https://github.com/jstedfast/MimeKit instead")] public class SmtpClient : IDisposable
- Use the oss lib MailKit.
- Elaboration : Because you will face its deficiencies sooner rather than later. Read here or read around the internet.
- Here is an example for sending plain messages and multipart messages.
I intentionally did not copy-paste the examples from the docs here because the documentation may change over time and it is better to read .
It means your mail server does not allow Mail-Relay. Your mail server only allows you to send mail from authenticated email-id as username. Generally this is done to prevent mails being sent as different identities other than the authenticated one.