我正在尝试使用电子邮件与传真服务器软件对话。传真服务器将接受格式化的SMTP邮件并将其转换为传真,并将其发送到地址中定义的传真号码。这是通过从同一服务器发送来自Outlook的电子邮件进行手动测试的。
这是我的问题 - System.Net.Mail正在抛出一个 由于我尝试发送到
的电子邮件地址的格式,System.FormatException: The specified string is not in the form required for an e-mail address.
例外
我有什么方法可以关闭/更改此验证,因为电子邮件地址可能不符合RFC,但如果发送电子邮件则可以使用
即。我想发送到[RFax:User @ / FN = 0123456789],包括方括号
您可以在Outlook中将其作为电子邮件地址发送给
干杯 克里斯
修改
这是我用来绕过验证的类的简化版本。有两种方法可以做到这一点 - 一种是通过覆盖构造函数并直接设置内部属性,另一种是使用内部构造函数。如果电子邮件地址中有空格
,它们的效果会略有不同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;
}
}
}
答案 0 :(得分:7)
不,你无法关闭该验证。
修改强>
稍微观察一下后,似乎以下代码片段是一个可行的解决方法:
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
构造函数。
第二个技巧是在@ -sign上拆分“传真地址”并将其作为两部分传递(用户和域)。这是必需的,因为稍后使用MailAddress.Address
属性由框架编写SMTP To-header,该属性将返回 user + @ + domain 。
答案 1 :(得分:2)
一些想法......
RFC 5322要求电子邮件地址采用 local-part @ domain 格式。您已省略 @domain 部分。
RFC 5322进一步要求 local-part 为dot-atom
,由一个或多个atoms
组成,由一个句点分隔(例如foo
或foo.bar
)。单个atom
是从可打印的US-ASCII字符的US-ASCII(7位)字符集中提取的以下字符中的一个或多个的序列,不包括“特殊”:表示大写/小写字母,数字和字符
! # $ % & ' * + - / = ? ^ _ ` { | } ~
根据RFC,您的电子邮件地址绝对不合法 - 方括号在语法中是“特殊”,因此不允许。
如果您想使用dot-atom
之外的其他内容作为local-part
,那么它必须是quoted-string
,定义为引入双引号({{1} }),然后是"
,然后是引出双引号(quoted-content
)。 "
是零个或多个可打印的US-ASCII字符,范围为0x21-0x7E,不包括quoted-content
和"
。 \
也可能包含无关紧要的“折叠空白”。通过使用quoted-content
转义它们可以包含\
,"
和空格(例如,引号在引用的字符串中表示为\
,反斜杠为\"
和空格为\\
。
希望这有帮助!
编辑为注意:另一种选择是使用Exchange Server公开的Web服务,通过Exchange而不是通过其SMTP前端直接发送邮件:http://msdn.microsoft.com/en-us/library/bb204119.aspx。< / p>
答案 2 :(得分:1)
.Net有一些开源smtp客户端。大多数都是旧的和陈旧的,但你可以根据它们推出自己的,例如DotNetOpenMail
答案 3 :(得分:0)
因此,您似乎正在使用Diem Mail-to-Fax(PDF手册)。请注意,最简单这样做的方法是使用&#34; SMTP IETF寻址&#34;部分 - 它只需要fax.company.com的MX记录,以及符合SMTP的地址,例如:
fax=0123456789/pn=User@fax.company.com
然后,您就可以从任何客户端发送这些传真,而无需通过Exchange服务器。
RFAX
方案需要Exchange服务器的特殊支持才能路由到传真机。由于Outlook通过MAPI提交邮件,因此它可以支持这些额外的地址空间。我不完全确定即使您可以让SmtpClient
接受您的地址,该Exchange也会知道在通过SMTP发送时如何处理它。
我怀疑要使用RFAX方案,您必须通过MAPI或Web服务提交电子邮件,因为它不是开始时的SMTP地址。