C# 测试大容量SMTP电子邮件发送代码的最佳方法?
我在Windows服务(C#)中编写了一个组件,负责发送有时大量的电子邮件。这些电子邮件将发送到许多域上的收件人——实际上是任何域。(是的,收件人想要电子邮件。不,我不是垃圾邮件。是的,我对CAN-SPAM感到满意。是的,我知道。)许多电子邮件是事务性的(响应用户操作生成的);有些是批量的(基本上是邮件合并) 我不想依赖外部SMTP服务器。(在其他考虑因素中,一想到必须检查邮箱中的跳转邮件并试图解析它们,我就感觉不好。) 我的设计相当简单。事务消息和批量消息都会生成并插入到DB表中。此表包含电子邮件信封和内容,以及尝试次数和日期后重试 该服务运行几个辅助线程,这些线程一次抓取20行,并循环遍历每一行。使用该库,我获取收件人域的MX记录,然后使用C# 测试大容量SMTP电子邮件发送代码的最佳方法?,c#,email,smtp,testing,C#,Email,Smtp,Testing,我在Windows服务(C#)中编写了一个组件,负责发送有时大量的电子邮件。这些电子邮件将发送到许多域上的收件人——实际上是任何域。(是的,收件人想要电子邮件。不,我不是垃圾邮件。是的,我对CAN-SPAM感到满意。是的,我知道。)许多电子邮件是事务性的(响应用户操作生成的);有些是批量的(基本上是邮件合并) 我不想依赖外部SMTP服务器。(在其他考虑因素中,一想到必须检查邮箱中的跳转邮件并试图解析它们,我就感觉不好。) 我的设计相当简单。事务消息和批量消息都会生成并插入到DB表中。此表包含电子
System.Net.Mail.SmtpClient
同步发送电子邮件。如果对Send()
的调用成功,我可以将电子邮件出列。如果它暂时失败,我可以增加尝试次数,并在日期之后设置适当的重试。如果它永久失败,我可以退出队列并处理失败
显然,向数百个不同的实际域发送数千封测试电子邮件是一个非常糟糕的主意。然而,我确实需要对我的多线程发送代码进行压力测试。我也不太确定模拟SMTP各种故障模式的最佳方法是什么。另外,我想确保我通过了各种垃圾邮件控制方法(灰色列表列出了与网络层最相关的内容)
我最近发现ISP在除ISP SMTP服务器以外的任何服务器上阻止与端口25的连接,这甚至加剧了我的小规模测试困难。(在生产环境中,这个东西当然会在一个适当的服务器上,端口25不会被阻塞。这无助于我在我的开发机器上进行测试。)
所以,我最好奇的两件事是:
SmtpClient.Send()
失败的方式有哪些?列举了六种例外情况SmtpException
和SMTPFailedRecipientSexException
似乎是最相关的更新:指出我基本上是在创建自己的SMTP服务器。他提出了一个正确的观点,即我正在重新发明轮子,因此,以下是我不使用“实际”轮子(后缀等)的理由:
X优先级
)无关)。批量电子邮件的优先级较低;交易成本很高。(任何电子邮件或电子邮件组都可以进一步配置为具有任意优先级。)我需要能够暂停发送优先级较低的电子邮件,以便可以首先发送优先级较高的电子邮件。(为了实现这一点,工作线程只需在每次获得另外20个项目时从队列中拾取优先级最高的项目。)
如果我已经向一个外部SMTP服务器提交了数千个批量邮件,那么在我希望提交的邮件现在被发送时,我无法将这些邮件搁置。粗略地说,后缀并不真正支持优先级;优先考虑信封中不符合我需要的信息[…]
。另外,我应该以什么频率检查我的“反弹”收件箱?如果反弹消息本身没有传递怎么办SmtpException
、DNS故障等):我只需记录故障,增加电子邮件的尝试计数器,然后稍后重试。(这基本上是SMTP规范所要求的。)在n次尝试之后,我可以永久性地使消息失败(将其出列),并记录失败以备稍后检查。通过这种方式,我可以发现我的代码没有处理的奇怪的边缘情况——即使我的代码第一次不是100%完美。(老实说,不会的。)假设您有两台可用的服务器。一个是发送者,一个是接收者。您可以使用一长串假域在这两个域上设置DNS(甚至只是主机文件)。就这两台服务器而言,这些域是完全有效的,因为本地DNS服务器对它们是权威的,但就网络的其余部分而言,它们是完全无效的。只需确保解析器在DNS之前检查主机文件 完成后,您可以让发送服务器将垃圾邮件发送到接收服务器,使其达到您的目的