Skip to content

Instantly share code, notes, and snippets.

@newyear2006
Created August 23, 2015 22:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save newyear2006/2a6a3fb0cea8dc1063ba to your computer and use it in GitHub Desktop.
Save newyear2006/2a6a3fb0cea8dc1063ba to your computer and use it in GitHub Desktop.
Beispiel wie man eine einfache Verbindung zu einem SMTP-Server aufbauen kann, zum Prüfen, ob er erreichbar ist, anschließend STARTTLS aktiviert um auf eine sichere Verbindung zu kommen und dann den Benutzer mit Passwort abzufragen, ob dieser angemeldet werden kann.
# Verbindung zu Web.de aufbauen
$c=Test-NetConnection smtp.web.de -Port 587
# Antwort vom SMTP-Server holen und ausgeben
[byte[]]$buffer= @(0) * $c.TcpClientSocket.Available
$c.TcpClientSocket.Receive($buffer)
[System.Text.Encoding]::ASCII.GetString($buffer)
# Begrüßung durchführen
$buffer=[System.Text.Encoding]::ASCII.GetBytes("EHLO $Env:Computername`r`n")
$c.TcpClientSocket.Send($buffer)
Sleep -Seconds 1
# Antwort vom SMTP-Server holen
[byte[]]$buffer= @(0) * $c.TcpClientSocket.Available
$c.TcpClientSocket.Receive($buffer)
[System.Text.Encoding]::ASCII.GetString($buffer)
# STARTTLS-Anfrage starten
$buffer=[System.Text.Encoding]::ASCII.GetBytes("STARTTLS`r`n")
$c.TcpClientSocket.Send($buffer)
Sleep -Seconds 1
# Bei dieser Antwort sollte 220 rauskommen,
# sonst gibt es ein Problem
[byte[]]$buffer= @(0) * $c.TcpClientSocket.Available
$c.TcpClientSocket.Receive($buffer)
[System.Text.Encoding]::ASCII.GetString($buffer)
# für den weiteren Gang ist entscheidend, dass man einen Stream braucht
# vom Socket erhält man einen Stream, durch Weitergabe an NetworkStream-Klasse
$n=New-Object System.Net.Sockets.NetworkStream $c.TcpClientSocket
# über den Networkstream kann man nun SslStream aktivieren
$ssl = New-Object System.Net.Security.SslStream $n, $true
# nun kann man den eigentlichen TLS Handshake starten, dazu muss nochmal der Host angegeben werden
$ssl.AuthenticateAsClient($c.ComputerName)
# für die weitere Kommunikation richtet man sich am besten zusätzliche Streams ein
$reader = New-Object System.IO.StreamReader $ssl
$writer = New-Object System.IO.StreamWriter $ssl
$writer.AutoFlush = $true
# damit wird die weitere Kommunikation einfacher und das Spiel beginnt von vorne
$writer.WriteLine("EHLO $Env:Computername")
while ($reader.Peek() -gt -1) {
$reader.ReadLine()
}
# jetzt die Authentifizierung starten
$writer.WriteLine("AUTH LOGIN")
$reader.ReadLine()
# der Server sollte mit VXNlcm5hbWU6 geantwortet haben und verlangt den Benutzernamen
# bevor es aber losgeht, wird gleich das Passwort vom Benutzer erfragt
$user = "meinetestwebdeadresse@web.de"
$cred = Get-Credential -UserName $user -Message "Bitte Passwort eingeben"
$pass = $cred.GetNetworkCredential().Password
$userBytes = [System.Text.Encoding]::ASCII.GetBytes($user)
$userBase64 = [System.Convert]::ToBase64String($userBytes)
$writer.WriteLine($userBase64)
$reader.ReadLine()
# der Server sollte nun nach dem Passwort fragen, sieht dann so aus: UGFzc3dvcmQ6
$passBytes = [System.Text.Encoding]::ASCII.GetBytes($pass)
$passBase64 = [System.Convert]::ToBase64String($passBytes)
$writer.WriteLine($passBase64)
$reader.ReadLine()
# hier sollte man ein "235 Authentication succeeded" erhalten
# das reicht erst mal und weg...
$writer.WriteLine("QUIT")
$reader.ReadLine()
# Streams und Sockets schließen
$ssl.Close()
$n.Close()
$c.TcpClientSocket.Close()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment