使用 .net 测试 SMTP

Posted

技术标签:

【中文标题】使用 .net 测试 SMTP【英文标题】:Testing SMTP with .net 【发布时间】:2010-10-07 17:52:12 【问题描述】:

我需要配置一个 SMTP 服务器来测试我的网站,该网站发送电子邮件(用于注册确认等)。

我实际上并不希望发送电子邮件,我只是想确保我的代码是正确的。所以我希望能够检查电子邮件是否放置在队列文件夹中。

谁能推荐一个易于配置的 SMTP 服务器?

【问题讨论】:

【参考方案1】:

您可以使用 Mailnest.io,因为它是一种经济实惠且非常有效的电子邮件测试工具。它还有一个无限使用的永久免费计划。

【讨论】:

【参考方案2】:

还有Papercut,它是一个 SMTP 服务器,它将接收消息但不会将它们传送到任何地方(让您确保它们被正确发送)。收到的消息在一个小的 GUI 中可见,并且也被写入一个目录。

【讨论】:

【参考方案3】:

正如 Sean Carpenter 所说,Papercut 是一个强大的本地开发解决方案。但是,如果您还运行暂存或测试服务器,mailtrap.io 总体上可能是一个更简单的解决方案,因为您可以在开发和暂存环境中使用相同的方法。

【讨论】:

【参考方案4】:

在 .NET 中,可以将 SmtpClient 配置为通过将其放置在拾取目录中来发送电子邮件。

SmtpClient 的默认构造函数从 app.config 中获取其设置,因此对于测试环境,我们可以如下配置它。

<configuration>
    <system.net>
        <mailSettings>
            <smtp deliveryMethod="specifiedPickupDirectory">
                <specifiedPickupDirectory pickupDirectoryLocation="path to a directory" />
            </smtp>
        </mailSettings>
    </system.net>
</configuration>

MSDN 参考 - app.config mailSettings 元素 http://msdn.microsoft.com/en-us/library/w355a94k.aspx

【讨论】:

除非您使用的是 .net 4.5,否则还要小心指定网络主机,否则在处理 smtpclient 时会出现异常 - 请参阅 SmtpClient reports InvalidOperationException when disposed immediatelly after sending mail and pickup directory is used,特别是 Raymondr 的回答 @argatxa 关于使用指定PickupDirectory 元素的答案是正确的。上面说的不太对,见:msdn.microsoft.com/en-us/library/ms164241.aspx【参考方案5】:

smtp4dev 项目是另一个虚拟 SMTP 服务器。我喜欢它,因为它有一个漂亮、简单的 UI,可以记录消息并让您查看最近消息的内容。使用 C# 编写,带有 MSI 安装程序。源代码可用。

【讨论】:

我也喜欢这个。投票! 链接里的release已经没有了,所以用这个裸链接:smtp4dev.codeplex.com 谢谢,@Csaba Toth,我不记得为什么要链接到特定版本,所以我已更改为项目主页。 漂亮而简单的控制台应用程序。如果您需要一个 eml 查看器(并且尚未安装)...这是一个不错的伴侣:sourceforge.net/projects/mbox-viewer/?source=typ_redirect【参考方案6】:

另一种方法是围绕 SmtpClient 创建一个实现相同接口的包装器。然后在你的类中注入并使用包装器。在进行单元测试时,您可以替换一个对方法调用和响应有期望的模拟包装器。

编辑:需要包装器(至少对于 RhinoMocks),因为 SmtpClient 不是从接口派生的,也没有虚拟方法。如果你使用可以直接模拟没有虚拟方法的类的模拟框架,则可以跳过包装器并直接注入 SmtpClient 模拟。

public class SmtpClientWrapper

    private SmtpClient Client  get; set; 

    public SmtpClientWrapper( SmtpClient client )
    
         this.Client = client;
    

    public virtual void Send( MailMessage msg )
    
         this.Client.Send( msg );
    

    ...



public class MyClass

    private SmtpClientWrapper Client  get; set; 

    public MyClass( SmtpClientWrapper client )
    
         this.Client = client;
    

    public void DoSomethingAndNotify()
    
         ...
         this.Client.Send( msg );
    

测试(使用 RhinoMocks)为:

public void DoSomethingAndNotifySendsAMessageTest()

     SmtpClientWrapper client = MockRepository.GenerateMock<SmtpClientWrapper>();
     client.Expect( c => c.Send( new MailMessage() ) ).IgnoreArguments();

     MyClass klass = new MyClass( client );

     klass.DoSomethingAndNotify();

     client.VerifyAllExpectations();

【讨论】:

