Chr*_*ill 8 c# email system.net.mail
我正在尝试使用电子邮件与传真服务器软件交谈.传真服务器将接受格式化的SMTP邮件并将其转换为传真,并将其发送到地址中定义的传真号码.这是通过从同一服务器发送来自Outlook的电子邮件进行手动测试的.
这是我的问题 - System.FormatException: The specified string is not in the form required for an e-mail address.由于我要发送到的电子邮件地址的格式,System.Net.Mail正在抛出
异常
我有什么方法可以关闭/更改此验证,因为电子邮件地址可能不符合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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
不,你不能关闭那个验证.
编辑:
看了一下之后,似乎以下代码片段是一个可行的解决方法:
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]" }) }
};
Run Code Online (Sandbox Code Playgroud)
这里有两个技巧.第一个是使用MailAddress不解析/验证提供的地址的内部构造函数.
第二个技巧是在@ -sign上拆分"传真地址"并将其作为两部分(用户和域)传递.这是必需的,因为SMTP To-header稍后由框架使用该MailAddress.Address属性编写,该属性返回user + @ + domain.