curlコマンドによるメール送信とcronによる自動化

IT

サーバーの運用において、「処理結果の通知」や「定期レポートの送信」、「異常検知のアラート」といったメール通知のニーズは非常に多くあります。従来は Sendmail や Postfix などの MTA(Mail Transfer Agent)を導入する必要がありましたが、それらの構築や設定には一定の工数と知識が求められます。

そこで本記事では、より軽量でシンプルな方法として、curl コマンドを使った SMTP 経由でのメール送信方法 を紹介します。さらに、この curlcron と組み合わせることで、メール通知を完全自動化する方法まで解説していきます。

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
curl

今回は、crulでサポートしているプロトコルの中でも、メール送信に使うSMTPについて解説します。




curlをmail送信に使う3つの利点

1. 導入の手軽さ

curl は多くの Linux ディストリビューションや Windows、macOS に標準でインストールされており、追加パッケージのインストールなしで利用できます。MTA のような複雑な構築や設定を行うことなく、即座にメール送信処理をスクリプトに組み込めます。

2. スクリプトとの親和性

curl は1行のコマンドで完結するため、シェルスクリプトとの連携性が非常に高く、処理の最後に追加するだけで通知メールを送ることができます。GUIメールクライアントのように外部操作が不要で、テンプレート化・再利用もしやすい点が大きなメリットです。

3. 高い可搬性

curl によるメール送信は、必要な情報(SMTPサーバー、認証情報、宛先、本文など)をすべてコマンド内で完結させられます。特定の設定ファイルに依存せず、他のサーバーにもコマンドをそのままコピーして実行できるため、環境移行や展開が容易です。


Gmailを使ったメール送信:3ステップ

STEP 1:アプリパスワードを取得する

通常のGoogleアカウントのパスワードをスクリプトに書くのは危険なため、Googleが提供するアプリパスワードを使います。

手順:

  1. Googleアカウント管理の画面にログイン
  2. 「セキュリティ」→「2段階認証プロセス」を有効化
  3. 「アプリパスワード」を選択
  4. 任意のアプリ名(例: 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

ターミナルには上記実行結果が表示され、実際にメールが送信されます。

引数の意味

オプション説明
--urlGmailの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プランもあります。

https://www.zoho.com/jp

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 と組み合わせることで、通知処理を完全に自動化できる

この仕組みを導入することで、通知や監視業務を効率化し、インフラ運用の自動化を一歩進めることができます。

タイトルとURLをコピーしました