string host = "gauntlet.asoshared.com", username= "a@a.test", pwd = "abc",
from = "a@a.test", to = "b@b.test";
int port = 465;
var mm = new MailMessage(from, to);
mm.Body = "b1";
mm.Subject = "s1";
mm.IsBodyHtml=false;
using (var smtp=new SmtpClient(host, port)) {
smtp.EnableSsl = true;
smtp.Credentials = new NetworkCredential (username, pwd);
smtp.Send(mm);
}
它停留在smtp.Send
上。大约2分钟后,我收到超时错误。使用Outlook,它可以完美运行(使用我的真实凭据)。
看着Wireshark,运行此代码时,我看到一个TCP SYN,SYN-ACK,ACK,然后什么也没有。使用Outlook时,其后是TLSv1.2 Client Hello
等。
试图在代码的开头添加以下行:
ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.Expect100Continue=false;
为什么C#卡住了,甚至没有发送Client Hello
?
当我使用其他主机时,效果很好。
编辑:您可以按原样运行上方的代码来重现该问题。您将得到一个超时错误,而不是一个错误的凭据错误,并且使用Wireshark,您可以看到C#甚至没有尝试TLS连接。
答案 0 :(得分:3)
我认为问题是隐式SSL。
System.Net.Mail
仅支持“显式” SSL,如此处所述:
通常,这受惯例约束。在端口25上运行的SMTP(通常情况下)使用显式SSL。在端口465上运行的SMTPS使用隐式SSL。在端口587上运行的邮件提交使用显式SSL。
如果允许显式SSL,则可以尝试使用端口25
。
答案 1 :(得分:0)
可能不在主题之列,但我建议您使用
https://github.com/jstedfast/MailKit
这不是您自己创建smtp客户端的原因,这是https://www.infoq.com/news/2017/04/MailKit-MimeKit-Official中的原因。
SmtpClient的主要问题是它具有令人困惑的连接生命周期。连接到SMTP服务器可能很耗时,尤其是在启用身份验证的情况下,因此每个SmtpClient对象都有一个内部连接池。
答案 2 :(得分:-2)
尝试以下代码。
private async Task<bool> SendEmail(string Email, string Message)
{
try
{
SmtpClient client = new SmtpClient("www.test.com");
client.UseDefaultCredentials = false;
client.Credentials = new NetworkCredential("abc@test.com", "password");
MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress("test@from.com");
mailMessage.To.Add(Email);
mailMessage.Body = Message;
mailMessage.Subject = "abc";
await client.SendMailAsync(mailMessage);
return true;
}
catch (Exception ex)
{
return false;
}
}
答案 3 :(得分:-3)
这段代码对我有用
SmtpClient client = new SmtpClient('smtp.domain.com',25);
client.DeliveryMethod = SmtpDeliveryMethod.Network;
client.UseDefaultCredentials = true;
client.Credentials = new NetworkCredential('username', 'password');
client.EnableSsl = false;
client.Send(mm);
您可以尝试添加 client.DeliveryMethod