如何检查邮件是否成功发送

29

我正在开发一个Asp.Net应用程序,如果用户忘记密码,我会向他的电子邮件地址发送一封邮件。

我想要检查邮件是否已成功发送。有没有办法确定这一点。

编辑

如果电子邮件地址不存在,我能否检测到发送失败。

8个回答

27
如果你的 SmtpMail.Send(message) 方法没有返回错误,那么这意味着该电子邮件已发送到SMTP服务器,然后你就没有更多的权限了,这是你能知道的范围。

11

将 .Send(msg) 方法放在 try-catch 块中,并捕获 SmtpFailedRecipientException 异常。

try
{
    mail.Send(msg);
}
catch (SmtpFailedRecipientException ex)
{
    // ex.FailedRecipient and ex.GetBaseException() should give you enough info.
}

在我的情况下,如果收件人地址有误而发件人地址正确,不会抛出任何错误。只有当发件人地址有误时,我才会捕获错误。 - Darrell Lloyd Harvey

9
如果您正在使用System.Net.Mail,请尝试使用
message.DeliveryNotificationOptions = System.Net.Mail.DeliveryNotificationOptions.OnSuccess;

1
啊,被他领先了16秒 :( - Aaron
28
那是想达到什么效果?它只是一个设置,没有解释。 - codingbiz
如果您添加 message.Headers.Add("Disposition-Notification-To", "youremail@email.com");,则在消息成功发送时它将发送一封电子邮件到 "youremail@email.com"。此外,还有一个枚举值 System.Net.Mail.DeliveryNotificationOptions.OnFailure,如果发送失败,则会发送通知。 - codeMonkey

7
根据规范,SMTP是一种用于电子邮件传输的协议。
S: 220 smtp.example.com ESMTP Postfix
C: HELO relay.example.org
S: 250 Hello relay.example.org, I am glad to meet you
C: MAIL FROM:<bob@example.org>
S: 250 Ok
C: RCPT TO:<alice@example.com>
S: 250 Ok
C: RCPT TO:<theboss@example.com>
S: 250 Ok
C: DATA
S: 354 End data with <CR><LF>.<CR><LF>
C: From: "Bob Example" <bob@example.org>
C: To: Alice Example <alice@example.com>
C: Cc: theboss@example.com
C: Date: Tue, 15 Jan 2008 16:02:43 -0500
C: Subject: Test message
C:
C: Hello Alice.
C: This is a test message with 5 header fields and 4 lines in the message body.
C: Your friend,
C: Bob
C: .
S: 250 Ok: queued as 12345
C: QUIT
S: 221 Bye
{The server closes the connection}

当服务器返回250 Ok: queued as 12345时,你不能确定它是否真的发送了电子邮件,或者它是否已经被投递。


你如何实际追踪/检查呢?有没有一种工具可以跟踪SMTP通信?基于Linux的? - Denys S.

5
您可以使用DeliveryNotificationOptions来接收回执。
如果您有一个名为mail的MailMessage对象,请执行以下操作:
mail.DeliveryNotificationOptions = DeliveryNotificationOptions.OnSuccess;

4

电子邮件(基于SMTP)是一种不可靠的传输协议,尽管有一些技巧可以检测到电子邮件已被接收和阅读,例如在电子邮件中嵌入个性化图像URL并跟踪收件人客户端请求该图像,但没有绝对可靠的方法来满足您的要求。


4

SmtpClient.Send 方法在发送过程中如果出现问题会引发异常。但是除了将消息发送到 SMTP 服务器外,无法知道它是否成功到达目的地。


1

我正在使用 Gmail SMTP 来发送我的程序中的邮件。即使使用 SmtpFailedRecipientException 陷阱,发送的伪造邮件也会返回 Ok。

但是当我用 Outlook 检查我的 Gmail 收件人时,我发现邮件没有发送,并附有解释。主题为“传递状态通知(失败)”

我的问题是,是否可能在程序中获取此通知。

我找到了这个,但它不适用于 POP。

当 SMTP 服务器接收到新邮件时,通知 C# 客户端


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接