サーバーの運用において、「処理結果の通知」や「定期レポートの送信」、「異常検知のアラート」といったメール通知のニーズは非常に多くあります。従来は Sendmail や Postfix などの MTA(Mail Transfer Agent)を導入する必要がありましたが、それらの構築や設定には一定の工数と知識が求められます。
そこで本記事では、より軽量でシンプルな方法として、curl
コマンドを使った SMTP 経由でのメール送信方法 を紹介します。さらに、この curl
を cron
と組み合わせることで、メール通知を完全自動化する方法まで解説していきます。
curlコマンドとは
curlはさまざまなプロトコルを用いてデータを転送するフリーソフトです。curlの名前は「Client for URLs」から来ており「カール」と読みます。cURLプロジェクトで1998年からリリースを開始し、Microsoft WindowsでもWin10 ver1803からOS標準搭載され、ますます有名なコマンドになりました。
curlは、コマンドラインからHTTPリクエストを送信するためのツール、という印象が強いかと思いますが、それだけではありません。curlの公式サイトを見ると、多くのプロトコルに対応している事がわかります。
<curlの対応プロトコル> DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, POP3, POP3S, RTMP, RTMPS, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS, WSS |
今回は、crulでサポートしているプロトコルの中でも、メール送信に使うSMTPについて解説します。
curlをmail送信に使う3つの利点
1. 導入の手軽さ
curl
は多くの Linux ディストリビューションや Windows、macOS に標準でインストールされており、追加パッケージのインストールなしで利用できます。MTA のような複雑な構築や設定を行うことなく、即座にメール送信処理をスクリプトに組み込めます。
2. スクリプトとの親和性
curl
は1行のコマンドで完結するため、シェルスクリプトとの連携性が非常に高く、処理の最後に追加するだけで通知メールを送ることができます。GUIメールクライアントのように外部操作が不要で、テンプレート化・再利用もしやすい点が大きなメリットです。
3. 高い可搬性
curl
によるメール送信は、必要な情報(SMTPサーバー、認証情報、宛先、本文など)をすべてコマンド内で完結させられます。特定の設定ファイルに依存せず、他のサーバーにもコマンドをそのままコピーして実行できるため、環境移行や展開が容易です。
Gmailを使ったメール送信:3ステップ
STEP 1:アプリパスワードを取得する
通常のGoogleアカウントのパスワードをスクリプトに書くのは危険なため、Googleが提供するアプリパスワードを使います。
手順:
- Googleアカウント管理の画面にログイン
- 「セキュリティ」→「2段階認証プロセス」を有効化
- 「アプリパスワード」を選択
- 任意のアプリ名(例:
curl-mail
)で生成 → 表示された16桁のパスワードを記録
STEP 2:メール本文ファイルを作成する(mail.txt)
まず送信するメールファイルを次のように用意します。ヘッダー情報も必要です。
From: Your Name <your-email@gmail.com>
To: Recipient Name <recipient@example.com>
Subject: Test Mail from Curl
This is a test mail sent via curl command.
From
,To
,Subject
はヘッダ情報。- 本文との間には空行を必ず1行挿入。
- このファイルを
mail.txt
という名前で保存。
STEP 3:curlコマンドを実行する
curlを実行します。
コマンド文字列を[\]で行連結する表現で記載しましたが、Windows環境のcurlを使う場合は、[\]をチルダ[^]に書き換えるか、[\]と改行を削除して1行にして実行してください。
コマンド
curl --url "smtps://smtp.gmail.com:465" --ssl-reqd
\
--user "your-email@gmail.com:[YOUR_PASSWORD]" \
--mail-from "your-email@gmail.com" \
--mail-rcpt "recipient@example.com" \
--upload-file mail.txt
実行結果
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 157 0 0 100 157 0 55 0:00:02 0:00:02 --:--:-- 55
ターミナルには上記実行結果が表示され、実際にメールが送信されます。
引数の意味
オプション | 説明 |
---|---|
--url | GmailのSMTP(SSL:465)を指定 |
--ssl-reqd | 暗号化通信(SSL/TLS)を必須とする |
--user | ユーザー名:アプリパスワード の形式で認証情報を指定 |
--mail-from | メールの送信元(エンベロープFrom) |
--mail-rcpt | メールの宛先(エンベロープTo) ※–mail-rcpt だけだとBCC充てになってしまうので、mail内容のヘッダーにもTO: xxxを入れる必要があります。 |
--upload-file | 本文ファイルを指定して送信 |
※今回の本文は英語だけですが、文字コードUTF-8の日本語をメールする場合は、-H “Content-Type: text/plain; charset=utf-8” を指定します。指定しないと日本語が文字化けします。) Recv failure: Connection was reset .
「 Recv failure: Connection was reset」 のエラーが起きる?
筆者のPCからgooglemailメールアドレスへ送信するとエラーが発生しました。
「curl: (56) Recv failure: Connection was reset . 」
筆者環境下のメール送信は、Google側でスパムと判断したようです。代わりにLinuxサーバー上で同様にcurlを実行すると、送信する事ができました。
Googleでは様々な要素を総合的に判断してスパム判定していますので、いろいろと試せばメール送信できるようになるかもしれません。私はその時は諦め、数日後に実行したら正常動作しました。
cronとcurlの連携でメール送信を自動化
定期的なレポート送信やログ監視などは、cron を使うことで自動化できます。
cronとは、プログラムを定期的に実行するためのUnix/Linuxのデーモンです。クロンまたはクーロンと読み、ギリシア語の時間を表す言葉クロノス[chronos](英語でも年代記[chronicle]の語源になっていますね)に由来します。またはCommand Run ON に由来するとも言われます。
ここでは、zohoメールサーバーを利用し、ログファイルの末尾30行を毎朝06:00にメール送信する例を紹介します。
※zohoメールとは、独自ドメインのメールを使える広告なしのメールサービスです。規模は小さいもののFreeプランもあります。
cron設定の例(実運用)
今回は、メール本文ファイルは準備せず、cronのコマンド記載欄だけで本文を作りメール送信します。
これなら、cron -eコマンドをたたくだけで、どの時間に何を実行しているかが詳細までわかります(一行が長くなりますが、私の好みです)。
0 6 * * * cd /home/testwww; echo `date '+\%m\%d \%H\%M\%S'` mail >> cron.log; \
MFR="info@aa.bb.jp"; MTO="recipient@example.com
"; \
{ echo "To: $MTO"; echo "Subject: Test Mail from Curl
"; echo ""; tail -n 30 cron.log; } | \
curl smtp://smtp.zoho.jp:587 \
--mail-from $MFR \
--mail-rcpt $MTO \
-u $MFR:[your_password] \
--ssl-reqd \
-H "Content-Type: text/plain; charset=utf-8" \
-T -
各構成要素の解説
要素 | 説明 |
---|---|
0 6 * * * | 毎日06:00に実行 |
cd /home/testwww; | 作業ディレクトリに移動 |
echo `date` mail >> cron.log; | ログファイルに現在時刻と mail を追記 |
MFR , MTO | 送信元・宛先アドレス(変数化) |
{ ... } | メールのヘッダーと本文(ログの末尾30行)を組み立てる |
curl ... -T - | 標準入力からメール本文を受け取り送信する。パイプ | を通して動的に生成したメールデータを curl に流し込む場合に使う。※ -T - のハイフンは「標準入力」の意味※Windows版のcurlは対応していません。 |
crontabの基本構文(復習)
分 時 日 月 曜日 コマンド
例:0 6 * * *
は「毎日6:10に実行」
crontab の編集は以下のコマンドで行います。
crontab -e
まとめ
本記事では、curl
を使ったメール送信と cron
による自動化の実践的な方法を紹介しました。要点は以下の通りです。
curl
は MTA 不要でメール送信が可能な軽量ツール- Gmail のアプリパスワードで安全に認証を実現
cron
と組み合わせることで、通知処理を完全に自動化できる
この仕組みを導入することで、通知や監視業務を効率化し、インフラ運用の自動化を一歩進めることができます。