使用.net测试SMTP

ias*_*ons 53 .net testing smtp

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

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

任何人都可以推荐一个易于配置的SMTP服务器吗?

Sea*_*ter 41

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

  • Papercut已从上面的URL转移到Codeplex:http://papercut.codeplex.com/ (4认同)

Lac*_*che 29

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

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

<configuration>
    <system.net>
        <mailSettings>
            <smtp deliveryMethod="specifiedPickupDirectory">
                <specifiedPickupDirectory pickupDirectoryLocation="path to a directory" />
            </smtp>
        </mailSettings>
    </system.net>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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


Don*_*kby 20

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


arg*_*txa 8

对于那里的.NET人员.保持简单.

我们正在研究这个,然后其中一个开发人员记得有关配置设置,它允许您覆盖电子邮件的发送方式.

这将为每封电子邮件创建一个文件而不管它.

<system.net>
    <mailSettings>
      <smtp deliveryMethod="SpecifiedPickupDirectory">
        <specifiedPickupDirectory pickupDirectoryLocation="\\SharedFolder\MailDrop\" />
      </smtp>      
    </mailSettings>
  </system.net>
Run Code Online (Sandbox Code Playgroud)


f3l*_*lix 7

我认为博客文章A Simple SMTP Server Mock for .NET可以 为您提供所需内容:SMTP服务器模拟

SMTP服务器模拟基本上是一个虚假的SMTP服务器,可用于发送电子邮件的应用程序的单元测试.

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


tva*_*son 5

另一种方法是在 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 );
    }
}
Run Code Online (Sandbox Code Playgroud)

测试(使用 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();
}
Run Code Online (Sandbox Code Playgroud)

  • 我知道这是一个旧答案,但我想指出这是一个好主意,但提供的代码并不反映您所说的内容。包装器不实现接口或具有要重写的虚拟方法。就我个人而言,我更喜欢使用界面。因此,此类应该实现 ISmtpClientWrapper,然后应该使用 ISmtpClientWrapper 类型生成模拟来实现您所需要的。总而言之,我非常同意你的建议。这样做而不是设置一个假的 SMTP 服务器,可以确保任何人都可以获取您的测试并运行它们,而无需额外的配置。 (3认同)