.NET 4.5 SMTP 客户端点填充问题,当传送到取件目录时

Posted

技术标签:

【中文标题】.NET 4.5 SMTP 客户端点填充问题,当传送到取件目录时【英文标题】:.NET 4.5 SMTP Client Dot Stuffing Issue when Delivering to Pickup Directory 【发布时间】:2014-12-20 18:17:27 【问题描述】:

希望有人能够帮助解决这个问题,我一直在四处寻找,但似乎无法在任何地方找到答案。

我正在创建一封邮件,使用该邮件将被传递到指定的取件目录,此代码过去已被多次使用,没有问题。现在,当我检查生成的文件,更具体地说是 eml 文件中的 URL 时,我可以看到中间有一个双 .。根据我一直在阅读的内容,我知道如果消息中一行的第一个字符以. 开头,这是 SMTP 协议的一部分。该文件稍后将被另一个服务接收,该服务最终将执行电子邮件的发送。

当我调用client.Send() 时,我已经能够将范围缩小到确切的行。如果我在发送之前检查消息正文,则 URL 格式正确。调用后检查消息正文,URL 中有..

我的问题或我想的问题如下:

    有其他人在使用SmtpDeliveryMethod.SpecifiedPickupDirectory 时遇到点填充问题吗? 正确处理这个问题是谁的工作? .NET SMTP 或辅助服务在以后接收此消息并将其发送到最终目的地? 关于如何解决此问题的任何建议?

我之前尝试过approach described here,但它失败了,有很多例外。

我主要是在寻找一种方法来将此 eml 文件保存到磁盘上的某个位置,以便稍后将其备份并发送,我对 C# 的了解仍然相当有限,所以可能有一些简单的东西我只是在寻找,所以任何建议或指导将不胜感激!

我创建了一小段代码来尝试重新创建问题,这不是我正在使用的确切内容,但它确实表明通过 client.Send() 方法发送后,有 2 '..' 在字符串的开头。

using (var client = new SmtpClient())

client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
client.PickupDirectoryLocation = @"C:\temp";
var message = new MailMessage();
message.To.Add(new MailAddress("alice@a.com"));
message.From = new MailAddress("bob@b.com");
message.Subject = "Smtp Dot Stuffing Test";
message.Body = ".A.B.C..... .0.1.2.3.4.5.6.7.8.9";
client.Send(message);

【问题讨论】:

你能给我们看一些相关的代码吗? @Dawnkeeper 我刚刚添加了一小段示例代码来演示这个问题 【参考方案1】:

实际上,“已接受”的答案可能对原始问题有所帮助 - 因为它建议了一个替代库,但分析/解释并不准确。

邮件客户端在将邮件正文传递给 SMTP 服务器时应该做点填充。

“pickup”目录不是您“保存”邮件的地方,它是 SMTP 服务器要“提取”的 HAND OVER 邮件的地方。它是使用端口 25 连接将同一消息移交给 SMTP 服务器的替代方法。

中继 SMTP 服务器应该在接收端“取消填充”,在发送端“重新填充”。因此,为了使整个“点填充”概念起作用,必须已经填充了任何传递给 SMTP 服务器的内容!

【讨论】:

【参考方案2】:

保存到文件时,SmtpClient 不应填充字节。只有在实际将消息流“上传”到 SMTP 服务器时才需要这样做,以防止过早结束 DATA 命令(该命令以以下行结束:“.\r\n”)。

如果 SmtpClient 在保存到文件时是字节填充,这是非常糟糕的行为。

如果您使用 System.Net.Mail(我假设您是),这是不可能解决的问题,我可能会建议您使用 MimeKit 创建邮件并将其保存到文件中。

然后,如果您需要重新解析邮件并通过 SMTP 发送,您可以使用MailKit 来执行此操作。

【讨论】:

是的,我正在使用 System.Net.Mail,所以听起来好像是那里出了问题。至少我没有做任何明显错误的事情,我会试试你的建议,看看我的进展如何。感谢您的建议 试一试,一旦我调用了 MimeKits 的“WriteTo()”方法并检查了生成的 eml 文件,它的格式都很好。感谢您提供有关 Mimekit 的提示,非常有用的库!

以上是关于.NET 4.5 SMTP 客户端点填充问题,当传送到取件目录时的主要内容,如果未能解决你的问题,请参考以下文章

ASP.Net 4.5 Twitter 引导和客户端验证

ASP.NET Core Web API 接口限流

使用 .NET core 2.2 中的 MailKit SMTP 客户端通过 Gmail SMTP 发送邮件对我不起作用

Golang中smtp客户端的自定义拨号器?

为啥 .Net 4.0 构建客户端 DataContracts 会导致 .Net 4.5 应用程序中的 MethodAccessException?

.NET 4.5 中的 Websocket