SmtpFailedRecipientException.FailedRecipient为什么包含尖括号

本文关键字:包含尖 为什么 FailedRecipient SmtpFailedRecipientException | 更新日期: 2023-09-27 18:21:03

我有一个.NET 4.0应用程序,它使用SmtpClient.Send()方法发送电子邮件。有时我们的SMTP服务器会返回一个错误,比如"550未知用户",所以我编写了一个处理程序来捕获SmtpFailedRecipientsException,并查看SmtpFailed RecipientException.InnerException中每个SmtpFailtedRecipientException对象的FailedRecept属性,以确定失败是因为to地址、CC地址还是Bcc地址。(我们希望单独处理BCC故障。)

FailedRecipient属性被记录为"包含电子邮件地址的字符串"。但是,我发现我尝试确定哪种类型的收件人失败了,因为FailedReccipient包含尖括号,所以看起来像"<failedrecipient@domain.com>"而不是"failedrecipient@domain.com"!该房产应该包括尖括号,这样该房产的所有消费者都必须检查他们是否在那里,然后在有用之前把它们去掉,这正确吗?

编辑

啊。。。好吧,如果referencesource.microsoft.com是可信的,并且代码没有从4.0更改为4.5.1,那么我想我已经找到了问题的原因。SmtpClient.Send()方法调用SmtpTransport.SendMail()与SMTP服务器通信。由于SMTP协议要求RCPT TO:命令的电子邮件地址参数用尖括号分隔,SmtpTransport.SendMail()调用内部方法MailAddress.GetSmtpAddress()以获取要发送到SMTP服务器的值:

internal string GetSmtpAddress(bool allowUnicode)
{
    return String.Format(CultureInfo.InvariantCulture, "<{0}>", GetAddress(allowUnicode));
}

但是,如果RCPT TO:命令失败,则SmtpTransport.SendMail()将使用此计算的"SMTP地址"而不是MailAddress.address属性填充SmtpFailedRecipientException!

这是一个值得报告错误的问题吗?

2014年12月15日编辑

三个月前,我打开了Connect漏洞970353,并给了他们代码来重现这个问题。还没有消息。

SmtpFailedRecipientException.FailedRecipient为什么包含尖括号

邮件服务器通常以以下格式向客户端提供电子邮件地址:"John Smith" <john.smith@domain.com>

你应该期待这种格式的地址可能会回来。您可以尝试将收到的字符串传递给System.Net.Mail.MailAddress类,以便为您解析:

string emailAddress = new System.Net.Mail.MailAddress("'"John Smith'" <john.smith@domain.com>").Address;

这里有关于这门课的更多信息。