Als Entwickler E-Mails via Code versenden ist kein Problem, oder? Verschiedene Bibliotheken stehen zur Verfügung, die Kontakt zum Mailserver aufnehmen und Mails verschicken. Was aber, wenn das wider Erwarten nicht klappt? Dann kann es sein, dass im internen Netz Ports gesperrt sind.
Wir könnten in der IT nachfragen, welche Ports denn betroffen sind. Mit ein wenig PowerShell können wir die Kollegen aber in Ruhe lassen und das selber herausfinden.
PortQuiz.net antwortet auf allen Ports
Um die Verbindung auf einem Port zu testen, benötigen wir einen Server, der auf diesem Port zuverlässig antwortet. Und das am besten für beliebige Ports, damit wir nicht von Server zu Server ziehen müssen. Diese Herausforderung schien auch ein anderer Entwickler zu haben und stellt uns einen Dienst bereit, der genau das macht: PortQuiz.net.
Unter der URL portquiz.net werden TCP-Anfragen auf allen Ports entgegengenommen. Also los. Die .NET-Klasse System.Net.Sockets.TcpClient erlaubt es, TCP-Verbindungen aufzubauen. Das funktioniert auch in PowerShell, bspw. so:
$asyncRes = $tcpclient.BeginConnect("portquiz.net", 25, $null, $null) # test port 25
Der Server müsste nun antworten. Wenn er nicht antwortet, dann ist das ein Hinweis darauf, dass dieser Port von der Firewall blockiert wird.
Um nun mehrere Ports zu testen ist es notwendig, einen kurzen Timeout für den Verbindungsversuch zu definieren. Folgendermaßen lässt sich auf den Verbindungsaufbau mit einer halben Sekunde Timeout warten:
$asyncRes = $tcpclient.BeginConnect("portquiz.net", 25, $null, $null) $connected = $asyncRes.AsyncWaitHandle.WaitOne(500, $false) # wait 500ms
Am Rückgabewert der Warteoperation lässt sich ablesen, ob die Verbindung zustande kam, oder ob es einen Timeout gab. Jetzt braucht es nur noch eine Schleife drumrum und wir können die für uns interessanten Ports automatisiert durchtesten.
Fertiges Script auf GitHub
Ein komplettes Script zum Kopieren und selber Ausführen habe ich als Gist auf GitHub zur Verfügung gestellt:
https://gist.github.com/heinrich-ulbricht/e22ee038585ea33db1988d14f9b634f1
Die Ausgabe des Scripts sieht dann ungefähr so aus:
Viel Erfolg beim Testen und Entwickeln!