这是我的代码:
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
答案 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)
certmgr -ssl smtps://smtp.gmail.com:465
如果您正在运行单声道网络服务器,请使用与mono process相同的用户名运行命令。
答案 6 :(得分:-1)
您需要使用SSL安全发送吗?您可以删除不需要SSL证书的此语句SmtpServer.EnableSsl = true;
。