<# .SYNOPSIS Test unauthenticated SMTP relay via Microsoft 365 using MX record and IP-based connector. .DESCRIPTION This script sends a test email through Microsoft 365 (Exchange Online) using a connector that allows mail relay based on the sender's IP address. It does not require authentication and is useful for testing printers, scanners, or any other device that cannot use modern SMTP auth. .AUTHOR Generic / Public version (sanitized for open-source use) .NOTES Requires that your public IP is allowed in an Exchange Online connector. Use the MX hostname (e.g. yourdomain-nl.mail.protection.outlook.com) as the SMTP endpoint. # CHANGELOG -------------------------------------------------------------------------------- Date | Version | Author | Description ------------|---------|----------------|------------------------------------------ 2025-07-18 | 1.0.0 | Public / GPT | Initial release for generic SMTP relay test -------------------------------------------------------------------------------- #> # Variables (edit to match your domain and connector setup) $from = "relay@yourdomain.com" $to = "relay@yourdomain.com" $smtpServer = "yourdomain-nl.mail.protection.outlook.com" # Replace with your actual MX record $smtpPort = 25 $subject = "SMTP Relay Test via Microsoft 365 Connector" $body = "This message was sent without authentication using an IP-allowed connector." # Create email message $message = New-Object system.net.mail.mailmessage $message.From = $from $message.To.Add($to) $message.Subject = $subject $message.Body = $body $message.IsBodyHtml = $false # Configure SMTP client (unauthenticated, no TLS) $smtp = New-Object Net.Mail.SmtpClient($smtpServer, $smtpPort) $smtp.EnableSsl = $false $smtp.DeliveryMethod = "Network" $smtp.UseDefaultCredentials = $true Write-Host "⏳ Attempting SMTP relay via $smtpServer..." try { $smtp.Send($message) Write-Host "`n✅ Message successfully sent via connector." } catch { Write-Host "`n❌ Failed to send mail:" Write-Host $_.Exception.Message if ($_.Exception.InnerException) { Write-Host "`nDetails:" Write-Host $_.Exception.InnerException.Message } }