In order to troubleshoot the low-level communication of sending e-mail through Exchange Online using SASL authenticated SMTP, you can user this script :
#!/usr/bin/perl
use strict;
use warnings;
use Net::SMTP;
use Authen::SASL;
# Recipient email
my $recipient = shift(@ARGV);
unless (defined($recipient) && ($recipient =~ /^[A-Z0-9_+]+([A-Z0-9_+.)*@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$/i)) {
print STDERR "Usage: $0 email\@domain.tld\n";
exit 1;
}
my ($server,$username,$password);
open(F,"</etc/postfix/sasl_passwd") or die "Cannot open /etc/postfix/sasl_passwd : $!";
while(<F>) {
if (/^(\S+)\s+([^:]+):(\S+)/) {
($server,$username,$password)=($1,$2,$3);
}
}
close(F);
# Create SMTP client
my $smtp = Net::SMTP->new(
'smtp.office365.com',
Port => 587,
Timeout => 30,
Debug => 1, # Set to 0 to disable debugging output
);
die "Could not connect to server: $!" unless $smtp;
# Upgrade connection to TLS
$smtp->starttls(SSL_verify_mode => 0)
or die "Failed to start TLS: $!";
# Authenticate
$smtp->auth($username, $password)
or die "Failed to authenticate: $!";
# Send email
$smtp->mail($username);
$smtp->to($recipient);
$smtp->data();
$smtp->datasend("To: $recipient\n");
$smtp->datasend("From: $username\n");
$smtp->datasend("Subject: Test Email\n");
$smtp->datasend("\n");
$smtp->datasend("This is a test email sent via Perl script using STARTTLS.\n");
$smtp->dataend();
# Close the connection
$smtp->quit;
print "Email sent successfully!\n";