C# SmtpClient在发送时从服务器获取结果

C# SmtpClient在发送时从服务器获取结果,c#,.net,smtpclient,system.net.mail,C#,.net,Smtpclient,System.net.mail,SmtpClient发送方法返回void。有没有办法获得服务器响应?除非抛出异常,否则我是否认为它是成功的 我指的那个班级 要回答你的第二点,是的,你所能做的就是假设它成功了——这意味着它将消息发送给了服务器,服务器接受了消息,除非你遇到异常 你可能已经知道剩下的,但以防万一 从那里,电子邮件可能会丢失,无法以多种方式发送。您的服务器可能会接受它并决定不发送,或者接受它并在崩溃前断电。它可能会被垃圾邮件过滤器拦截,等等 你可以把一封电子邮件想象成一封普通的邮件,因为它在发送者和接收者之间通过几只

SmtpClient发送方法返回void。有没有办法获得服务器响应?除非抛出异常,否则我是否认为它是成功的


我指的那个班级

要回答你的第二点,是的,你所能做的就是假设它成功了——这意味着它将消息发送给了服务器,服务器接受了消息,除非你遇到异常

你可能已经知道剩下的,但以防万一

从那里,电子邮件可能会丢失,无法以多种方式发送。您的服务器可能会接受它并决定不发送,或者接受它并在崩溃前断电。它可能会被垃圾邮件过滤器拦截,等等

你可以把一封电子邮件想象成一封普通的邮件,因为它在发送者和接收者之间通过几只手。从您的代码中,您只能确认它已到达要发送的SMTP服务器,这类似于将其交给邮局的出纳员。您不知道(或需要知道)消息是如何从那里路由的。它可以是航空、地面或信鸽。你不需要知道它是如何发送的,只要你相信他们知道如何发送就行了。(电子邮件也是如此。)

如果您需要确认收件人打开了它,有几种方法可以将图像嵌入到服务器上的HTML消息中,并在访问该图像时在日志中进行跟踪,等等。(谷歌电子邮件跟踪和电子邮件开放跟踪)

另一方面


如果服务器拒绝了它,那么您确实会得到服务器响应——错误中应该有一个错误代码和描述,您可以使用它来解决为什么它没有成功,或者使用错误处理来尝试另一个路由,等等。

您可以利用SendCompleted事件检查您的smtpclient是否工作正常,如下所示:




但您无法确认您的邮件是否已送达收件人,因为它可能会卡在邮件链中的任何服务器/筛选器中。

除非它抛出。。。虽然本例中的成功仅意味着邮件服务器接受了它,但其他一切都取决于服务器


如果你想要一点控制,你可以使用
sendascync
并钩住
sendpleted
事件…

+1:除了“你不需要知道它是如何发送的”这句话之外,还应该有一个说明,说明尽管电子邮件通常会很快被发送出去,各种垃圾邮件控制和服务器设置可能会导致单个电子邮件延迟几分钟到几天之间。有时服务器返回其邮件id时会显示250 ok。。因此,没有看到成功的反应是很糟糕的……这个例子根本不起作用。在新smptClient(args[0])上引发OutOfBounds数组异常