SmtpException:客户端或服务器仅配置为具有 ASCII 本地部分的电子邮件地址

Posted

技术标签:

【中文标题】SmtpException:客户端或服务器仅配置为具有 ASCII 本地部分的电子邮件地址【英文标题】:SmtpException: The client or server is only configured for e-mail addresses with ASCII local-parts 【发布时间】:2012-10-26 23:32:25 【问题描述】:

当我尝试向包含重音字符 (é) 的地址发送电子邮件时,SmtpClient.Send() 方法抛出此异常:

System.Net.Mail.SmtpException:客户端或服务器仅配置 对于带有 ASCII 本地部分的电子邮件地址:léo.xxx@example.com。 在 System.Net.Mail.MailAddress.GetAddress(布尔 allowUnicode) 在 System.Net.Mail.SmtpClient.ValidateUnicodeRequirement(MailMessage...) 在 System.Net.Mail.SmtpClient.Send(MailMessage 消息)

消息的表述让我觉得可能有一个设置可以激活以使这项工作发挥作用,尽管我还没有找到关于这个主题的任何内容。

我尝试了多个 SMTP 服务器,包括 Gmail。以下是再现的相关位:

代码

var msg = new MailMessage();
msg.Subject = "Test";
msg.From = new MailAddress("xxx@gmail.com");
msg.To.Add(new MailAddress("léo.yyy@gmail.com"));

new SmtpClient().Send(msg);

app.config

<system.net>
    <mailSettings>
        <smtp from="xxx@gmail.com">
            <network host="smtp.gmail.com" port="587" userName="xxx@gmail.com" password="password" enableSsl="true" />
        </smtp>
    </mailSettings>
</system.net>

【问题讨论】:

您能否显示您在尝试通过 SmtpClient.Send() 方法发送电子邮件时使用的代码 代码非常简单,类似于 SmtpClient.Send() 文档中的示例,否则工作正常。 【参考方案1】:

如果您的SmtpClient 实例的DeliveryFormat 属性设置为SmtpDeliveryFormat.SevenBit(默认值),那么您需要确保您的SMTP 网关在由.NET 发送EHLO 时回复EHLO,而它是试图发送电子邮件。 SmtpClient 使用它来确定网关是否能够支持 UTF8。

根据 .NET Framework 4.5+ 和 .NET core 的源代码,接收服务器必须支持 UTF8 并且必须将 DeliveryFormat 设置为 SmtpDeliveryFormat.International 才能发送。

有关最新逻辑和完整详细信息,请参阅IsUnicodeSupported in:

Current .NET source .NET Framework reference source

【讨论】:

尝试将递送格式设置为国际,仍然出现相同的错误(使用 Gmail 的服务器)。 对我来说也一样,即使 emailClient 选项设置为 SmtpDeliveryFormat.International,它仍然抱怨“客户端或服务器仅配置为带有 ASCII 本地部分的电子邮件地址”...这是通过 Mandrill SMTP 服务器发送的。 根据to the reference source和我的测试,必须满足两个条件(SmtpDeliveryFormat.InternationalSMTPUTF8),而不是任何一个,就像你的回答所暗示的那样。 @realsonic 你是对的...... 6 年后,13k 次观看! @Heinzi 我已经根据您的 cmets 调整了答案。抱歉花了这么长时间。我无法理解为什么我认为这在当时有所不同,尽管我可能正在通过反射器/使用可能有复杂事情的可疑 SMTP 服务器进行测试来挖掘逻辑。【参考方案2】:

迟到的答案,但是,我通过指定这样的编码解决了这个问题:

var mailMessage = new MailMessage
            
               From = new MailAddress("test@domain.co.zw", "Test User", Encoding.UTF8)

在我的情况下,服务器导致了错误。

【讨论】:

该编码用于显示名称,而不是用于电子邮件地址本身。在任何情况下,指定编码都不能解决我的问题。【参考方案3】:

下面的代码对我有用。

SmtpClient smtpClient = new SmtpClient(SMTPServer, SMTPPort)

    Credentials = new NetworkCredential("SMTPUserName", "SMTPPassword"),
    EnableSsl = true,
    DeliveryFormat = SmtpDeliveryFormat.International,
; 

【讨论】:

【参考方案4】:

.net 仅支持 ASCII 字符。我不相信它支持扩展的 ASCII 字符(包括有问题的重音 e)。

http://www.asciitable.com/

我们在用户尝试将丹麦语字符用于 a / e 时遇到了同样的问题。

【讨论】:

你说得对,我发现了一些我最初没有找到的更多信息,因为人们似乎收到了针对同一问题的不同错误消息:“指定的字符串不是所需的形式电子邮件地址” 这个答案不正确 - .NET 确实支持非 ASCII 并且只要 SMTP 网关使用 SMTP UTF8 响应 EHLO 就会愉快地发送邮件 您需要使用反射器或其他东西来检查 BCL。查看 SmtpClient 的私有 IsUnicodeSupported 属性。 那么您所说的是发送电子邮件的机会取决于您发送它的电子邮件服务器及其配置。如果它不是大多数电子邮件服务器的默认设置,这通常不是一个可接受的解决方案。 如果您使用默认的DeliveryMethod,那么这是正确的。这是否是最佳解决方案尚无定论,因为这就是它在 BCL 中的实施方式。

以上是关于SmtpException:客户端或服务器仅配置为具有 ASCII 本地部分的电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

C#发送邮件错误: System.net.mail.smtpException;服务器提交了协议冲突 服务器响应为: .

邮件发送错误c# [重复]

无法使用 gmail 通过 python 发送电子邮件 - smtplib.SMTPException:服务器不支持 SMTP AUTH 扩展

在 Asp.Net 中使用 Office365 SMTP 时出错

ats 安全

这个 gmail smtp 代码有啥问题?