Test-STARTTLS
Für gewöhnlich nutze ich Programme wie Blat oder Commandlets wie "Send-MaiMessage" (Siehe PowerShell und Mail) um eine Mail an ein System zu senden. Manchmal tut es aber auch ein Telnet (Sehe SMTP-Telnet). Da scheitere ich dann aber doch schnell, wenn ich Verschlüsselt per STARTTLS kommunizieren möchten. Das Zertifikat können Sie zwar auch mit OpenSSL anzeigen lassen, aber das wollen Sie vielleicht auch nicht auf einem Server mal eben installieren. Das geht aber alles auch per PowerShell, das sie sich auch anschauen und ggfls. anpassen können.
Einsatz
Das Skript ist nicht für den Dauereinsatz oder Automatisierung gedacht, da es keine ausgereifte Fehlerbehandlung, Eventlogging o.ä. hat. Es ist mein Diagnose-Werkzeug, um die Verbindung zu einem SMTP-Serv er über Port 25, 587, o.ä. aufzubauen und wenn mit ein STARTTLS angeboten wird, auf einen verschlüsselten Kanal zu wechseln. So kann ich damit nach dem Wechsel mittels STARTTLS die dann angebotenen Anmeldeverfahren als auch das angebotene Zertifikat anzeigen. Wenn ich einen und wenn ich mag, auch eine Mail anonym oder authentifiziert gesendet. Aktuell geht noch kein OAUTH. Das Skript ist klassischer "Spaghetti-Code" und vielleicht komme ich später noch mal dazu, immer wiederkehrende Codeteile als Funktion umzustellen. Es ist kein Skript für den täglichen Einsatz und Automatisierung sondern für eine klar umrissene Diagnosefunktion im Fehlerfall.
Alle Werte sind über Parameter steuerbar. Nur das Kennwort wird immer interaktiv abgefragt. Ich hinterlege ungern Kennworte aber auf PS Passwort / Kennwort habe ich ja Beispiele zu sicheren Ablage von Kennworten aufgezählt. Es kommt ohne weitere AddOns oder Abhängigkeiten zu DLLs aus.
Parameter
Die Parameter sind weitgehend selbsterklärend
param (
[string]$smtpserver = "outlook.office365.com",
[long]$smtpPort = 587,
[string]$rcptto = "",
[string]$mailfrom = "user2@msxfaq.de",
[string]$Subject = "SMTP-Test",
[string]$Body = "Test Body",
[string]$headerfrom = "user5@msxfaq.de",
[string]$headerto = "user6@uclabor.de",
[string]$authuser = "",
$SkipCertificateCheck = $false
)
Der Inhalt von "smtpserver" und "smtpPort" bestimmt die Gegenstelle. Wenn Sie den "rcptto"-Wert füllen, dann versucht das Skript auch eine Mail mit den weiteren Feldern und ggfls. auch Anmeldung zu senden. Wenn Sie "rcptto" leer lassen, dann zeigt das Skript nur das gelieferte Zertifikat an:

Nach dem Wechsel mit STARTTLS auf eine verschlüsselte Verbindung sehen wir beim nächsten EHLO dann auch das Angebot der Anmeldeverfahren, welche in der ersten Antwort noch nicht enthalten waren. Dafür ist natürlich STARTTLS nicht mehr enthalten.
Hier kommt dann der Versucht eine Mail anonym an den Server eines meiner Tenants zu senden. Nach dem STARTTLS geht es ohne Anmeldung direkt zum Versand.
Am Anfang sieht noch alles gut aus aber am Ende kommt dann halt doch kein 200er Meldung, sondern ein temporärer 450 Fehler, weil mein Client keinen Reverse-DNS-Eintrag hat.
Skript
Laden Sie das Skript einfach herunter, ändern die Zoneneinstugun und ändern Sie die Erweiterung .TXT auf .PS1
Es ist nicht digital signiert. Ggfls. müssen Sie ihre ExecutionPolicy anpassen.
Weitere Links
- Blat
- Powershell und Zertifikate
- PowerShell und Mail
- SMTP-Telnet
- Teams und Mails
- OriginalClientIP
- SMTP P1/P2-Felder
- PS Passwort / Kennwort
-
Show SMTP Certificate of Remote Server with PowerShell
https://blog.icewolf.ch/archive/2021/06/29/show-smtp-certificate-of-remote-server-with-powershell/ -
aamillerMSFT/Test-CertificateState.ps1
https://gist.github.com/aamillerMSFT/03f4dc0275cc0911dd7e802b3d741fd0














