我可以在System.Net.Mail中关闭电子邮件地址验证吗?

时间:2011-06-02 15:47:46

标签: c# email system.net.mail

我正在尝试使用电子邮件与传真服务器软件对话。传真服务器将接受格式化的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;
        }
    }
}

4 个答案:

答案 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组成,由一个句点分隔(例如foofoo.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地址。