我知道这是一个旧答案,但我想指出这是一个好主意,但提供的代码并不能反映您的意思。包装器没有实现接口,也没有要覆盖的虚拟方法。就个人而言,我更喜欢使用界面。所以这个类应该实现 ISmtpClientWrapper ,然后应该用一种 ISmtpClientWrapper 生成模拟来实现你所需要的。总而言之,我同意你的建议。这样做而不是设置一个虚假的 SMTP 服务器,可以确保任何人都可以获取您的测试并运行它们而无需额外配置。 @jlafay - 我在类签名的意义上使用了 interface 这个词,没有具体定义。当只有包装类会实现它时,我不确定是否值得创建一个实际的接口。 是的,但是您必须能够使用接口或虚拟方法将实际实现存根。看起来您在几个小时前编辑了您的帖子并将发送方法更改为虚拟,所以我认为可以这样做。这就是我提到这两种解决方案的原因。正如我所说,我更喜欢界面,无论如何它们都很轻。【参考方案7】:

如果你已经安装了 Python,你可以运行下面的代码来在控制台中运行一个调试 smtp 服务器,它将消息转储到标准输出:

sudo python -m smtpd -n -c DebuggingServer localhost:25

从这里截取: http://muffinresearch.co.uk/archives/2010/10/15/fake-smtp-server-with-python/

【讨论】:

【参考方案8】:

我使用Antix SMTP Server For Developers,就像打开应用程序一样简单。它将消息存储在一个文件夹中,您可以使用 UI 查看它们。非常快速/简单的解决方案。我想在这里提一下。

另见:development smtp server for windows

【讨论】:

【参考方案9】:

我找到了这个 - http://improve.dk/archive/2010/07/01/papercut-vs-smtp4dev-testing-mail-sending-locally.aspx,它解释了如何使用 papercut 和 smtp4dev 这两个很好的工具

【讨论】:

【参考方案10】:

根据许多其他建议,我使用了很多免费工具:http://www.toolheap.com/test-mail-server-tool/

不是真正用于 TDD,但在手动测试中很有用,因为它可以在每封要发送的电子邮件中弹出一个 Outlook Express 窗口。

【讨论】:

【参考方案11】:

请注意,tvanfosson 提出的 SmtpClientWrapper 类需要在其 Send 方法的声明中使用最重要的“virtual”关键字,否则您将回到尝试直接模拟 SmtpClient 的同一条船上。

【讨论】:

应该是评论,而不是答案。【参考方案12】:

我认为博文 A Simple SMTP Server Mock for .NET 为您提供了您所需要的:一个 SMTP 服务器模拟

SMTP 服务器模拟基本上是假的 可用于本机的 SMTP 服务器 测试发送的应用程序 电子邮件。

此外,google search for smtp mock server 将为您提供用于测试目的的 SMTP 服务器选择。喜欢:

Dumbster - Java 伪造的 SMTP 服务器 nDumbster - Dumbster 的 .NET 端口

【讨论】:

Dumbster 让您的单元测试启动 SMTP 服务,测试一些发送代码,然后断言发送了多少封电子邮件,它们的内容是什么,等等。 nDumpster 似乎没有维护,而且速度很慢,因此不太适合单元测试。见blogs.blackmarble.co.uk/blogs/rfennell/archive/2008/09/27/…。【参考方案13】:

您也可以使用 netDumbster。

http://netdumbster.codeplex.com/

【讨论】:

【参考方案14】:

对于 .NET 人来说。保持简单。

我们正在调查这个问题,然后其中一位开发人员想起了一个允许您覆盖电子邮件发送方式的配置设置。

这将为每封电子邮件创建一个文件,然后不理会它。

<system.net>
    <mailSettings>
      <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="\\SharedFolder\MailDrop\" />
      </smtp>      
    </mailSettings>
  </system.net>

【讨论】:

【参考方案15】:

如果你使用的是 Mac OS X,你可以使用MockSMTP.app

【讨论】:

【参考方案16】:

还有我自己的http://ssfd.codeplex.com/,它是一个开源 SMTP 模拟器。 接收电子邮件并将其放入可以通过任务图标访问的文件夹中

【讨论】:

【参考方案17】:

DevNull SMTP server 记录有关客户端和 SMTP 服务器之间通信的所有血腥细节。如果您尝试诊断发送代码不起作用的原因,它看起来会很有用。

它是用 Java 编写的,并作为可执行 jar 部署。源代码似乎不可用。

【讨论】:

以上是关于使用 .net 测试 SMTP的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab smtp 测试失败

如何使用 GMail 的 SMTP 服务器从 ASP.NET 站点发送电子邮件? [复制]

smtp测试出现smtp error

Python 2.7测试是否发送了SMTP邮件

smtp邮件测试

可用于测试和开发的本地 SMTP 服务器 - 实际上不会传递邮件 [关闭]