2009-02-15 19 views
51

Ich muss einen SMTP-Server für das Testen meiner Website konfigurieren, die E-Mails sendet (für Registrierungsbestätigung usw.).Testen von SMTP mit .net

Ich möchte nicht wirklich die E-Mail gesendet werden, ich möchte nur sicherstellen, dass mein Code korrekt ist. Ich möchte also überprüfen können, dass die E-Mail beispielsweise in einem Warteschlangenordner abgelegt ist.

Kann jemand einen SMTP-Server empfehlen, der einfach zu konfigurieren ist?

Antwort

7

ich glaube, die Blog-Post A Simple SMTP Server Mock for .NET gibt Ihnen, was Sie brauchen: ein SMTP-Server mock

Ein SMTP-Server Mock ist im Grunde ein gefälschter SMTP-Server, die für die Einheit Testen von Anwendungen verwendet werden können, die senden E-Mail-Nachrichten.

Außerdem wird Ihnen eine google search for smtp mock server eine Auswahl von SMTP-Servern zu Testzwecken zur Verfügung stellen. Wie:

+0

Mit Dumbster können Sie mit dem Gerätetest den SMTP-Dienst starten, einen bestimmten Sendecode testen und dann Aussagen darüber machen, wie viele E-Mails gesendet wurden, was deren Inhalt waren und so weiter. –

+0

nDumpster scheint nicht gewartet zu werden und ist sehr langsam, also nicht wirklich für Komponententests geeignet. Siehe http://blogs.blackmarble.co.uk/blogs/rfennell/archive/2008/09/27/mocking-out-an-email-server.aspx. –

4

Eine alternative Möglichkeit, dies zu tun, ist einen Wrapper um die SmtpClient zu erstellen, die die gleiche Schnittstelle implementiert. Dann injiziere und benutze den Wrapper in deiner Klasse. Wenn Sie Komponententests durchführen, können Sie einen falschen Wrapper ersetzen, der Erwartungen für die Methodenaufrufe und -antworten hat.

BEARBEITEN: Der Wrapper wird benötigt (zumindest für RhinoMocks), weil SmtpClient nicht von einer Schnittstelle abgeleitet ist und keine virtuellen Methoden hat. Wenn Sie ein Mock-Framework verwenden, das eine Klasse ohne virtuelle Methoden direkt vortäuschen kann, können Sie den Wrapper überspringen und den SmtpClient-Mock direkt injizieren.

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); 
    } 
} 

getestet (mit RhinoMocks) als:

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(); 
} 
+2

Ich weiß, dies ist eine alte Antwort, aber ich möchte darauf hinweisen, dass dies eine gute Idee ist, aber der angegebene Code spiegelt nicht, was Sie sagen. Der Wrapper implementiert keine Schnittstelle oder verfügt über virtuelle Methoden zum Überschreiben. Persönlich bevorzuge ich eine Schnittstelle. Also sollte diese Klasse ISmtpClientWrapper implementieren und dann sollten Mocks mit einem Typ von ISmtpClientWrapper generiert werden, um zu erreichen, was Sie brauchen. Alles in allem stimme ich Ihrer Empfehlung zu. Dies zu tun, anstatt einen gefälschten SMTP-Server einzurichten, stellt sicher, dass jeder Ihre Tests erhalten und ohne zusätzliche Konfiguration ausführen kann. – jlafay

+0

@jlafay - Ich habe das Wort * interface * im Sinne der Klassensignatur verwendet, nicht speziell definiert. Ich bin nicht sicher, dass es sich lohnt, eine tatsächliche Schnittstelle zu erstellen, wenn nur die Wrapper-Klasse es implementieren wird. – tvanfosson

+0

richtig, aber Sie müssen in der Lage sein, die tatsächliche Implementierung mit einer Schnittstelle oder virtuellen Methoden auszugeben. Sieht so aus, als hättest du deinen Post vor ein paar Stunden bearbeitet und die Sendemethode auf virtuell geändert, also denke ich, dass es das tun würde. Deshalb habe ich beide Lösungen erwähnt. Wie gesagt, ich bevorzuge eine Schnittstelle, sie sind sowieso ziemlich leicht. – jlafay

41

Es auch ist Papercut, die einen SMTP-Server, die Nachrichten empfangen werden, aber sie überall nicht liefern (so dass Sie sicher, dass sie machen richtig gesendet werden) . Die empfangenen Nachrichten sind in einer kleinen GUI sichtbar und werden auch in ein Verzeichnis geschrieben.

