SmtpClient发送方法返回void。有没有办法得到服务器响应?除非它抛出异常,我才假设它成功了吗?
我指的是...... http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.aspx
答案 0 :(得分:18)
要回答你的第二点,是的,你所能做的只是假设它成功了 - 这意味着它得到了服务器的消息,服务器接受了它,除非你得到例外。
你可能已经知道了其余部分,但以防万一......
从那里,电子邮件可能会丢失,而且不会以任何方式传递。您的服务器可能会接受它并决定不发送它,或接受它并在崩溃之前断电。它可能会被一个垃圾邮件过滤器阻止等等。
您可以将电子邮件视为与常规邮件类似,因为它通过发件人和收件人之间的多手牌传递。从您的代码中,您只能确认它到达您用来发送的SMTP服务器,这类似于将其交给邮局的出纳员。您不知道(或需要知道)消息是如何从那里路由的。它可以是空中,地面或载体鸽。你不在乎 - 你不需要知道它是如何发送的,只要你相信它们知道如何发送它。 (电子邮件也是如此。)
如果您需要确认收件人是否已将其打开,则可以在服务器上的HTML邮件中嵌入图片,并在访问该图片时在日志中进行跟踪等。(Google电子邮件跟踪和电子邮件打开跟踪)
另一方面......
如果服务器拒绝它,那么你确实会以某种方式获得服务器响应 - 错误中应该有一个错误代码和一个描述,你可以用它来解决它没有成功的原因,或者使用错误处理来尝试其他路由等。
答案 1 :(得分:4)
您可以使用SendCompleted Event来检查您的smtpclient是否正常工作:
http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.sendcompleted.aspx
但是您无法确认您的邮件是否已到达收件人,因为它可能卡在邮件链中的任何服务器/过滤器中。
答案 2 :(得分:1)
你认为它是成功的,除非它抛出......虽然在这种情况下成功只意味着它被邮件服务器接受,但其他任何东西都由服务器决定......
如果您需要一点控制权,可以使用SendAsync
并挂钩SendCompleted
事件......