将非ASCII域名转换为SMTP兼容的格式

3

当客户输入带有非ASCII字符(如äüö)的电子邮件地址时,我们的SMTP会拒绝处理它们。

因此,我认为可能有一个解决方案来处理这些域并将它们转换为punyocode。

是否有一种简单的方法使用c#来实现?

这样做是否可行?


RFC821和RFC822已经相当古老,甚至RFC2822也已经过时了。但至少在RFC2821和RFC2822之前,SMTP地址只能包含ASCII字符的子集。如果您查看http://en.wikipedia.org/wiki/E-mail_address和“国际化”部分,您会看到正在发生的事情。检查当前MTA支持新标准的重要性不言而喻。我不太明白您的用例。用户直接与您的MTA进行交互吗?在设置他的时候,您能否为他分配带有重音字符的SMTP地址? - Junping
3个回答

8
您可以使用Uri.DnsSafeHost将网址转换为Punycode格式:
using System;

class Test
{
    static void Main()
    {
        Console.WriteLine(ConvertToPunycode("caf\u00e9.com"));
    }

    static string ConvertToPunycode(string domain)
    {
        Uri uri = new Uri("http://"+domain);
        return uri.DnsSafeHost;
    }
}

在 app.config 文件中:
<configuration>
  <uri>
    <idn enabled="All" />
  </uri>
</configuration>

结果:

xn--caf-dma.com

已添加了C#代码,但由于域名被原样返回,所以代码无法正常工作。我应该在哪里添加ASP.net应用程序的配置设置呢?将其添加到web.config中会导致错误。 - Pranali Desai
1
能否在不更改 machine.config 的情况下实现这一点? - Pranali Desai
@Pranali:我相信在IIS配置中有一些内容可以让你指定ASP.NET网站使用的配置...不太确定。 - Jon Skeet

0
将您电子邮件地址的域名中的Unicode字符转换为Punycode,可以解析正确的DNS记录,使其不会被SMTP拒绝。可以使用System.Uri而不修改app.config简单地完成此操作:
/// <summary>
/// Try passing example@äüö.com
/// </summary>
/// <param name="email"></param>
/// <returns></returns>
internal string GetSafeEmail(string email)
{
    const char at = '@';
    string[] split = email.Split(at);
    string safeHost = new Uri("http://" + split[1]).IdnHost;
    // Don't convert the username to Punycode
    return string.Join(at, split[0], safeHost);
}

0

这种方法的问题在于,您将会更改电子邮件地址。

bevan@example.combevän@example.com不同的电子邮件地址,无论它们看起来多么相似。

您建议的更改将会破坏电子邮件 - 人们可能会收到消息,但他们将无法回复。

您的SMTP服务器不支持重音字符听起来像是一只恐龙。尽管这可能很麻烦,但更换和/或升级可能是最佳解决方案。

您可能会在ServerFault上获得更合适的帮助。


2
它不是“恐龙”——它只是遵循RFC 822。 - Jon Skeet

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