+3

Papercut hat sich von der obigen URL zu Codeplex verschoben: http://papercut.codeplex.com/ – Drarok

+0

Ich habe den Link @Drarok aktualisiert. –

2

Die DevNull SMTP server protokolliert alle wichtigen Details über die Kommunikation zwischen dem Client und dem SMTP-Server. Sieht so aus, als wäre es nützlich, wenn Sie herausfinden wollten, warum Ihr Sendecode nicht funktioniert.

Es ist in Java geschrieben und wird als ausführbares jar bereitgestellt. Der Quellcode scheint nicht verfügbar zu sein.

19

Das Projekt smtp4dev ist ein weiterer Dummy-SMTP-Server. Ich mag es, weil es eine nette, einfache Benutzeroberfläche hat, die die Nachrichten protokolliert und Sie den Inhalt der letzten Nachrichten anzeigen lässt. In C# mit einem MSI-Installer geschrieben. Quellcode ist verfügbar.

+0

Ich mag dieses auch. Up Abstimmung! – granadaCoder

+0

Die Veröffentlichung in den Link ist nicht mehr da, so verwenden Sie diese nackten Link: http://smtp4dev.codeplex.com/ –

+0

Danke, @Csaba Toth, ich kann mich nicht erinnern, warum ich mit einer bestimmten Version verknüpft, also ich habe auf die Projekt-Homepage gewechselt. –

0

gibt es auch meine eigene http://ssfd.codeplex.com/, die ein Open-Source-SMTP-Emulator ist. E-Mail erhält und legt sie in einem Ordner, die von einer Task-Symbol zugegriffen werden kann

27

In .NET SmtpClient E-Mail senden können verwenden werden konfiguriert, indem Platzieren Sie es in einem Pickup-Verzeichnis.

Der Standardkonstruktor von SmtpClient nimmt seine Einstellungen aus app.config, so dass wir ihn für eine Testumgebung wie folgt konfigurieren können.

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

MSDN Referenz - app.config mailsettings Element http://msdn.microsoft.com/en-us/library/w355a94k.aspx

+0

Es sei denn, Sie sind auf .net 4.5 Geben Sie auch einen Netzwerkhost an, oder Sie erhalten eine Ausnahme, wenn Sie den smtpclient entsor- gen - siehe [SmtpClient reports InvalidOperationException, wenn sie sofort nach dem Senden von E-Mails und Pickup-Verzeichniss verworfen wird] (http://connect.microsoft.com/VisualStudio/feedback/details/539160/smtpclient-reports-invalidoperationexception-when-disponierte-sofort-nach-sending-mail-and-pickup-directory-is-used), speziell Raymondrs Antwort –

+0

@argatxa Antwort ist korrekt in Bezug auf die Verwendung von das angegebenePickupDirectory-Element. Das obige ist nicht ganz richtig, siehe: http://msdn.microsoft.com/en-us/library/ms164241.aspx –

7

Für .NET Jungs da draußen. Halte es einfach.

Wir haben uns das angeschaut und dann erinnerte sich einer der Entwickler an die Konfigurationseinstellung, mit der Sie überschreiben können, wie die E-Mails gesendet werden.

Dies erstellt eine Datei per E-Mail und lassen Sie es in Ruhe.

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

Beachten Sie, dass die SmtpClientWrapper Klasse von tvanfosson die wichtige „virtuellen“ Schlüsselwort in der Deklaration der Send-Methode muss vorgeschlagen, sonst sind Sie wieder im gleichen Boot wie der Versuch, die SmtpClient direkt zu verspotten. http://www.toolheap.com/test-mail-server-tool/

Nicht wirklich für TDD aber nützlich bei der manuellen Prüfung, wie es mit jeder E-Mail einen Outlook Express-Fenster Pop-up kann das würde:

+0

Es sollte ein Kommentar sein, keine Antwort. –

0

Per vielen der anderen Vorschläge ein kostenloses Tool habe ich ziemlich viel verwendet gesendet werden.

0

Wie Sean Carpenter erwähnt, ist ein leistungsfähiges Papercut Lösung für die lokale Entwicklung. Wenn Sie auch einen Staging- oder Testserver ausführen, ist mailtrap.io jedoch möglicherweise eine einfachere Lösung, da Sie den gleichen Ansatz für Ihre Entwicklungs- und Staging-Umgebungen verwenden können.

Verwandte Themen