【发布时间】:2010-10-07 17:52:12
【问题描述】:
我需要配置一个 SMTP 服务器来测试我的网站,该网站发送电子邮件(用于注册确认等)。
我实际上并不希望发送电子邮件,我只是想确保我的代码是正确的。所以我希望能够检查电子邮件是否放置在队列文件夹中。
谁能推荐一个易于配置的 SMTP 服务器?
【问题讨论】:
我需要配置一个 SMTP 服务器来测试我的网站,该网站发送电子邮件(用于注册确认等)。
我实际上并不希望发送电子邮件,我只是想确保我的代码是正确的。所以我希望能够检查电子邮件是否放置在队列文件夹中。
谁能推荐一个易于配置的 SMTP 服务器?
【问题讨论】:
您可以使用 Mailnest.io,因为它是一种经济实惠且非常有效的电子邮件测试工具。它还有一个无限使用的永久免费计划。
【讨论】:
还有Papercut,它是一个 SMTP 服务器,它将接收消息但不会将它们传送到任何地方(让您确保它们被正确发送)。收到的消息在一个小的 GUI 中可见,并且也被写入一个目录。
【讨论】:
正如 Sean Carpenter 所说,Papercut 是一个强大的本地开发解决方案。但是,如果您还运行暂存或测试服务器,mailtrap.io 总体上可能是一个更简单的解决方案,因为您可以在开发和暂存环境中使用相同的方法。
【讨论】:
在 .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
【讨论】:
smtp4dev 项目是另一个虚拟 SMTP 服务器。我喜欢它,因为它有一个漂亮、简单的 UI,可以记录消息并让您查看最近消息的内容。使用 C# 编写,带有 MSI 安装程序。源代码可用。
【讨论】:
另一种方法是围绕 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();
}
【讨论】:
如果你已经安装了 Python,你可以运行下面的代码来在控制台中运行一个调试 smtp 服务器,它将消息转储到标准输出:
sudo python -m smtpd -n -c DebuggingServer localhost:25
从这里截取: http://muffinresearch.co.uk/archives/2010/10/15/fake-smtp-server-with-python/
【讨论】:
我使用Antix SMTP Server For Developers,就像打开应用程序一样简单。它将消息存储在一个文件夹中,您可以使用 UI 查看它们。非常快速/简单的解决方案。我想在这里提一下。
【讨论】:
我找到了这个 - http://improve.dk/archive/2010/07/01/papercut-vs-smtp4dev-testing-mail-sending-locally.aspx,它解释了如何使用 papercut 和 smtp4dev 这两个很好的工具
【讨论】:
根据许多其他建议,我使用了很多免费工具:http://www.toolheap.com/test-mail-server-tool/
不是真正用于 TDD,但在手动测试中很有用,因为它可以在每封要发送的电子邮件中弹出一个 Outlook Express 窗口。
【讨论】:
请注意,tvanfosson 提出的 SmtpClientWrapper 类需要在其 Send 方法的声明中使用最重要的“virtual”关键字,否则您将回到尝试直接模拟 SmtpClient 的同一条船上。
【讨论】:
我认为博文 A Simple SMTP Server Mock for .NET 为您提供了您所需要的:一个 SMTP 服务器模拟
SMTP 服务器模拟基本上是假的 可用于本机的 SMTP 服务器 测试发送的应用程序 电子邮件。
此外,google search for smtp mock server 将为您提供用于测试目的的 SMTP 服务器选择。喜欢:
【讨论】:
您也可以使用 netDumbster。
【讨论】:
对于 .NET 人来说。保持简单。
我们正在调查这个问题,然后其中一位开发人员想起了一个允许您覆盖电子邮件发送方式的配置设置。
这将为每封电子邮件创建一个文件,然后不理会它。
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="\\SharedFolder\MailDrop\" />
</smtp>
</mailSettings>
</system.net>
【讨论】:
如果你使用的是 Mac OS X,你可以使用MockSMTP.app
【讨论】:
还有我自己的http://ssfd.codeplex.com/,它是一个开源 SMTP 模拟器。 接收电子邮件并将其放入可以通过任务图标访问的文件夹中
【讨论】:
DevNull SMTP server 记录有关客户端和 SMTP 服务器之间通信的所有血腥细节。如果您尝试诊断发送代码不起作用的原因,它看起来会很有用。
它是用 Java 编写的,并作为可执行 jar 部署。源代码似乎不可用。
【讨论】: