C# 测试大容量SMTP电子邮件发送代码的最佳方法?

C# 测试大容量SMTP电子邮件发送代码的最佳方法?,c#,email,smtp,testing,C#,Email,Smtp,Testing,我在Windows服务(C#)中编写了一个组件,负责发送有时大量的电子邮件。这些电子邮件将发送到许多域上的收件人——实际上是任何域。(是的,收件人想要电子邮件。不,我不是垃圾邮件。是的,我对CAN-SPAM感到满意。是的,我知道。)许多电子邮件是事务性的(响应用户操作生成的);有些是批量的(基本上是邮件合并) 我不想依赖外部SMTP服务器。(在其他考虑因素中,一想到必须检查邮箱中的跳转邮件并试图解析它们,我就感觉不好。) 我的设计相当简单。事务消息和批量消息都会生成并插入到DB表中。此表包含电子

我在Windows服务(C#)中编写了一个组件,负责发送有时大量的电子邮件。这些电子邮件将发送到许多域上的收件人——实际上是任何域。(是的,收件人想要电子邮件。不,我不是垃圾邮件。是的,我对CAN-SPAM感到满意。是的,我知道。)许多电子邮件是事务性的(响应用户操作生成的);有些是批量的(基本上是邮件合并)

我不想依赖外部SMTP服务器。(在其他考虑因素中,一想到必须检查邮箱中的跳转邮件并试图解析它们,我就感觉不好。)

我的设计相当简单。事务消息和批量消息都会生成并插入到DB表中。此表包含电子邮件信封和内容,以及尝试次数和日期后重试

该服务运行几个辅助线程,这些线程一次抓取20行,并循环遍历每一行。使用该库,我获取收件人域的MX记录,然后使用
System.Net.Mail.SmtpClient
同步发送电子邮件。如果对
Send()
的调用成功,我可以将电子邮件出列。如果它暂时失败,我可以增加尝试次数,并在日期之后设置适当的重试。如果它永久失败,我可以退出队列并处理失败

显然,向数百个不同的实际域发送数千封测试电子邮件是一个非常糟糕的主意。然而,我确实需要对我的多线程发送代码进行压力测试。我也不太确定模拟SMTP各种故障模式的最佳方法是什么。另外,我想确保我通过了各种垃圾邮件控制方法(灰色列表列出了与网络层最相关的内容)

我最近发现ISP在除ISP SMTP服务器以外的任何服务器上阻止与端口25的连接,这甚至加剧了我的小规模测试困难。(在生产环境中,这个东西当然会在一个适当的服务器上,端口25不会被阻塞。这无助于我在我的开发机器上进行测试。)

所以,我最好奇的两件事是:

  • 我应该如何开始测试我的代码
  • SmtpClient.Send()
    失败的方式有哪些?列举了六种例外情况
    SmtpException
    SMTPFailedRecipientSexException
    似乎是最相关的

  • 更新:指出我基本上是在创建自己的SMTP服务器。他提出了一个正确的观点,即我正在重新发明轮子,因此,以下是我不使用“实际”轮子(后缀等)的理由:

  • 电子邮件具有不同的发送优先级(尽管这与信封的
    X优先级
    )无关)。批量电子邮件的优先级较低;交易成本很高。(任何电子邮件或电子邮件组都可以进一步配置为具有任意优先级。)我需要能够暂停发送优先级较低的电子邮件,以便可以首先发送优先级较高的电子邮件。(为了实现这一点,工作线程只需在每次获得另外20个项目时从队列中拾取优先级最高的项目。)

    如果我已经向一个外部SMTP服务器提交了数千个批量邮件,那么在我希望提交的邮件现在被发送时,我无法将这些邮件搁置。粗略地说,后缀并不真正支持优先级;优先考虑信封中不符合我需要的信息

  • 我需要能够向我的用户显示blast(一组批量电子邮件)发送过程的进度。如果我只是简单地把我所有的电子邮件都交给了一个外部服务器,我不知道实际的发送过程有多远

  • 我对分析跳出消息犹豫不决,因为每个MTA的跳出消息都是不同的。Sendmail与Exchange不同于
    […]
    。另外,我应该以什么频率检查我的“反弹”收件箱?如果反弹消息本身没有传递怎么办

  • 我不太担心爆炸中途失败

    如果我们说的是灾难性的失败(应用程序终止未处理的异常、电源故障等等):由于工作线程在成功发送电子邮件时从数据库中取出每个电子邮件,我可以知道谁收到了爆炸,谁没有收到。此外,当服务在发生故障后重置时,它只会选择它在队列中停止的位置

    如果我们讨论的是本地故障(a
    SmtpException
    、DNS故障等):我只需记录故障,增加电子邮件的尝试计数器,然后稍后重试。(这基本上是SMTP规范所要求的。)在n次尝试之后,我可以永久性地使消息失败(将其出列),并记录失败以备稍后检查。通过这种方式,我可以发现我的代码没有处理的奇怪的边缘情况——即使我的代码第一次不是100%完美。(老实说,不会的。)

  • 我希望我自己的路线最终能让我比依赖外部SMTP服务器更快地发送电子邮件。如果服务器不在我的控制之下,我将不得不担心速率限制;即使是,它仍然是一个瓶颈。我所采用的多线程体系结构意味着我将并行连接到多个远程服务器,从而减少传递n条消息所需的总时间


  • 假设您有两台可用的服务器。一个是发送者,一个是接收者。您可以使用一长串假域在这两个域上设置DNS(甚至只是主机文件)。就这两台服务器而言,这些域是完全有效的,因为本地DNS服务器对它们是权威的,但就网络的其余部分而言,它们是完全无效的。只需确保解析器在DNS之前检查主机文件

    完成后,您可以让发送服务器将垃圾邮件发送到接收服务器,使其达到您的目的