[英]C# SmtpClient class not able to send email using gmail
我在使用我的 gmail 帳戶發送 email 時遇到問題。 我正在拔頭發。
相同的設置在 Thunderbird 中運行良好。
這是代碼。 我也嘗試過端口 465,但沒有運氣。
SmtpClient ss = new SmtpClient("smtp.gmail.com", 587);
ss.Credentials = new NetworkCredential("username", "pass");
ss.EnableSsl = true;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;
MailMessage mm = new MailMessage("donotreply@example.com", "destination@example.com", "subject here", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.Send(mm);
這是錯誤
SMTP 服務器需要安全連接或客戶端未通過身份驗證。 服務器響應為:5.5.1 需要身份驗證。 了解更多信息
這是堆棧跟蹤
at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, String from)
at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception)
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at email_example.Program.Main(String[] args) in C:\Users\Vince\Documents\Visual Studio 2008\Projects\email example\email example\Program.cs:line 23
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
你不會相信是什么解決了我的問題。
憑據屬性
ss.Credentials = new NetworkCredential("username", "pass");
必須在之后聲明
ss.UseDefaultCredentials = false;
所以最終的工作代碼清單是
SmtpClient ss = new SmtpClient("smtp.gmail.com", 587);
ss.EnableSsl = true;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;
ss.Credentials = new NetworkCredential("username", "pass");
MailMessage mm = new MailMessage("donotreply@example.com", "destination@example.com", "subject here", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.Send(mm);
這是一個錯誤嗎?
在您的情況下,這意味着您必須使用您登錄 Google 時使用的 email 地址發送它。
所以也許有一個防火牆干擾了連接。 我現在在測試您的代碼時遇到了這個問題。 嘗試建議的 TELNET-Test。
僅使用端口 25 為我工作。
這行得通,但它對性能不是很友好。 查看client.SendAsync: http://msdn.microsoft.com/en-us/library/x5x13z6h.aspx
一個示例用例:
var message = new MailMessage("from", "to", "subject", "body");
var client = new SmtpClient("smtp.gmail.com", 587)
{
Credentials = new NetworkCredential("login", "password"),
EnableSsl = true
};
client.SendCompleted += (s, e) =>
{
client.Dispose();
message.Dispose();
};
client.SendAsync(message, null);
這部作品很完美。 在單獨的文件MailTemplate.html
中創建郵件模板。
添加正版 NetworkCredentials - 登錄名和密碼
private void SendMail()
{
string filename = Server.MapPath("~/MailTemplate.html");
string username = UserName.Text.ToString();
string mailbody = System.IO.File.ReadAllText(filename);
mailbody = mailbody.Replace("##NAME##", username);
string to = Email.Text;
string from = "test@gmail.com";
MailMessage message = new MailMessage(from, to);
message.Subject = "Auto Response Email";
message.Body = mailbody;
message.BodyEncoding = Encoding.UTF8;
message.IsBodyHtml = true;
SmtpClient client = new SmtpClient("smtp.gmail.com", 587);
System.Net.NetworkCredential basicCredential = new System.Net.NetworkCredential("test@gmail.com", "test123#");
client.EnableSsl = true;
client.UseDefaultCredentials = true;
client.Credentials = basicCredential;
try
{
client.Send(message);
SuccessMessage.Text = "Email Sending successfully";
}
catch (Exception ex)
{
ErrorMessage.Text = ex.Message.ToString();
}
}
郵件模板.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Title</title>
</head>
<body>
<div style="border: thin solid #0066FF; width: 550px; margin: 25px auto; padding: 15px; font-family: 'Microsoft Himalaya'; font-size: x-large; font-style: normal; color: #0066FF; background-color: #EfEFF2;">
<br />
<p style="vertical-align: middle">Dear ##NAME##,</p>
</div>
</body>
</html>
我可以驗證必須在創建 NetworkCredentials 之前將 UseDefaultCredentials 設置為 false。 我有同樣的問題。
在我的情況下它工作正常:
private void btnTestConnection_Click(object sender, EventArgs e)
{
btnTestConnection.Enabled = false;
SmtpClient ss = new SmtpClient(txtSmtpHostName.Text.Trim(), Convert.ToInt32(numSmtpHostPort.Value));
ss.EnableSsl = chkSmtpSecureType.Checked;
ss.Timeout = 10000;
ss.DeliveryMethod = SmtpDeliveryMethod.Network;
ss.UseDefaultCredentials = false;
ss.Credentials = new NetworkCredential(txtSmtpAccount.Text.Trim(), txtSmtpPassword.Text);
MailMessage mm = new MailMessage(txtSmtpFromEmail.Text.Trim(), "test@example.com", "subject", "my body");
mm.BodyEncoding = UTF8Encoding.UTF8;
mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
ss.SendCompleted += (s, b) =>
{
ss.Dispose();
mm.Dispose();
};
try
{
ss.Send(mm);
ss.Dispose();
mm.Dispose();
MessageBox.Show("Connection successfully");
}
catch (Exception ep)
{
MessageBox.Show("Connection error: " + ep.Message, "Smtp Connection Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
btnTestConnection.Enabled = true;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.