web-dev-qa-db-ja.com

.netでSmtpClientを使用してメールを送信する

Smtpクライアントを使用してメールを送信できません。コードは次のとおりです。

SmtpClient client=new SmtpClient("Host");
client.Credentials=new NetworkCredential("username", "password");
MailMessage mailMessage = new MailMessage();
mailMessage.from="[email protected]";
mailMessage.To.Add("[email protected]");
mailMessage.body="body";
mailMessage.subject="subject";
client.Send(mailMessage);

問題は、ASP.NETアプリケーションでこのコードを使用すると、メールが届かないことです。 asp.netで、メールアドレスをNetworkCredentialで指定されたユーザー名に変更すると、メールが届きます。

しかし、C#Windowsアプリケーションでは、送信者の電子メールアドレスが有効でない場合でも、電子メールを取得できます。

21
Manish Gupta

'UseDefaultCredentials = false' UseDefaultCredentials = falseを設定する前にSmtpClient Credentialsプロパティを設定すると、資格情報が無視されることがわかりました。

失敗:

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

メールサーバーがメールリレーを許可していないことを意味します。メールサーバーでは、認証されたemail-idからのメールをユーザー名としてのみ送信できます。通常、これは、認証されたものとは異なるIDとしてメールが送信されるのを防ぐために行われます。

これを試して :

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;
0
colonel

短い答え:。netを使用しないでください内部SMTPクライアントクラス-使用 MailKit

長い答え:

  1. MSドキュメントでは廃止 とマークされています

[System.Obsolete( "SmtpClientとそのタイプのネットワークの設計が不十分です。 https://github.com/jstedfast/MailKit および https:// github。 com/jstedfast/MimeKit 代わりに ")] public class SmtpClient:IDisposable

  1. Oss lib MailKit を使用します。
  2. 精緻化:後でよりも早く、その欠陥に直面するからです。 こちらをお読みください またはインターネットを読んでください。
  3. 送信 プレーンメッセージおよび マルチパート メッセージの例を次に示します。

ドキュメントは時間の経過とともに変更される可能性があり、を読む方がよいため、ここのドキュメントからサンプルを意図的にコピーアンドペーストしませんでした。

0
Ognyan Dimitrov