使用SSL向GMail发送邮件时,身份验证或解密失败

时间:2010-11-10 19:02:06

标签: c# email mono gmail

我指的是guide on C# SMTP mail

这是我的代码:

MailMessage mail = new MailMessage();
SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com");
mail.From = new MailAddress("dave.stockinger@gmail.com");
mail.To.Add("dave.stockinger@gmail.com");
mail.Subject = "Test Mail";
mail.Body = "This is for testing SMTP mail from GMAIL";
SmtpServer.Port = 587;
SmtpServer.Credentials = new System.Net.NetworkCredential("MyUserNameInGmail", "MyGmailPassWord");
SmtpServer.EnableSsl = true;

SmtpServer.Send(mail);

不幸的是,有一个关于SSL的例外,我无法修复它:

  

未处理的例外情况:   System.Net.Mail.SmtpException:消息   无法发送。 --->   System.IO.IOException:The   验证或解密   失败。 --->   System.InvalidOperationException:SSL   授权错误:   RemoteCertificateNotAvailable,   RemoteCertificateChainErrors at   System.Net.Mail.SmtpClient.m__4   (System.Object sender,   System.Security.Cryptography.X509Certificates.X509Certificate   证书,   System.Security.Cryptography.X509Certificates.X509Chain   chain,SslPolicyErrors   sslPolicyErrors)[0x00000] in   :0点   System.Net.Security.SslStream + c__AnonStorey7<> m__A   (System.Security.Cryptography.X509Certificates.X509Certificate   cert,System.Int32 [] certErrors)   [0x00000] in:0
  在   Mono.Security.Protocol.Tls.SslClientStream.OnRemoteCertificateValidation   (System.Security.Cryptography.X509Certificates.X509Certificate   证书,System.Int32 []错误)   [0x00000] in:0
  在   Mono.Security.Protocol.Tls.SslStreamBase.RaiseRemoteCertificateValidation   (System.Security.Cryptography.X509Certificates.X509Certificate   证书,System.Int32 []错误)   [0x00000] in:0
  在   Mono.Security.Protocol.Tls.SslClientStream.RaiseServerCertificateValidation   (System.Security.Cryptography.X509Certificates.X509Certificate   证书,System.Int32 []   certificateErrors)[0x00000] in   :0点   Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.validateCertificates   (Mono.Security.X509.X509CertificateCollection   证书)[0x00000] in:0 at   Mono.Security.Protocol.Tls.Handshake.Client.TlsServerCertificate.ProcessAsTls1   ()[0x00000] in:0
  在   Mono.Security.Protocol.Tls.Handshake.HandshakeMessage.Process   ()[0x00000] in:0
  在(包装   远程-调用,以检查)   Mono.Security.Protocol.Tls.Handshake.HandshakeMessage:过程   () 在   Mono.Security.Protocol.Tls.ClientRecordProtocol.ProcessHandshakeMessage   (Mono.Security.Protocol.Tls.TlsStream   handMsg)[0x00000] in:0 at   Mono.Security.Protocol.Tls.RecordProtocol.InternalReceiveRecordCallback   (IAsyncResult asyncResult)[0x00000]   in:0 ---结束   内部异常堆栈跟踪--- at   Mono.Security.Protocol.Tls.SslStreamBase.AsyncHandshakeCallback   (IAsyncResult asyncResult)[0x00000]   in:0 ---结束   内部异常堆栈跟踪--- at   System.Net.Mail.SmtpClient.Send   (System.Net.Mail.MailMessage消息)   [0x00000] in:0
  在csharpdungeon.MainClass.Main()   [0x00000] in:0

7 个答案:

答案 0 :(得分:23)

检查以下代码是否适合您;我已经在我的Gmail帐户上测试了它,它似乎与我在ubuntu 10.04LTS上运行的mono 2.0一起工作

using System;
using System.Net;
using System.Net.Mail;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;

namespace mono_gmail
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            MailMessage mail = new MailMessage();

            mail.From = new MailAddress("my.name@gmail.com");
            mail.To.Add("my.name@hotmail.com");
            mail.Subject = "Test Mail";
            mail.Body = "This is for testing SMTP mail from GMAIL";

            SmtpClient smtpServer = new SmtpClient("smtp.gmail.com");
            smtpServer.Port = 587;
            smtpServer.Credentials = new System.Net.NetworkCredential("my.name", "my.password");
            smtpServer.EnableSsl = true;
            ServicePointManager.ServerCertificateValidationCallback = 
                delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
                    { return true; };
            smtpServer.Send(mail);
        }
    }
}

解决方案取自here

希望这有帮助,尊重

答案 1 :(得分:14)

正确的解决方案不是删除SSL证书验证。 GMail拥有有效证书。问题是Mono似乎无法找到证书。

由于这么多原因,这是完全错误的,但主要是因为它删除了一个非常重要的证书验证:

ServicePointManager.ServerCertificateValidationCallback = 
            delegate(object s, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) 
                { return true; };

正确的解决方案是在您的计算机上安装证书:

mozroots --import --ask-remove --machine
certmgr -ssl smtps://smtp.gmail.com:465

这将有效下载gmail证书,并使其可供单声道使用。

答案 2 :(得分:6)

您没有在Mono可以看到它们的地方安装相应的证书颁发机构。有关解决此错误的步骤,请查看the Mono project security FAQ

答案 3 :(得分:1)

如果您使用的是SSL而不是TLS,则需要端口465而不是587。

请参阅http://mail.google.com/support/bin/answer.py?hl=en&answer=13287

答案 4 :(得分:1)

您是否尝试过更改端口,我知道SSL的默认SMTP端口是465

答案 5 :(得分:0)

SmtpClient with Gmail

找到另一个解决方案
certmgr -ssl smtps://smtp.gmail.com:465

如果您正在运行单声道网络服务器,请使用与mono process相同的用户名运行命令。

答案 6 :(得分:-1)

您需要使用SSL安全发送吗?您可以删除不需要SSL证书的此语句SmtpServer.EnableSsl = true;