【发布时间】:2016-03-09 10:25:24
【问题描述】:
这应该很正常吧?
public static SmtpClient GetSmtpClient()
{
var client = new SmtpClient
{
Host = _smtpServer,
UseDefaultCredentials = false,
Credentials = new NetworkCredential(_smtpUsername, _smtpPassword),
Port = _smtpPort, // port 25
EnableSsl = _smtpSsl // false
};
return client;
}
...
var m = new MailMessage
{
// contents of mail message
}
using (var server = GetSmtpClient())
{
server.Send(m);
}
但是server.Send() 正在抛出SmtpException:
发送邮件失败。 ---> System.IO.IOException: 无法从传输连接中读取数据:net_io_connectionclosed
我的凭据有问题吗? SMTP 服务器上的 IP 块?也许我的 ISP 阻止了对端口 25 的传出请求?我在调试环境所在的同一台机器上下载并安装了 Thunderbird,并在那里设置了相同的 SMTP 凭据,它运行良好。
那么为什么它在 Thunderbird 中可以工作,但在我的代码中却不行?
更新:遵照@tzachs 的建议,我下载了Wireshark,发现交易进度大致相同。
雷鸟:
TCP 62 25 → 50924 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1360 SACK_PERM=1
SMTP 143 S: 220 smtp.somedomain.com ESMTP Sendmail 8.13.8/8.13.8; Sat, 5 Dec 2015 15:46:22 -0500
TCP 54 25 → 50924 [ACK] Seq=90 Ack=18 Win=5840 Len=0
SMTP 289 S: 250 smtp.somedomain.com Hello my-computer.myisp.com [x.x.60.61], pleased to meet you | 250 ENHANCEDSTATUSCODES | 250 PIPELINING | 250 8BITMIME | 250 SIZE | 250 DSN | 250 ETRN | 250 AUTH LOGIN PLAIN | 250 DELIVERBY | 250 HELP
SMTP 82 S: 235 2.0.0 OK Authenticated
etc.
SmtpClient:
TCP 62 25 → 50889 [SYN, ACK] Seq=0 Ack=1 Win=5840 Len=0 MSS=1360 SACK_PERM=1
SMTP 143 S: 220 smtp.somedomain.com ESMTP Sendmail 8.13.8/8.13.8; Sat, 5 Dec 2015 15:45:08 -0500
TCP 54 25 → 50889 [ACK] Seq=90 Ack=21 Win=5840 Len=0
SMTP 289 S: 250 smtp.somedomain.com Hello my-computer.myisp.com [x.x.60.61], pleased to meet you | 250 ENHANCEDSTATUSCODES | 250 PIPELINING | 250 8BITMIME | 250 SIZE | 250 DSN | 250 ETRN | 250 AUTH LOGIN PLAIN | 250 DELIVERBY | 250 HELP
TCP 54 25 → 50889 [FIN, ACK] Seq=325 Ack=62 Win=5840 Len=0
TCP 54 25 → 50889 [ACK] Seq=326 Ack=63 Win=5840 Len=0
请注意,在 SmtpClient 跟踪中的“很高兴认识您”行之后,没有任何关于身份验证的内容。不是“接受”,也不是“失败”——什么都没有。只是终止连接。
这有什么启示吗?
另一个更新: Smtp 服务器正在运行 SendMail,FWIW。该错误特定于这个特定的 Smtp 主机;当我指向不同的服务器时,代码可以正常工作。
【问题讨论】:
-
有些服务器要求你在出局前先登录入局服务器,你是不是也在Thunderbird中设置了POP服务器?您确定 SMTP 服务器使用的是非 ssl 端口 25 吗?许多人已经在端口 465 或 587 上迁移到 SSL。
-
是的,绝对不是 SSL,端口 25。碰巧我在发送邮件之前登录到传入邮件 (POP),但这是使用不同的对象。无论如何,我将如何首先使用 SmtpClient 检查邮件?它只能发送外发邮件。
-
我会尝试使用wireshark捕获网络通信,它可能会给你一个线索。
-
@tzachs - 使用wireshark 输出更新问题。感谢您的想法!
-
@ShaulBehr 我有一种感觉,wireshark 可能在可扩展行中隐藏了一些额外的信息。您可以尝试 fiddler,并通过:stackoverflow.com/questions/5116148/… 将其配置为 localhost:25 - 并发布您的完整结果吗?确保为请求和响应选择
Raw选项卡。这会很冗长,但应该能让我们更好地了解正在发生的事情。
标签: c# email smtp sendmail smtpclient