为什么SmtpFailedRecipientException.Failed收件人包含角括号?

时间:2014-09-08 18:07:44

标签: c# email smtpclient

我有一个.NET 4.0应用程序,它使用SmtpClient.Send()方法发送电子邮件。有时我们的SMTP服务器会返回错误,例如" 550 Unknown user",所以我编写了一个捕获SmtpFailedRecipientsException的处理程序,并查看SmtpFailedRecipientsException.InnerExceptions中每个SmtpFailedRecipientException对象的FailedRecipient属性,以确定是否失败是因为To地址,CC地址或Bcc地址。 (我们希望单独处理BCC故障。)

FailedRecipient属性记录为"包含电子邮件地址的字符串。"但是,我发现我尝试确定哪种收件人失败是失败的,因为FailedRecipient包含尖括号,所以它看起来像"< 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()使用此计算的&#34; SMTP地址&#34;而不是MailAddress.Address属性填充SmtpFailedRecipientException!

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

2014年12月15日编辑

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

1 个答案:

答案 0 :(得分:0)

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

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

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

有关此课程here的进一步信息。