我正在尝试使用 asp.net mvc 应用程序发送电子邮件。SMTP 客户端在 web.config 中配置,例如:
<mailSettings>
<smtp from="noreply@test.sk">
<network host="mail.test.sk" defaultCredentials="false" userName="noreply@test.sk" password="pass" port="25"/>
</smtp>
</mailSettings>
C#:
using (SmtpClient client = new SmtpClient())
{
MailMessage message = new MailMessage(from, to, subject, body);
client.Timeout = 10000;
client.Send(message);
return false;
}
问题是,在我尝试使用 Outlook 发送电子邮件之前,它不起作用(我得到超时异常)。通过 Outlook 发送电子邮件后,它也通过我的 Web 应用程序成功发送。是否有某种特殊类型的身份验证,Outlook 正在执行该身份验证,然后允许对来自我 IP 的所有电子邮件进行身份验证?是什么原因只能通过outlook发送后才起作用?
顺便说一句:我在 VS asp.net 开发服务器中运行该应用程序。当我将它部署到虚拟主机服务器时,它不起作用(超时)。我的虚拟主机提供商告诉我,该服务器上有一个经典的 smtp 身份验证(不是 smtp 之前的 pop3)。
编辑:
我发现,当它工作时,我通过 telnet 尝试或通过 wireshark 跟踪它,通信开始于:
220 mail2.hostmaster.sk ESMTP Postfix
EHLO fernet-PC
250-mail2.hostmaster.sk
250-PIPELINING
250-SIZE 104857600
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-AUTH=PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
...
与它不起作用时(前一天刚尝试过)相比,整个通信看起来像:
220-mail2.hostmaster.sk ESMTP Postfix
EHLO fernet-PC
250-mail2.hostmaster.sk
250-SIZE 104857600
250-ETRN
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
所以支持的身份验证方法和对流水线的支持是有区别的。我猜 System.Net.Mail.SmtpClient 然后不知道它应该使用哪种身份验证方法,所以它卡住了,因此我得到了超时异常。
有趣的是,Outlook 连接和发送电子邮件没有问题。
我没有使用他们的 smtp 服务器解决了我的问题,因为我的时间不多了。我正在使用 gmail 的 smtp 服务器。我创建了新的 gmail 帐户,并在其中将别名设置为我需要的内容,因此电子邮件看起来好像不是来自 gmail。