Azure Web Apps Mail senden

Erst gestern gab es von Scott Guthrie eine Reihe neuer Azure Service Ankündigungen. Azure Websites heißen nun Azure Web Apps. Daneben noch API Apps, mobile Apps und Logic Apps. Ein Problem bleibt aber, wie sende ich eMail aus einer Azure Website App? Einige Blogs und die Suche nach “how to send mail from azure website” deutet auf einen Dienst Namens Sendgrid hin.

Gleich eines vorab. Man kann eMails auch in Azure wie gewohnt mit dem SMTPClient Objekt senden. Folgender .NET Code funktioniert, wenn man einen SMTP Server als Relay Host nutzen kann.

   1:  Dim sc As New SmtpClient
   2:  sc.Host = "mail.ppedv.de"
   3:  sc.Send("xxxx@outlook.com", "hannesp@ppedv.de", "test", "test")

Dabei sind wir auch schon bei den Problem. Azure stellt keinen SMTP Dienst bereit. Jedenfalls bisher nicht, mal sehen was sich in den API Apps noch verbirgt.

Wer über Dienste wie Google Mail oder Outlook live senden möchte, muss sich am SMTP Server authentifizieren um Spammern das Leben zu erschweren. Auch das klappt bei Azure grundsätzlich mit folgendem VB.NET Code Beispiel

   1:  Dim sc As New SmtpClient
   2:  sc.Host = "smtp.live.com"
   3:  sc.EnableSsl = True
   4:  sc.Port = 587
   5:  sc.Credentials = New NetworkCredential("hannesp@ppedv.de", "passwort?")
   6:  sc.Send("xxxxx@outlook.com", "hannesp@ppedv.de", "test", "test")

Allerdings wird vermutlich eine Fehlermeldung in der Website auftauchen ala

Mailbox unavailable. The server response was: 5.7.3 requested action aborted; user not authenticated

Der Grund ist, das diese Website und damit die Anmeldung von einem Azure Web Server kommen. In meinem Fall aus den Niederlanden. Über das Live Portal kann man den Activity Request erkennen und markieren als “von mir stammend”

image

Wenn aber der Mail Server gerade keine Mails entgegen nehmen möchte, wird mein Code Laufzeit Fehler verursachen, die sehr schwer zu behandeln sind. Mail erzeugen und Mail versenden sollten zwei verschiedene Prozesse sein. Vor allem da das Senden asynchron funktioniert, bei Retry versuchen mit mehrstündiger Dauer.

Korrekterweise werden die Einstellungen zum Versand von emals in der Datei Web.Config vorgenommen. Hier im Bereich system.net.  Dort kann man auch festlegen, das die erzeugten Mails in einem Verzeichnis gespeichert werden.

   1:  <system.net>
   2:      <mailSettings>
   3:        <smtp deliveryMethod="SpecifiedPickupDirectory">
   4:          <specifiedPickupDirectory 
pickupDirectoryLocation="D:\home\site\wwwroot\pickup"/>
   5:        </smtp>
   6:      </mailSettings>
   7:   
   8:    </system.net>

Wie erhält man den physikalischen Pfad einer Web Seite die auf Azure läuft. Ganz einfach per Server.MapPath("."). Im Unterverzeichnis Pickup wird dann das email als eml Datei erzeugt.

image

Solche Dateien kann man auf einem Windows System per Doppeltclick öffnen. Auch das enthaltene Text Format ist leicht lesbar.

X-Sender: xxxx@outlook.com
X-Receiver: hannesp@ppedv.de
MIME-Version: 1.0
From: xxxx@outlook.com
To: hannesp@ppedv.de
Date: 24 Mar 2015 18:36:52 +0000
Subject: test
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable

test

 

Wenn man nun diese Dateien in ein Pickup Verzeichnis eines Windows SMTP Servers kopiert, werden diese als eMail versandt. Dazu aber später mehr.

Kommentare sind geschlossen