3

When customers enter email addresses with non-ascii chars like äüö our SMTP rejects to process them.

So I think might be there is a solution to handle those domains myself and convert them to punyocode.

Is there a simple way of doing so using c#?

Would this work anyway?

Bevan
  • 43,618
  • 10
  • 81
  • 133
kcode
  • 1,220
  • 1
  • 18
  • 34
  • RFC821 and RFC822 are quite old, even RFC2822 is made obsolete. But at least up till RFC2821 and RFC2822, the SMTP address can only contain a subset of ASCII chars. If you look at http://en.wikipedia.org/wiki/E-mail_address and section "Internationalization". You will see what has been happening. It's important to check the support of the new standards of your current MTA. I don't exactly understand your use case. The user is directly interfacing with your MTA? Were you able to assign them the SMTP address with accented char when setting him up? – Junping Jan 06 '10 at 14:27

3 Answers3

8

You can use Uri.DnsSafeHost to convert to 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;
    }
}

In app.config:

<configuration>
  <uri>
    <idn enabled="All" />
  </uri>
</configuration>

Result:

xn--caf-dma.com
Jon Skeet
  • 1,421,763
  • 867
  • 9,128
  • 9,194
  • Added the C# code but it does not work as the domain name is returned as it is, where shall I add the configuration settings for ASP.net application as adding this in web.config gives error. – Pranali Desai Jun 28 '10 at 09:14
  • 1
    Is it possible to achieve this without making changes to machine.config? – Pranali Desai Jun 28 '10 at 10:05
  • @Pranali: I *believe* there's something in the IIS configuration which lets you specify the configuration to use for an ASP.NET web site... not sure. – Jon Skeet Jun 28 '10 at 10:21
0

The problem with this approach is that you'll be changing the email addresses.

The email addresses bevan@example.com and bevän@example.com are different email addresses, however much they appear the same.

Making the change you suggest will break email - people might receive the messages, but they won't be able to reply to them.

Your SMTP server that doesn't handle accented characters sounds like a dinosaur. Much as it might be a pain in the proverbial, replacement and/or upgrade is likely the best solution.

You'll likely be able to get more appropriate assistance over on ServerFault.

Bevan
  • 43,618
  • 10
  • 81
  • 133
0

Converting Unicode characters in your email address' domain name to Punycode resolves the correct DNS records so it won't be rejected by your SMTP. It can be done simply using System.Uri without modifying 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);
}