gpt4 book ai didi

c# - 无法将电子邮件发送到带有斯堪的纳维亚字符的地址

转载 作者:太空狗 更新时间:2023-10-29 17:44:29 29 4
gpt4 key购买 nike

使用 SmtpClientMailMessageMailAddress 类,我无法发送到 åbc.def@domain.se 等电子邮件地址。我收到如下所示的错误/异常:

An invalid character was found in the mail header: 'å'.

--------------------------- Error sending email--------------------------- System.Net.Mail.SmtpException: The client or server is only configured for E-mail addresses with ASCIIlocal-parts: åbc.def@domain.se.

at System.Net.Mail.MailAddress.GetUser(Boolean allowUnicode)

at System.Net.Mail.MailAddress.GetAddress(Boolean allowUnicode)

at System.Net.Mail.MailAddress.Encode(Int32 charsConsumed, BooleanallowUnicode)

at System.Net.Mail.MailAddressCollection.Encode(Int32charsConsumed, Boolean allowUnicode)at System.Net.Mail.Message.PrepareHeaders(Boolean sendEnvelope,Boolean allowUnicode)at System.Net.Mail.Message.Send(BaseWriter writer, BooleansendEnvelope, Boolean allowUnicode)at System.Net.Mail.SmtpClient.Send(MailMessage message)

我的主题/正文中的这些字符没问题,但在电子邮件地址中却不行。

我试过设置 SmtpClient.DeliveryMethod = SmtpDeliveryFormat.International,或 MailMessage.HeadersEncoding = Encoding.Unicode(或 UTF8)和它似乎没有改变任何东西。这些是我们需要与之通信的人的真实电子邮件地址,所以这有点问题。

我一直在深入研究 .Net 源代码,但一无所获。我找到了一个 ServerSupportsEai 属性,Google 告诉我 EAI 代表电子邮件地址国际化 ( https://www.rfc-editor.org/rfc/rfc5336 ),但目前尚不清楚这是否是我代码中的限制,或者我是否正在访问特定服务器与只是交谈不支持这一点...因为我正在使用测试服务器来避免向毫无戒心的瑞典人发送电子邮件!

谁能帮我解决这个问题 - .Net 支持这个吗?如果支持的话,我的客户端代码应该做些什么来启用它?

最佳答案

能够根据RFC6531发送UTF-8字符客户端和服务器都需要支持它。

如果您使用 SmtpClient 的 .NET 实现,您需要以框架版本 4.5 为目标,因为该实现支持 SMTPUTF8 扩展。

如果您设置 DeliveryFormat您已完成客户端支持 UTF8 字符所需的属性:

using (var smtp = new SmtpClient())
{
smtp.DeliveryFormat = SmtpDeliveryFormat.International;

var message = new MailMessage(
"my.email@gmail.com",
"ëçïƒÖ@example.com",
"UTF8",
"Is UTF8 supported?");

smtp.Send(message);
}

如果我们对 Send 方法进行逆向工程,我们可以很容易地跟踪您问题中的堆栈跟踪。你会发现这个实现:

if (!allowUnicode && !MimeBasePart.IsAscii(this.userName, true))
{
throw new SmtpException(SR.GetString("SmtpNonAsciiUserNotSupported", new object[]
{
this.Address
}));
}

allowUnicode bool 值由 Send 方法提供:

if (this.DeliveryMethod == SmtpDeliveryMethod.Network)
{
return this.ServerSupportsEai && this.DeliveryFormat == SmtpDeliveryFormat.International;
}

图中的服务器出现了。私有(private) bool 值 ServerSupportsEai 何时变为真?事实证明,在发送 EHLO 命令时,SmptConnection 会调用 ParseExtensions:

if (string.Compare(text, 0, "SMTPUTF8", 0, 8, StringComparison.OrdinalIgnoreCase) == 0)
{
((SmtpPooledStream)this.pooledStream).serverSupportsEai = true;
}

如果您想预先知道您的邮件服务器是否支持该扩展,您可以简单地使用 telnet 客户端(我使用 putty)连接到您的 smtp 服务器并发送 EHLO somename 命令并检查结果。

连接到端口 587 上的 smtp.gmail.com 给我这个输出:

220 smtp.gmail.com ESMTP hx10sm19521922wjb.25 - gsmtp
EHLO fubar
250-smtp.gmail.com at your service, [2001:FFF:8bef:1:34d6:a247:FFFF:4620]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8

注意最后一行:它包含我们需要的 SMTPUTF8

tl;博士

为了能够在电子邮件地址中使用国际字符,请确保将 DeliveryFormat 设置为 SmtpDeliveryFormat.International 并使用支持 SMTPUTF8 扩展并通告它的 smtp 服务器在其 EHLO 命令中。

关于c# - 无法将电子邮件发送到带有斯堪的纳维亚字符的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35159053/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com