シェルスクリプトでSMTPメール送信を自動化してみた

はじめに
はじめまして。昨年の8月にSendGridチームに配属された、新人の兼子です。ITやメールに関する知識を身につけるため、現在基礎から勉強中です!
メールについては、基本的な仕組みについて学ぶだけではなく、実際にTwilio SendGridからSMTPやマーケティングキャンペーン機能でメール送信することでさらに理解を深めるようにしています。そうした中で、最近学んだシェルスクリプトを使うと、SMTPでのメール送信を効率よく行えるのではないかと考えました。そこで今回は、シンプルなメールをシェルスクリプトを使って送る方法を紹介します!
SMTPで送信する
SendGridのドキュメントでは、telnetコマンドでSMTPサーバに接続し、SMTPコマンドを使ってメール送信を行う方法が紹介されています。具体的には、SMTPサーバへの接続後、認証を行い、送信者や受信者、メール本文を指定するという手順を踏みますが、この方法ではコマンド入力の度にサーバからの応答を待つ必要があり、少し手間がかかるように感じます。
そこで、シェルスクリプトを使います。シェルスクリプトとは、コマンドライン(シェル)で実行できる一連のコマンドをまとめたファイルです。このファイルに必要なコマンドを記述し実行すると、書かれているコマンドが上から順番に実行されます。そのため、一連のSMTPコマンドをシェルスクリプトとしてまとめておけば、スクリプトを1回実行するだけで上述のSMTPサーバとのやりとりを自動化することができます。毎回コマンドを手入力する必要がないため、ミスをする可能性が減り、また、作成したスクリプトを再利用することも可能です。
今回は、Ubuntu 24.04 LTS環境を使用して、SendGridからメール送信を行うシェルスクリプトを作成しました。以下がそのサンプルコードです。
なお、SendGridからメールを送信する際は、APIキーが必要になるため、先に作成しておいてください。
#!/bin/bash
host=smtp.sendgrid.net
port=587
user=YXBpa2V5
password=$(echo -n $SENDGRID_API_KEY | base64)
to=to@example.com
from=from@example.com
function mail_input {
echo "EHLO localhost"
sleep 1
echo "auth login"
echo "$user"
echo "$pass"
echo "mail from: $from"
echo "rcpt to: $to"
echo "data"
echo "To: $to"
echo "From: $from"
echo "Subject: Hello, Mail Server"
echo "Content-Type: text/plain; charset=utf-8;"
echo ""
echo "Hello!"
echo "."
echo "quit"
}
#send
mail_input | nc $host $port
このサンプルコードを実行するために、「nano」というコマンドライン上で直接編集できるテキストエディタを使用して、send_email.shという新しいシェルスクリプトを作成します。
nano send_email.sh
nano send_email.shコマンドでnanoエディタを開き、上記のサンプルコードをエディタ内に貼り付けます。このとき、変数部分($to、$SENDGRID_API_KEYのように$から始まるパラメータ)は、実際の値に置き換えます。
貼り付けたら、Ctrl + Oを押してファイルを保存し、Enterを押します。最後にCtrl + Xを押してnanoエディタを終了します。
次に、スクリプトファイルに実行権限を付与します。
chmod +x send_email.sh
以下のコマンドでスクリプトを実行します。./を使って、実行中のシェル環境でスクリプトを実行します。
./send_email.sh
正常にリクエストが受け付けられると以下のような応答が返り、メールが送信されます。
220 SG ESMTP service ready at geopod-ismtpd-16 250-smtp.sendgrid.net 250-8BITMIME 250-PIPELINING 250-SIZE 31457280 250-STARTTLS 250-AUTH PLAIN LOGIN 250 AUTH=PLAIN LOGIN 334 VXNlcm5hbWU6 334 UGFzc3dvcmQ6 235 Authentication successful 250 Sender address accepted 250 Recipient address accepted 354 Continue 250 Ok: queued as KGAhPD8FSYqTsJ8K3SXNwA 221 See you later
宛先として指定したメールアドレスに無事にメールが届きました!

まとめ
シェルスクリプトを使って、SMTPでのメール送信を簡単に行うことができました。
コマンドの意味を学ぶことで、SMTP送信の仕組みがより明確になり、実際の動作を把握できるようになりました。
SendGridでは、SMTPの他にもWeb APIでの送信や、マーケティングキャンペーン機能による一斉送信ができます。今後も色々な送信方法を試して、さらにメールへの理解を深めたいです。
補足
先ほどのサンプルコードで使用したパラメータの意味は以下の通りです。ぜひ目を通してみてください。
- host:SendGridのSMTPサーバのホスト名(smtp.sendgrid.net)
- port:ポート番号
- user:固定文字列「apikey」をBase64エンコードした文字列(YXBpa2V5)
- password:SendGridのAPIキーをBase64エンコードした文字列
- to:宛先メールアドレス
- from:送信元メールアドレス


