gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 18:28:02 25 4
gpt4 key购买 nike

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

最佳答案

不,您不能关闭该验证。

编辑:

稍微研究一下后,似乎以下代码片段是一个可行的解决方法:

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 属性编写,并且该属性返回 user + @ + domain.

关于c# - 我可以关闭 System.Net.Mail 中的电子邮件地址验证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6216893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com