Knowledge Base

Preserving for the future: Shell scripts, AoC, and more

Send SMTP with openssl cli

files/2024/listings/smtp1.sh (Source)

#!/bin/sh
# File: smtp1.sh
# Location: stackbin
# Author: bgstack15
# Startdate: 2024-08-05-2 14:05
# SPDX-License-Identifier: GPL-3.0-only
# Title: Send authenticated email with openssl s_client
# Purpose: demo cli smtp auth
# History:
# References:
#    https://stackoverflow.com/questions/1546367/how-to-send-mail-with-to-cc-and-bcc
#    https://szclsya.me/posts/net/send-email-with-netcat/
#    https://serverfault.com/questions/1101104/how-to-send-an-email-with-openssl-and-microsoft-exchange-online
#    https://woshub.com/sending-email-via-telnet-using-smtp-authentication/
#    https://learn.microsoft.com/en-us/exchange/mail-flow/test-smtp-telnet?view=exchserver-2019
#    https://stackoverflow.com/questions/14640560/openssl-to-negotiate-ssl-encryption-for-starttls
#    https://thelinuxcode.com/openssl-s-client/
#    https://www.stevenrombauts.be/2018/12/test-smtp-with-telnet-or-openssl/
#    https://stackoverflow.com/questions/44250054/send-email-with-netcat
# Improve:
# Dependencies:
#    dep-fedora: openssl, coreutils
#    an smtp account and server
# Documentation:
slowcat() {
   while read REPLY ; do sleep .05; echo "$REPLY"; done
}
{
   message1="$( printf '%s' 'exampleuser@example.com' | base64 )"
   message2="$( cat ~/.config/smtp1 )"
   printf '%s\n' "EHLO exampleaddress.com"
   printf '%s\n' "AUTH LOGIN"
   printf '%s\n' "${message1}"
   printf '%s\n' "${message2}"
   # Everybody, so TO, CC, BCC is a RCPT TO. The To, CC, BCC headers are the decorations visible to the mail client.
   cat <<-EOF
MAIL FROM:<exampleuser@example.com>
RCPT TO:<user2@local.example.com>
RCPT TO:<user3@anotherlocal.examplelong.com>
DATA
From: [marco polo] <exampleaddress.com>
To: <user3@anotherlocal.examplelong.com>
BCC: <user2@local.example.com>
Date: Mon, 5 Aug 2024 17:31:32 +0000
Subject: Hello from netcat
sample message here
.
QUIT
EOF
# | slowcat | nc -v mail.example.net 587
} | slowcat | openssl s_client -crlf -connect mail.example.net:587 -starttls smtp -ign_eof

I needed to test (credentials, but also in general) the ability to send smtp messages. Here is my small script that does that.

The slowcat is useful because smtp (or maybe just my email implementation) wanted to delay between some of the steps, particularly EHLO and AUTH.

I couldn't get netcat (nc) to work with tls, although I thought I saw that once. At least s_client could do it.

Comments