无法通过ASP.NET应用程序发送电子邮件
本文关键字:应用程序 电子邮件 NET ASP | 更新日期: 2023-09-27 18:23:48
我有一个ASP.NET应用程序运行在专用服务器"Windows server 2012 R2"上。该网站始终使用SSL加密,证书正确安装在服务器上,并在通过不同浏览器访问时显示为有效。
我现在想通过我的应用程序发送电子邮件,为此,我按照本文中的说明设置了一个SMTP服务器。http://www.vsysad.com/2014/09/setup-and-configure-smtp-server-on-windows-server-2012/
按照上面指定的方式设置SMTP服务器后,我可以使用powershell发送电子邮件,并且发送电子邮件时不会出现问题。然而,当我通过我的应用程序进行同样的操作时,我会得到以下错误
Exception Type: System.Security.Authentication.AuthenticationException
Exception: The remote certificate is invalid according to the validation procedure.
Stack Trace:
at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
at System.Net.Mail.SmtpConnection.Flush()
at System.Net.Mail.EHelloCommand.Send(SmtpConnection conn, String domain)
at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint)
at System.Net.Mail.SmtpClient.Send(MailMessage message)
at EmailSender.SendMailSingleRecipient(String recipient, String subject, String message)
从我的应用程序发送电子邮件的代码非常简单,如下所示。
MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress("no-reply@mysite.com");
mailMessage.To.Add("myemail@email.com");
mailMessage.Subject = "subject"
mailMessage.Body = "message"
SmtpClient smtpClient = new SmtpClient("localhost", 25);
smtpClient.Send(mailMessage);
我已经多次看到同一问题的报告,但没有解决问题的答案。有人能解释一下这个错误背后的原因以及可能的原因/解决方案吗。
检查此函数。
protected void SendMail()
{
var fromAddress = "youremail@gmail.com";// Gmail Address from where you send the mail
var toAddress = YourEmail.Text.ToString();
const string fromPassword = "password";//Password of your gmail address
string email = YourEmail.Text.ToString();
string body = "First Name: " + YourName.Text + "'n";
body += "Last Name: " + YourlName.Text + "'n";
body += "Email: " + YourEmail.Text + "'n";
body += "mobile no.: " + Yourmobi.Text + "'n";
body += "Question: 'n" + Comments.Text + "'n";
var smtp = new System.Net.Mail.SmtpClient();
{
smtp.Host = "smtp.gmail.com";
smtp.Port = 587;
smtp.EnableSsl = true;
smtp.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
smtp.Credentials = new NetworkCredential(fromAddress, fromPassword);
smtp.Timeout = 20000;
}
smtp.Send(toAddress, fromAddress, email, body);
try
{
lblMsgSend.Text = "Your Comments after sending the mail";
lblMsgSend.Visible = true;
Yourmobi.Text = "";
YourEmail.Text = "";
YourName.Text = "";
YourlName.Text = "";
Comments.Text = "";
}
catch (Exception) { }
}
问题是,您需要设置Credentials
。您的powershell scritp似乎在另一个用户上下文中运行,而不是在您的asp.net主机中运行,因此它可以工作,但您的asp.net应用程序不可以。
看看:如何在.NET中为SmtpClient对象设置用户名和密码?
这可能是服务器上的reson SMTP服务没有使用与https相同的证书。
我在这里阅读的诊断步骤
我设法找到了原来问题的解决方案。我没有直接从应用程序发送,而是将SMTP服务器设置为使用拾取目录。
应用程序代码现在非常简单,指定交付方法和取货目录也可以移动到配置文件中。
SmtpClient client = new SmtpClient("localhost", 25);
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
client.PickupDirectoryLocation = @"C:'inetpub'mailroot'Pickup";
client.Send(mail);
这种方法的另一个优点是,可以测试应用程序生成的电子邮件,而无需在开发机器上设置SMTP。通过查找pickup目录,您可以确定应用程序是否正常工作。
在我的实时服务器上使用这种方法,我几乎一从应用程序发送电子邮件就收到它,所以性能非常好。