Могу ли я отключить проверку адреса электронной почты в системе.Сеть.Почта?

Я пытаюсь поговорить с программным обеспечением факс-сервера, используя электронную почту. Факс-сервер будет принимать отформатированные 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-адрес для начала.