无法通过ASP.NET应用程序发送电子邮件

时间:2015-11-21 11:00:36

标签: c# asp.net ssl smtp windows-server-2012

我有一个在专用服务器上运行的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);

我已经看过很多次报道同样的问题,但没有答案可以解决这个问题。有人可以解释这个错误背后的原因以及可能的原因/解决方案。

4 个答案:

答案 0 :(得分:1)

检查此功能。



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) { }
    }




答案 1 :(得分:0)

问题是,您需要设置Credentials。你的powershell scritp似乎在你的asp.net主机之外的另一个用户环境中运行,所以它可以工作,但你的asp.net应用程序没有。

请看一下:How to set username and password for SmtpClient object in .NET?

答案 2 :(得分:0)

这可能是服务器上的共振SMTP服务未使用与https相同的证书。

diagnostic steps I had read here

答案 3 :(得分:0)

我设法找到原始问题的解决方案。我没有直接从我的应用程序发送,而是将我的SMTP服务器设置为使用拾取目录。

现在应用程序代码非常简单,指定传递方法和拾取目录也可以移动到配置文件中。

SmtpClient client = new SmtpClient("localhost", 25);
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
client.PickupDirectoryLocation = @"C:\inetpub\mailroot\Pickup";
client.Send(mail);

此方法的另一个优点是可以在不在开发计算机上设置SMTP的情况下测试从应用程序生成电子邮件。通过查看拾取目录,您可以确定应用程序是否正常工作。

在我的实时服务器上使用这种方法,我几乎在从应用程序发送电子邮件时收到该电子邮件,因此性能非常好。