Могу ли я отключить проверку адреса электронной почты в System.Net.Mail? - PullRequest
8 голосов
/ 02 июня 2011

Я пытаюсь поговорить с программным обеспечением факс-сервера по электронной почте.Факс-сервер будет принимать отформатированные SMTP-письма, преобразовывать их в факсы и отправлять на номер факса, указанный в адресе.Это было вручную проверено путем отправки электронного письма из Outlook через тот же сервер.

Вот моя проблема - System.Net.Mail выдает исключение System.FormatException: The specified string is not in the form required for an e-mail address. из-за формата адреса электронной почты, который я пытаюсьотправить на

Можно ли как-нибудь отключить / изменить эту проверку, потому что адрес электронной почты может не соответствовать RFC, но он будет работать, если письмо будет отправлено

, т.е. я хочу отправитьto [RFax: Пользователь @ / FN = 0123456789], включая квадратные скобки

Вы можете отправить на него в качестве адреса электронной почты в Outlook

Cheers Chris

EDIT

Это урезанная версия класса, который я использую для обхода проверки.Есть два способа сделать это - один переопределив конструктор и непосредственно установив внутренний атрибут, другой используя внутренний конструктор.Они имеют несколько иной эффект, если в адресе электронной почты есть пробелы

using System;
using System.Reflection;

namespace Mail
{
    public class UnverifiedEmailAddress : System.Net.Mail.MailAddress
    {
        /// <summary>
    /// Constructor to bypass the validation of MailAddress
    /// </summary>
    /// <param name="address">Email address to create</param>
    public UnverifiedEmailAddress(string address)
        : base("a@a")
    {
        FieldInfo field = typeof(System.Net.Mail.MailAddress).GetField("address", BindingFlags.Instance | BindingFlags.NonPublic);
        field.SetValue(this, address);
    }

    /// <summary>
    /// Static method to create an unverifed email address bypassing the address validation
    /// </summary>
    /// <param name="address">Email address to create</param>
    /// <param name="displayName">Display name for email address</param>
    /// <returns></returns>
    private static System.Net.Mail.MailAddress GetUnverifiedEmailAddress(string address, string displayName)
    {
            ConstructorInfo cons = typeof(System.Net.Mail.MailAddress).GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic,
                                                                null,
                                                                new Type[] { typeof(string), typeof(string), typeof(UInt32) },
                                                                null);

            object obj = cons.Invoke(new object[] { address, displayName, UInt32.MinValue });
            System.Net.Mail.MailAddress toAddressObj = (System.Net.Mail.MailAddress)obj;
            return toAddressObj;
        }
    }
}

Ответы [ 4 ]

7 голосов
/ 02 июня 2011

Нет, вы не можете отключить эту проверку.

EDIT:

После небольшого рассмотрения кажется, что следующий фрагмент кода мог бы быть возможным обходным путем:

ConstructorInfo ctor = typeof(MailAddress).GetConstructor(
    BindingFlags.NonPublic | BindingFlags.Instance, null,
    new Type[] { typeof(string), typeof(string), typeof(string) }, null);

MailMessage msg = new MailMessage
{
    To = { (MailAddress)ctor.Invoke(new object[] { null, "[RFax:User", "/FN=0123456789]" }) }
};

Здесь есть две хитрости. Первый - использовать внутренний конструктор MailAddress, который не анализирует / не проверяет предоставленный адрес.

Второй трюк - разделить «адрес факса» на знаке @ и передать его как две части ( пользователь и домен ). Это необходимо, поскольку заголовок SMTP To позднее записывается платформой с использованием свойства MailAddress.Address, и это свойство возвращает user + @ + domain .

2 голосов
/ 02 июня 2011

Некоторые мысли ...

  • RFC 5322 требует, чтобы адрес электронной почты был в форме local-part @ domain .Вы пропустили часть @ domain .

  • RFC 5322 , кроме того, требуется, чтобы local-part былdot-atom, состоящий из 1 или более atoms, разделенных одним периодом (например, foo или foo.bar).Отдельный символ atom представляет собой последовательность из 1 или более следующих символов, взятых из набора символов US-ASCII (7-разрядных) печатных символов US-ASCII, исключая «специальные»: означающие буквы верхнего и нижнего регистра,цифры и символы

    ! # $ % & ' * + - / = ? ^ _ ` { | } ~
    

    Согласно RFC, ваш адрес электронной почты абсолютно недопустим - квадратные скобки являются «специальными» в грамматике и поэтому не допускаются.

    Если вы хотитеиспользуйте что-то отличное от dot-atom в качестве local-part, тогда это должно быть quoted-string, определяемое как вводная двойная кавычка ("), затем quoted-content, за которым следует выводдвойная кавычка (").quoted-content - ноль или более печатаемых символов US-ASCII в диапазоне 0x21–0x7E, исключая " и \.quoted-content может также включать незначительные «складывающиеся пробелы».\, " и пробел могут быть включены путем экранирования их с помощью \ (например, кавычки представлены в строке в кавычках как \", обратные косые черты как \\ и пробелы как \<sp>.

Надеюсь, это поможет!

Отредактировано в примечании: Другой вариант - отправлять почту напрямую через Exchange, а не через интерфейс SMTP, используявеб-сервисы, предоставляемые сервером Exchange: http://msdn.microsoft.com/en-us/library/bb204119.aspx.

1 голос
/ 02 июня 2011

Есть несколько клиентов с открытым исходным кодом для SMTP.Большинство из них старые и устаревшие, но вы можете просто свернуть свои собственные, основываясь на них, например DotNetOpenMail

0 голосов
/ 01 марта 2016

Итак, похоже, вы используете Diem Mail-to-Fax (руководство в формате PDF). Обратите внимание, что самый простой способ сделать это - использовать раздел «SMTP IETF Addressing» - для этого просто потребуется запись MX для fax.company.com и SMTP-совместимые адреса, такие как:

 fax=0123456789/pn=User@fax.company.com

После этого вы сможете отправлять эти факсы с любого клиента без необходимости проходить через сервер Exchange.

Схема RFAX требует специальной поддержки вашего сервера Exchange для маршрутизации на факсимильный аппарат. Поскольку Outlook отправляет почту через MAPI, он может поддерживать это дополнительное адресное пространство. Я не совсем уверен, что даже если вы сможете заставить SmtpClient принять ваш адрес, Exchange будет знать, что с ним делать при доставке по SMTP.

Я подозреваю, что для использования схемы RFAX вам придется отправлять электронную почту через MAPI или веб-службы, поскольку это не SMTP-адрес с самого начала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...