HowTo: Senden von Emails testen ohne Mailserver
Emails mit .NET zu versenden ist recht einfach, wenn es allerdings darum geht, den generierten Emailtext zu testen, dann wird es manchmal etwas schwierig.
Vor allem wenn das Entwicklungssystem keinen Zugriff auf den richtigen Email-Server hat, geht es meist nur auf "gut Glück".
Es gibt allerdings einen einfachen Web.Config Eintrag der es erheblich vereinfacht – die PickupDirectoryLocation.
Democode
Der Code zum verschicken einer Mail (in einer ASP.NET MVC ActionMethod) :
public ActionResult SendMail()
{
SmtpClient smtpClient = new SmtpClient();
MailMessage mailMessage = new MailMessage("from@test.de", "to@test.de");
mailMessage.Subject = "Test-Subject";
mailMessage.Body = "Test-Body";
smtpClient.Send(mailMessage);
return View("Index");
}
In der web.config folgende Einstellung:
Produktivsystem
<system.net>
<mailSettings>
<smtp>
<network host="mail.example.com"/>
</smtp>
</mailSettings>
</system.net>
Entwicklungssystem
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="c:\temp\maildrop\"/>
</smtp>
</mailSettings>
</system.net>
Die "PickupDirectoryLocation" nimmt allerdings nur einen absoluten Pfad entgegen. Wenn man nun den Code aufruft, dann werden die Emails in den angegebenen Verzeichnis abgelegt:
X-Sender: from@test.de X-Receiver: to@test.de MIME-Version: 1.0 From: from@test.de To: to@test.de Date: 16 Mar 2009 20:52:55 +0100 Subject: Test-Subject Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: quoted-printable Test-Body
Damit lässt sich die Emailgenerierung auch ohne SMTP Server testen.
Den Tipp habe ich von dieser Seite – da ich ihn ständig wieder Suche, habe ich ihn jetzt ebenfalls auch gebloggt
Wichtig ist noch, dass ASP.NET Schreibrechte auf dem Verzeichnis hat.




Christian
17. March 2009
Hi Robert,
Danke dir!
danke für diesen Artikel. Ich hab sonst immer den SMTP Server aufgesetzt, Konto angelegt…
Super Tipp der ne Menge Zeit erspart
Noch ein Christian
17. March 2009
Wow, danke für diesen Artikel.
Andre Loker
17. March 2009
Hi,
Der Tipp ist tatsächlich nützlich. Wobei natürlich der SmtpClient im Controller nichts zu suchen hat. Dann eher z.B. ein IMailSender injizieren (im unit test mocken) und die SmtpClient-spezifische Implementierung des Interfaces dann mit deinem Tipp testen. Oder halt ggf. noch weiter vom Senden der Email abstrahieren.
Grüße,
Andre
Robert Mühsig
17. March 2009
Ist richtig – nur wollte ich das Beispiel bewusst simpel halten und nicht noch DI oder Mocking hier rein packen