Port reachable?

Checks whether the SMTP port (25, 587 or 465) is open from your current location.

SMTP (25)

PowerShell (Windows)

Test-NetConnection Built-in

Test-NetConnection -ComputerName mail.example.com -Port 25

nc / ncat Add-on tool

ncat -vz mail.example.com 25

Unix shell (bash)

bash /dev/tcp Built-in

timeout 5 bash -c "</dev/tcp/mail.example.com/25" && echo open || echo closed

nc Add-on tool

nc -vz mail.example.com 25

Submission (587)

PowerShell (Windows)

Test-NetConnection Built-in

Test-NetConnection -ComputerName mail.example.com -Port 587

nc / ncat Add-on tool

ncat -vz mail.example.com 587

Unix shell (bash)

bash /dev/tcp Built-in

timeout 5 bash -c "</dev/tcp/mail.example.com/587" && echo open || echo closed

nc Add-on tool

nc -vz mail.example.com 587

SMTPS (465)

PowerShell (Windows)

Test-NetConnection Built-in

Test-NetConnection -ComputerName mail.example.com -Port 465

nc / ncat Add-on tool

ncat -vz mail.example.com 465

Unix shell (bash)

bash /dev/tcp Built-in

timeout 5 bash -c "</dev/tcp/mail.example.com/465" && echo open || echo closed

nc Add-on tool

nc -vz mail.example.com 465

Banner + EHLO

Opens the connection, reads the 220 banner and the EHLO reply with the offered capabilities.

Eigener Mailserver

PowerShell (Windows)

TcpClient (.NET) Built-in

$h = "mail.example.com"; $p = 25
$c = New-Object Net.Sockets.TcpClient($h, $p)
$s = $c.GetStream()
$r = New-Object IO.StreamReader($s)
$w = New-Object IO.StreamWriter($s); $w.NewLine = "`r`n"; $w.AutoFlush = $true
Start-Sleep -Milliseconds 400; while ($c.Available) { $r.ReadLine() }
$w.WriteLine("EHLO test.example.com")
Start-Sleep -Milliseconds 400; while ($c.Available) { $r.ReadLine() }
$w.WriteLine("QUIT"); $c.Close()

nc / ncat Add-on tool

"EHLO test.example.com`r`nQUIT`r`n" | ncat mail.example.com 25

Unix shell (bash)

bash /dev/tcp Built-in

exec 3<>/dev/tcp/mail.example.com/25
printf 'EHLO test.example.com\r\nQUIT\r\n' >&3
cat <&3
exec 3<&-

nc Add-on tool

( printf 'EHLO test.example.com\r\nQUIT\r\n'; sleep 1 ) | nc mail.example.com 25

Microsoft 365

PowerShell (Windows)

TcpClient (.NET) Built-in

$h = "contoso-com.mail.protection.outlook.com"; $p = 25
$c = New-Object Net.Sockets.TcpClient($h, $p)
$s = $c.GetStream()
$r = New-Object IO.StreamReader($s)
$w = New-Object IO.StreamWriter($s); $w.NewLine = "`r`n"; $w.AutoFlush = $true
Start-Sleep -Milliseconds 400; while ($c.Available) { $r.ReadLine() }
$w.WriteLine("EHLO test.example.com")
Start-Sleep -Milliseconds 400; while ($c.Available) { $r.ReadLine() }
$w.WriteLine("QUIT"); $c.Close()

nc / ncat Add-on tool

"EHLO test.example.com`r`nQUIT`r`n" | ncat contoso-com.mail.protection.outlook.com 25

Unix shell (bash)

bash /dev/tcp Built-in

exec 3<>/dev/tcp/contoso-com.mail.protection.outlook.com/25
printf 'EHLO test.example.com\r\nQUIT\r\n' >&3
cat <&3
exec 3<&-

nc Add-on tool

( printf 'EHLO test.example.com\r\nQUIT\r\n'; sleep 1 ) | nc contoso-com.mail.protection.outlook.com 25

Test STARTTLS

Establishes a STARTTLS connection and shows the certificate.

Submission (587)

PowerShell (Windows)

SslStream (.NET) Built-in

$h = "mail.example.com"; $p = 587
$c = New-Object Net.Sockets.TcpClient($h, $p)
$s = $c.GetStream()
$r = New-Object IO.StreamReader($s)
$w = New-Object IO.StreamWriter($s); $w.NewLine = "`r`n"; $w.AutoFlush = $true
$r.ReadLine() | Out-Null
$w.WriteLine("EHLO test.example.com"); Start-Sleep -Milliseconds 200; while ($c.Available) { $r.ReadLine() | Out-Null }
$w.WriteLine("STARTTLS"); $r.ReadLine()
$ssl = New-Object Net.Security.SslStream($s, $false, ({ $true }))
$ssl.AuthenticateAsClient($h)
([Security.Cryptography.X509Certificates.X509Certificate2]$ssl.RemoteCertificate) | Format-List Subject, Issuer, NotBefore, NotAfter
$ssl.Dispose(); $c.Close()

openssl Add-on tool

openssl s_client -starttls smtp -crlf -connect mail.example.com:587 -servername mail.example.com

Unix shell (bash)

openssl Built-in

