Могу ли я отключить проверку адреса электронной почты в системе.Сеть.Почта?
Я пытаюсь поговорить с программным обеспечением факс-сервера, используя электронную почту. Факс-сервер будет принимать отформатированные SMTP-сообщения, скрывать их в факсах и отправлять на номер факса, указанный в адресе кому. Это было проверено вручную, отправив электронное письмо из Outlook через тот же сервер.
вот моя проблемная система.Сеть.Почта бросает 
    System.FormatException: The specified string is not in the form required for an e-mail address. исключение из-за формата адреса электронной почты, который я пытаюсь отправить
есть ли способ я могу включить выключите / измените эту проверку, потому что адрес электронной почты может не соответствовать RFC, но он будет работать, если письмо будет отправлено
т. е. я хочу отправить в [RFax:User@/FN=0123456789] включая квадратные скобки
вы можете отправить на этот адрес электронной почты в Outlook
Ура Крис!--3-->
редактировать
это урезанная версия класса, который я использую для обхода проверки. Есть два способа сделать это - один переопределение конструктора и установка внутреннего атрибута напрямую, другой с помощью внутреннего конструктора. Они имеют несколько разные эффекты, если в адресе электронной почты есть пробелы
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 ответов
нет, вы не можете отключить эту проверку.
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-header позже записывается платформой с помощью MailAddress.Address свойства, и это свойство возвращает пользователей + @+домен.
некоторые мысли...
RFC 5322 требуется, чтобы адрес электронной почты был в форме локальная часть@domain. Вы опустили @domain часть.
- 
RFC 5322 далее требуется, чтобы местные-часть быть
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.
есть некоторые SMTP-клиенты с открытым исходным кодом .Сеть. Большинство из них старые и несвежие, но вы можете просто свернуть свои собственные на их основе, такие как DotNetOpenMail
Итак, похоже, вы используете Diem Mail-to-Fax (руководство PDF). Обратите внимание, что простой способ сделать это, используя раздел "адресация IETF SMTP" - который просто потребует записи MX для fax.company.com, и SMTP-совместимые адреса, такие как:
 fax=0123456789/pn=User@fax.company.com
затем вы сможете отправлять эти факсы с любого клиента, без необходимости проходить через сервер Exchange.
на RFAX схема требует специальной поддержки от ваших Exchange server для маршрутизации к факсу. Поскольку Outlook отправляет почту через MAPI, он может поддерживать эти дополнительные адресные пространства. Я не совсем уверен, что даже если вы можете получить SmtpClient чтобы принять ваш адрес, Этот обмен будет знать, что с ним делать при доставке через SMTP.
Я подозреваю, что для использования схемы RFAX вам придется отправить электронное письмо через MAPI или веб-службы, так как это не SMTP-адрес для начала.