「シェルスクリプトの実行結果を自分宛てに飛ばしたい」
Linuxサーバーの運用では、cronジョブの結果通知やログ監視の異常検知など、コマンドラインから直接メールを送る場面が頻繁にあります。
この記事では、Linuxの
mail(mailx)コマンドについて、基本的な送受信から、件名の指定、標準入力からの送信、添付ファイル、シェルスクリプトとの連携、ローカルメールの確認方法までを解説します。現場のサーバー運用でそのまま使える実践パターンを中心にまとめています。・mailコマンドはローカルサーバーからメールを送受信するシンプルなコマンドで、cronやシェルスクリプトとの連携に最適
・件名は
-s、本文は標準入力、添付は-a(mailx)で指定するのが基本・ローカルメールの確認は
mailを引数なしで実行。メールスプールは/var/spool/mail/ユーザー名でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
mailコマンドとは?ローカルメールを扱う基本ツール
mailコマンドは、Linuxサーバー上からメールを送受信するためのコマンドです。現在のディストリビューションでは、後継のmailx(s-nail / bsd-mailx)として提供されていることが多く、mailはmailxへのシンボリックリンクになっています。対話操作を必要としないため、シェルスクリプトやcronジョブからの自動送信に向いているのが特徴です。GUIのメーラーと違って、サーバーに常駐するMTA(PostfixやSendmail)と連携してメールを送出します。
・主な用途:cronの実行結果通知、ログ監視の異常アラート、バッチ処理の完了通知
・前提:PostfixなどのMTAが起動しており、ローカルからの送信が許可されていること
・インストール:RHEL/CentOS系は
dnf install mailx、Debian/Ubuntu系はapt install bsd-mailx基本的な使い方
1. シンプルにメールを送信する
最も基本的な形は、件名を-sで指定し、本文を標準入力から流し込む方法です。# 件名と本文を指定して送信 echo "本文テスト" | mail -s "テスト送信" user@example.com
2. 複数の宛先に送る
宛先はスペースまたはカンマで区切って複数指定できます。CCやBCCは-c、-bで指定します。# CC付き、複数宛先に送信 echo "本文" | mail -s "件名" -c cc@example.com to1@example.com to2@example.com
3. ファイルの中身を本文として送る
ログファイルやレポートを本文に流し込みたい場合は、リダイレクトで読み込ませます。# /var/log/messages の末尾100行を送る tail -n 100 /var/log/messages | mail -s "messagesログ抜粋" admin@example.com
4. ファイルを添付して送る(mailx)
添付ファイルは-aオプションで指定します。mailxが入っている必要があります。# レポートファイルを添付して送信 echo "日次レポートです" | mailx -s "日次レポート" -a /tmp/report.csv admin@example.com
応用・実務Tips
cronと組み合わせてアラートを飛ばす
cronの実行結果通知はデフォルトでrootローカルに届きますが、外部アドレスへ転送したい場合はスクリプト内で明示的にmailを呼び出します。# crontab例:ディスク使用率が90%超えたらメール 0 * * * * df -h / | awk 'NR==2 && int($5)>=90 {print}' | mail -s "[ALERT] ディスク逼迫" admin@example.com
ヒアドキュメントで本文を書く
複数行の本文はヒアドキュメントで書くと可読性が上がります。# ヒアドキュメントで本文を記述 mail -s "週次レポート" admin@example.com <
送信元(From)を変更する
mailxでは-rオプションで送信元アドレスを指定できます。MTA側で許可されている必要があります。# Fromアドレスを指定して送信 echo "本文" | mailx -s "件名" -r "alert@example.com" admin@example.com
ローカルメールの受信と確認
mailを引数なしで実行すると、ローカルメールスプール(/var/spool/mail/ユーザー名)に届いているメールを一覧表示できます。対話モードに入り、番号を指定して本文を読み、dで削除、qで終了します。# 自分宛てのローカルメールを確認 mail # スプールファイルを直接見る less /var/spool/mail/$(whoami)
トラブルシュート・エラー対処
「mail: command not found」が出る場合
mailxパッケージが入っていません。以下でインストールしてください。# RHEL/CentOS/AlmaLinux/Rocky sudo dnf install -y mailx # Debian/Ubuntu sudo apt install -y bsd-mailx
メールが送信できない・届かない場合
・MTAが動いているか確認:systemctl status postfixで状態をチェック・キューに溜まっていないか:
mailqコマンドで送信待ちを確認・ログを見る:
tail -f /var/log/maillog(RHEL系)または/var/log/mail.log(Debian系)・外部宛メールが届かない:送信元IPの逆引きDNSやSPFレコードが未設定だと、GmailなどにSPAM判定される
件名が文字化けする場合
日本語件名はMIMEエンコードが必要です。nkfを挟むか、LANG=ja_JP.UTF-8を明示してください。# 件名をMIMEエンコードして送信 echo "本文" | LANG=ja_JP.UTF-8 mail -s "$(echo '日次レポート' | nkf -jM)" admin@example.com
本記事のまとめ
| やりたいこと | コマンド |
|---|---|
| 件名を指定して送信する | echo "本文" | mail -s "件名" user@example.com |
| ファイルの中身を本文にする | mail -s "件名" user@example.com < file.txt |
| CC・BCC付きで送信する | mail -s "件名" -c cc@ex.com -b bcc@ex.com to@ex.com |
| ファイルを添付する(mailx) | mailx -s "件名" -a /tmp/report.csv user@example.com |
| 送信元アドレスを変更する | mailx -s "件名" -r from@ex.com to@ex.com |
| ローカルメールを確認する | mail |
| メールキューを確認する | mailq |
サーバー運用の通知・監視を、自動化できるエンジニアになりませんか?
mail一本でも、cronやログ監視と組み合わせれば強力な運用自動化の武器になります。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:netstatコマンドでネットワーク情報を確認する方法|後継のssコマンドとの対応表も
- 前のページへ:whichコマンドでコマンドの場所を調べる方法|type・whereisとの違いも
- この記事の属するカテゴリ:Linuxコマンド・LinuxコマンドK-O・ネットワーク管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます