57

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

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

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

4

17 回答 17

41

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

于 2009-02-15T14:00:11.793 回答
32

在 .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

于 2010-02-18T14:39:23.893 回答
21

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

于 2009-11-02T22:44:32.113 回答
9

对于那里的 .NET 家伙。保持简单。

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

这将为每封电子邮件创建一个文件并保持不变。

<system.net>
    <mailSettings>
      <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="\\SharedFolder\MailDrop\" />
      </smtp>      
    </mailSettings>
  </system.net>
于 2010-02-18T15:44:53.213 回答
7

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

SMTP 服务器模拟基本上是一个伪造的 SMTP 服务器,可用于对发送电子邮件的应用程序进行单元测试。

此外,谷歌搜索 smtp 模拟服务器将为您提供用于测试目的的 SMTP 服务器选择。喜欢:

于 2009-02-15T13:53:36.457 回答
4

另一种方法是围绕实现相同接口的 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();
}
于 2009-02-15T13:57:50.287 回答
3

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

另请参阅:windows 的开发 smtp 服务器

于 2011-11-07T01:37:39.313 回答
3

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

于 2011-07-22T07:50:58.713 回答
2

如果您在 Mac OS X 上,您可以使用MockSMTP.app

于 2010-01-19T06:26:22.343 回答
2

DevNull SMTP 服务器记录有关客户端和 SMTP 服务器之间通信的所有详细信息。如果您试图诊断为什么您的发送代码不起作用,它看起来会很有用。

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

于 2009-11-02T22:40:42.897 回答
2

您也可以使用 netDumbster。

http://netdumbster.codeplex.com/

于 2010-05-18T08:13:42.737 回答
1

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

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

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

于 2012-05-31T14:52:19.820 回答
0

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

于 2010-12-01T04:39:43.607 回答
0

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

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

于 2011-07-16T13:06:48.163 回答
0

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

于 2009-11-03T08:49:36.700 回答
0

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

于 2015-07-03T13:39:02.957 回答
0

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

于 2020-08-10T10:48:41.827 回答