openssl s_client -starttls smtp -connect mail.example.com:587 -servername mail.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates

swaks Add-on tool

swaks --server mail.example.com:587 -tls --quit-after TLS

Microsoft 365

PowerShell (Windows)

SslStream (.NET) Built-in

$h = "smtp.office365.com"; $p = 587
$c = New-Object Net.Sockets.TcpClient($h, $p)
$s = $c.GetStream()
$r = New-Object IO.StreamReader($s)
$w = New-Object IO.StreamWriter($s); $w.NewLine = "`r`n"; $w.AutoFlush = $true
$r.ReadLine() | Out-Null
$w.WriteLine("EHLO test.example.com"); Start-Sleep -Milliseconds 200; while ($c.Available) { $r.ReadLine() | Out-Null }
$w.WriteLine("STARTTLS"); $r.ReadLine()
$ssl = New-Object Net.Security.SslStream($s, $false, ({ $true }))
$ssl.AuthenticateAsClient($h)
([Security.Cryptography.X509Certificates.X509Certificate2]$ssl.RemoteCertificate) | Format-List Subject, Issuer, NotBefore, NotAfter
$ssl.Dispose(); $c.Close()

openssl Add-on tool

openssl s_client -starttls smtp -crlf -connect smtp.office365.com:587 -servername smtp.office365.com

Unix shell (bash)

openssl Built-in

openssl s_client -starttls smtp -connect smtp.office365.com:587 -servername smtp.office365.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates

swaks Add-on tool

swaks --server smtp.office365.com:587 -tls --quit-after TLS

You can then keep typing manually (EHLO, then QUIT). openssl is an add-on tool, available on Windows e.g. via Git for Windows, and it also runs inside PowerShell.

Implicit TLS (465)

Connects with TLS straight away on port 465 (SMTPS, implicit TLS).

Impliztes TLS (465)

PowerShell (Windows)

SslStream (.NET) Built-in

$h = "mail.example.com"; $p = 465
$c = New-Object Net.Sockets.TcpClient($h, $p)
$ssl = New-Object Net.Security.SslStream($c.GetStream(), $false, ({ $true }))
$ssl.AuthenticateAsClient($h)
([Security.Cryptography.X509Certificates.X509Certificate2]$ssl.RemoteCertificate) | Format-List Subject, Issuer, NotAfter
$ssl.Dispose(); $c.Close()

openssl Add-on tool

openssl s_client -connect mail.example.com:465 -servername mail.example.com

Unix shell (bash)

openssl Built-in

openssl s_client -connect mail.example.com:465 -servername mail.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates

swaks Add-on tool

swaks --server mail.example.com -p 465 --tlsc --quit-after BANNER

Send test mail (SMTP stream)

Builds the complete SMTP conversation line by line (EHLO, MAIL FROM, RCPT TO, DATA, QUIT) and sends a real test message: with built-ins, no add-on tool.

PowerShell (Windows)

TcpClient (.NET) Built-in

$h = "mail.example.com"; $p = 25
$from = "sender@example.com"; $to = "recipient@example.com"
$c = New-Object Net.Sockets.TcpClient($h, $p)
$s = $c.GetStream()
$r = New-Object IO.StreamReader($s)
$w = New-Object IO.StreamWriter($s); $w.NewLine = "`r`n"; $w.AutoFlush = $true
function Talk($line) { if ($line) { $w.WriteLine($line) }; Start-Sleep -Milliseconds 300; while ($c.Available) { $r.ReadLine() } }
Talk $null
Talk "EHLO test.example.com"
Talk "MAIL FROM:<$from>"
Talk "RCPT TO:<$to>"
Talk "DATA"
$w.WriteLine("Subject: SMTP-Test")
$w.WriteLine("From: $from")
$w.WriteLine("To: $to")
$w.WriteLine("")
$w.WriteLine("Testnachricht via reinem SMTP-Stream.")
Talk "."
Talk "QUIT"
$c.Close()

Send-MailMessage Add-on tool

Send-MailMessage -SmtpServer mail.example.com -Port 25 -From sender@example.com -To recipient@example.com -Subject "SMTP-Test" -Body "SMTP-Test $(Get-Date -Format o)"

Unix shell (bash)

bash /dev/tcp Built-in

exec 3<>/dev/tcp/mail.example.com/25
send() { printf '%s\r\n' "$1" >&3; }
resp() { while IFS= read -r -t 3 line <&3; do printf '%s\n' "$line"; case $line in [0-9][0-9][0-9]" "*) break;; esac; done; }
resp
send "EHLO test.example.com"; resp
send "MAIL FROM:<sender@example.com>"; resp
send "RCPT TO:<recipient@example.com>"; resp
send "DATA"; resp
send "Subject: SMTP-Test"
send "From: sender@example.com"
send "To: recipient@example.com"
send ""
send "Testnachricht via reinem SMTP-Stream."
send "."; resp
send "QUIT"; resp
exec 3<&-

swaks Add-on tool

swaks --server mail.example.com:25 --from sender@example.com --to recipient@example.com

The raw stream runs unencrypted on port 25, suited to a relay or the MX without authentication. For port 587 with STARTTLS and AUTH, use swaks or openssl. Send-MailMessage is officially deprecated but still works.

Other areas