C# System.Net.Mail是否创建无效电子邮件和eml文件?在主机名中插入额外的点

C# System.Net.Mail是否创建无效电子邮件和eml文件?在主机名中插入额外的点,c#,.net,email,smtpclient,C#,.net,Email,Smtpclient,如果.NET的SmtpClient在MIME编码行的开头出现一个点(例如test.com有时显示为test..com),那么它似乎正在创建主机名中带有一个额外点的电子邮件。示例代码: [TestMethod] public void TestEmailIssue() { var mail = new System.Net.Mail.MailMessage(); var smtpClient = new System.Net.Mail.SmtpClient(); mail

如果.NET的SmtpClient在MIME编码行的开头出现一个点(例如test.com有时显示为test..com),那么它似乎正在创建主机名中带有一个额外点的电子邮件。示例代码:

[TestMethod]
public void TestEmailIssue()
{
    var mail = new System.Net.Mail.MailMessage();
    var smtpClient = new System.Net.Mail.SmtpClient();

    mail.To.Add("Test@test.com");
    mail.Subject = "Test";
    mail.From = new System.Net.Mail.MailAddress("test@test.com");
    mail.Body = "Hello this is  a short test of the issue:"
             +" <a href='https://test.com/'>https://test.com/</a>: ";

    smtpClient.PickupDirectoryLocation = "C:\\temp\\";
    smtpClient.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.SpecifiedPickupDirectory;
    smtpClient.Send(mail);
}
[TestMethod]
公开发行
{
var mail=new System.Net.mail.MailMessage();
var smtpClient=new System.Net.Mail.smtpClient();
mail.To.Add(“Test@test.com");
mail.Subject=“Test”;
mail.From=新系统.Net.mail.MailAddress(“test@test.com");
mail.Body=“您好,这是对问题的简短测试:”
+" : ";
smtpClient.PickupDirectoryLocation=“C:\\temp\\”;
smtpClient.DeliveryMethod=System.Net.Mail.SmtpDeliveryMethod.SpecifiedPickupDirectory;
发送(邮件);
}
这将创建一个.eml文件,如下所示:

X-Sender:test@test.com

X接收器:Test@test.com

MIME版本:1.0

发件人:test@test.com

致:Test@test.com

日期:2011年7月6日15:55:28-0400

主题:测试

内容类型:文本/纯文本;字符集=美国ascii码

内容传输编码:引用可打印

您好这是对问题的简短测试:https://test=

…com/'>:=20

发送文件或在Outlook(或任何其他程序)中打开时,双点显示(即test..com)。请注意,如果我删除额外的空格(在“is a”中),test.com将正确显示,因为点不再出现在行的开头

这会在尝试发送网站地址时引发问题,我们会接到客户的电话,说他们无法单击我们的链接

还有其他人经历过吗?除了编写自己的编码,我们如何解决这个问题?

在.Net 2.0中

X-Sender: test@test.com
X-Receiver: Test@test.com
MIME-Version: 1.0
From: test@test.com
To: Test@test.com
Date: 6 Jul 2011 21:29:04 +0100
Subject: Test
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

Hello this is  a short test of the issue: <a href=3D'https://test.com/'>https://test.com/</a>:=
X-Sender:test@test.com
X接收器:Test@test.com
MIME版本:1.0
发件人:test@test.com
致:Test@test.com
日期:2011年7月6日21:29:04+0100
主题:测试
内容类型:文本/纯文本;字符集=美国ascii码
内容传输编码:引用可打印
您好,这是对问题的简短测试::=
它看起来像是以每行特定字符长度包装文本。我模模糊糊地记得.NET2.0中有一个问题,默认情况下它不这样做,这可能会导致垃圾邮件过滤器出现问题

事实上,在.Net 4.0中,增加消息的大小会产生以下结果:

X-Sender: test@test.com
X-Receiver: Test@test.com
MIME-Version: 1.0
From: test@test.com
To: Test@test.com
Date: 6 Jul 2011 21:34:21 +0100
Subject: Test
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

Hello this is  a short test of the sssssssssssssssssissue: <a hre=
f=3D'https://test.com/'>https://test.com/</a>:=20
X-Sender:test@test.com
X接收器:Test@test.com
MIME版本:1.0
发件人:test@test.com
致:Test@test.com
日期:2011年7月6日21:34:21+0100
主题:测试
内容类型:文本/纯文本;字符集=美国ascii码
内容传输编码:引用可打印
您好这是对SSS问题的简短测试:https://test.com/:=20
看起来像个虫子

解决方法可能是将BodyEncoding更改为ASCII以外的格式。

这实际上是根据(4.5.2透明度)

在发送一行邮件文本之前,SMTP客户端将检查该行的第一个字符。如果是句点,则在行首插入一个额外的句点

Net只是将文件存储在“准备传输”模式中,这意味着它不必在发送前与电子邮件进行混搭,而是可以按原样传输。不幸的是,这种格式显然与Outlook Express的EML格式不完全相同。您应该能够将编码设置为UTF-8(或类似的东西),这将为您引入Base-64编码

mail.BodyEncoding = System.Text.Encoding.UTF8;

查看.NET 4源代码,您所经历的可能与MailWriter.WriteAndFold方法有关。在MailWriter类中还有

static int writerDefaultLineLength = 76

变量,表示每行的字符数。可能是因为您删除了一个额外的空格字符,它开始工作。

我们就是这么想的!不幸的是,在我们向更大的客户群推广之前的一周,它才出现。我希望有一个简单的解决方法。我现在还不知道。一个丑陋的修复方法是打开并解析每个输出的文件,查找并修复这些错误。是的,这种额外的“意外”是有原因的。这是SmtpClient和Smtp服务器之间的Wireshark跟踪中的一行:“354输入消息,以“.”在一行上结束“Smtp服务器似乎将其用作消息结束的指示器Yep,这就是我们更改编码的原因。+1用于比较.Net 2.0和.Net 4.0以确定问题是否有方法读取这些eml文件并正确解码此编码?(我想为测试环境创建一个显示所有电子邮件的仪表板)使用内置的MS类以本机方式?可能不是,存储格式只是.Net和IIS/Exchange可能同意的一种内部表示形式。据我所知,这方面没有官方规范。你肯定可以推出自己的,有更多的关于这样做的图书馆。