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