传送到分拣目录时的.NET 4.5 SMTP客户端点填充问题

时间:2014-10-24 20:37:38

标签: c# smtp smtpclient mailmessage

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

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

当我致电client.Send()时,我已经能够将其缩小到确切的行。如果我在发送之前检查邮件正文,则表明URL已正确形成。在我调用消息正文后检查消息正文,URL中存在..

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

  1. 使用SmtpDeliveryMethod.SpecifiedPickupDirectory时,是否有其他人遇到点填充问题?
  2. 要正确处理这件事是谁的工作? .NET SMTP或辅助服务,以便在以后选择此消息并将其发送到最终目的地?
  3. 关于如何解决此问题的任何建议?
  4. 我之前尝试过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);
    }
    

2 个答案:

答案 0 :(得分:3)

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

如果保存到文件时SmtpClient是字节填充,那就是非常破坏的行为。

如果您使用System.Net.Mail(我假设您是),则无法解决此问题,我建议您使用MimeKit创建消息并将其保存到文件中。

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

答案 1 :(得分:0)

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

当将邮件正文传递到SMTP服务器时,邮件客户端应该进行点填充。

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

中继SMTP服务器应该在接收方“取消填充”,在发送方“重新填充”。因此,传递给SMTP服务器的任何东西都必须已经塞满才能使整个“点填充”概念正常工作!