Апостроф в адресе электронной почты вызывает SmtpException

Наше бизнес-приложение обслуживает многие организации, и некоторые из них имеют апострофы в своем адресе электронной почты (локальная часть), что является технически действительным.

Однако я не могу отправлять электронные письма, если адрес электронной почты ОТ или ОТ содержит апостроф (локальная часть) в соответствии с этим примером C#:

    private const string SMTP_HOST = "localhost";
    public static void CreateCopyMessage2()
    {
//      var from = new MailAddress("john.o'connor@contoso.com", "John O'Connor");
        var from = new MailAddress("john.smith@contoso.com", "John Smith");

        var to = new MailAddress("jane.o'leary@contoso.com", "Jane O'Leary");
//      var to = new MailAddress("jane.smith@contoso.com", "Jane Smith");


        var message = new MailMessage(from, to) {
            Subject = "Email Subject",
            Body = "Email Body Text"
        };

        SmtpClient client = new SmtpClient(SMTP_HOST) {
            Credentials = CredentialCache.DefaultNetworkCredentials
        };

        try
        {
            client.Send(message);
        }
        catch (SmtpException ex)
        {
            Console.WriteLine($"Exception caught: {ex}");
        }
    }

Подробности исключения, когда to адрес электронной почты содержит апостроф:

System.Net.Mail.SmtpException: Syntax error in parameters or arguments. The server response was: Error in parameters. Syntax:{RCPT TO:<address> [SIZE=msgSize]}
   at System.Net.Mail.RecipientCommand.CheckResponse(SmtpStatusCode statusCode, String response)
   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at EmailWithApostropheTest.Program.Main() in ....\Program.cs:line 65

Подробности исключения, когда from адрес электронной почты содержит апостроф:

System.Net.Mail.SmtpException: Syntax error in parameters or arguments. The server response was: Error in parameters. Syntax:{MAIL FROM:<address> [SIZE=msgSize] [BODY=8BITMIME]}
   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
   at System.Net.Mail.MailCommand.Send(SmtpConnection conn, Byte[] command, MailAddress from, Boolean allowUnicode)
   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, Boolean allowUnicode, SmtpFailedRecipientException& exception)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at EmailWithApostropheTest.Program.Main() in ....\Program.cs:line 65

Электронные письма хороши, когда ни один из них не содержит апострофа. Любой совет будет оценен.

РЕДАКТИРОВАТЬ: @JamesThorpe прокомментировал ниже о тестировании с Telnet. У меня есть два производственных сервера, которые используют hmailserver и mdaemon, и среду разработки, в которой используется мусорная корзина " накатить себе". Всем трем удалось принять и ретранслировать электронные письма, содержащие апострофы, и мой "сам по себе" (в отладчике) никогда не получал команду (MAIL FROM/RCPT TO), которая содержала адрес электронной почты с апострофом при использовании SMTPClient поэтому я уверен, что это проблема.NET SMTPClient.

Вот пример работы telnets (test.com - это то, что я использовал на самом деле):

220 test.com ESMTP Mon, 13 Nov 2017 17:30:29 +0000
HELO test.com
250 test.com Hello test.com [127.0.0.1], pleased to meet you
MAIL FROM:noreply.o'connor@myorg.com
250 2.1.0 Sender OK
RCPT TO:chris.walsh@real-sense.com
250 2.1.5 Recipient OK
DATA
354 Enter mail, end with <CRLF>.<CRLF>
test 123 test 123 from elms
.
250 2.6.0 Ok, message saved



220 test2.net ESMTP
HELO test2.net
250 Hello.
MAIL FROM:chris.walsh@test.net
250 OK
RCPT TO:john.o'connor@test.com
250 OK
DATA
354 OK, send.
Test 123
.
250 Queued (4.531 seconds)
MAIL FROM:test.o'connor@activbase.net
250 OK
RCPT TO:my.real.name@my.real.org.com
250 OK
DATA
354 OK, send.
test123
test 123
.
250 Queued (3.203 seconds)

Спасибо, Крис.

0 ответов

Если вы установите международный формат доставки, он должен работать. Что-то типа:

    SmtpClient client = new SmtpClient(SMTP_HOST) {
        Credentials = CredentialCache.DefaultNetworkCredentials,
        DeliveryFormat = SmtpDeliveryFormat.International
    };
Другие вопросы по тегам