sendmail – メールをMTAへ投入(送信)するコマンド

転送・同期
スポンサーリンク

sendmail はメール本文(RFC 5322 形式)を標準入力から受け取り、ローカルの MTA(Sendmail 本体や Postfix/OpenSMTPD などの互換実装)に**投入(enqueue)**します。多くの UNIX/Linux では /usr/sbin/sendmail が用意され、スクリプトやシステム通知の送信に使われます。(man7.org, Postfix)
実務では「cronの結果を送る」「アプリの通知メールを送る」「サーバ内のジョブから運用メールを発報する」などで利用します。(Nextcloud)

構文(Syntax)

# 宛先を引数で指定
sendmail [OPTIONS] RECIPIENT...

# ヘッダの To:/Cc:/Bcc: から宛先を読む(-t)
sendmail -t [OPTIONS]

# 代表的なオプションの書式
# 送信者名/アドレス、詳細表示など
sendmail -F "FULL NAME" -f [email protected] -v -t
  • -t を付けると本文の To:/Cc:/Bcc: から宛先を抽出(Bcc: は送信時に削除)します。引数での宛先指定は不要です。(man7.org)

主なオプション一覧

オプション説明使用例
-tTo:/Cc:/Bcc: を読んで宛先を決定(Bcc: は削除)printf "Subject: test\nTo: [email protected]\n\nHi\n" | sendmail -t (man7.org)
-f ADDRESSエンベロープ送信者(Return-Path)を設定(実装により制限あり)... | sendmail -t -f [email protected] (man7.org, Polarhome)
-F NAME送信者のフルネーム(ヘッダの表示名)を設定... | sendmail -t -F "CI Bot" (man7.org)
-v詳細ログを表示(やり取りを表示)... | sendmail -t -v (man7.org)
-i / -oi行頭に単独の . があっても終端とみなさない(SMTP互換のドットエスケープを無効化)... | sendmail -t -oi (Polarhome, OSR507 Documentation)
-Am / -Acsendmail.cf(MTA)/ submit.cf(クライアント投入用)を選択sendmail -Ac -t ... (Oracle Docs)
-q[INTERVAL]キュー処理を行う(-q15m で15分ごとに処理等)sendmail -q15m (linuxfromscratch.org)
互換実装の注意Postfix/OpenSMTPD などの sendmail 互換は、上記の一部のみサポート(未対応は黙殺)(例) Postfix 互換 sendmail(1) (Postfix)

※ 実装差:OpenSMTPD/Postfix 互換の sendmail は最低限の -t/-f/-F/-v を提供し、他フラグは無視される場合があります。(man7.org, Postfix)

実行例

1) ヘッダに宛先を書いて送る(最小構成)

説明: -t でヘッダから宛先を読む基本形。
コマンド:

printf "Subject: Hello\nTo: [email protected]\n\nThis is a test.\n" | sendmail -t

ポイント: Bcc: があっても送信時にヘッダから除去されます。(man7.org)

2) 宛先を引数で指定して送る(-t を使わない)

説明: ヘッダに To: を書かず、引数で宛先を渡す。
コマンド:

printf "Subject: Hi\n\nBody\n" | sendmail -v [email protected] [email protected]

ポイント: -t を付けない場合は少なくとも1件の宛先引数が必要です。(man7.org)

3) 送信者名・エンベロープ送信者を指定

説明: 差出人名と Return-Path を指定して送る(アプリ通知など)。
コマンド:

printf "Subject: Report\nTo: [email protected]\n\nDone.\n" \
| sendmail -t -F "CI Bot" -f [email protected]

注意: -f は MTA 側の「信頼ユーザ」設定などで制限される場合があります。(Polarhome)

4) ドットのみ行を含む本文を安全に送る(-oi)

説明: SMTP では単独の . 行が終端扱い。ログ等をそのまま送るなら -oi を付与。
コマンド:

some_command | sendmail -t -oi <<'EOF'
Subject: log
To: [email protected]

...(ログの中に単独の . 行があってもOK)
EOF

背景: -oi/-i は単独ドット行での終端を無効化します。(Polarhome)

5) エラー例:-t なのにヘッダに宛先がない

説明: To:/Cc:/Bcc: が無いと「宛先が見つからない」エラー。
コマンド:

printf "Subject: NoTo\n\nBody\n" | sendmail -t

出力例(代表例):

No recipient addresses found in message header

To: を追加するか、-t を外して宛先を引数で渡してください) (lists.archlinux.org)

関連コマンド

  • mail / mailx:ユーザ向けのメール送信/閲覧フロントエンド。内部で sendmail を呼ぶことが多い。(Linux Command Library)
  • mailq / postqueue:メールキューを表示。(Oracle Docs)
  • newaliases/etc/aliases の再構築。
  • postfix / smtpd / dma:別実装の MTA(いずれも sendmail 互換の投入コマンドを提供)。(Postfix, man7.org, Debian Manpages)

備考

  • 実装差(重要): 多くのシステムで /usr/sbin/sendmail は「互換インターフェース」です。Postfix/OpenSMTPD では未対応のフラグが黙って無視される場合があります。移植性を重視するなら -t/-f/-F/-v 程度に留め、詳細な制御は MTA 側設定で行うのが安全です。(Postfix, man7.org)
  • 設定ファイルとの関係: 伝統的な sendmail.cf は直接編集せず、sendmail.mc から生成します。8.12以降は投稿専用の submit.cf が導入され、一般ユーザーはこれを使って安全に投入できます。(Oracle Docs)
  • Bcc の扱い: -t 使用時、Bcc: ヘッダは送信前に削除されます(受信者に Bcc が露出しない)。(man7.org)
  • 権限と制限: -f で任意の送信者を名乗るのは MTA 設定で制限されることがあります(「信頼ユーザ」概念など)。(Polarhome)
  • 互換ラッパと切替: BSD 系では mailwrapper/mailer.conf により sendmail 互換コマンドの実体を切替可能です。(Socsvn)

参考

  • manページ(OpenSMTPD 互換 sendmail(8)):(man7.org)
  • Postfix の互換 sendmail(1):(Postfix)
  • Sendmail(Oracle ドキュメント・コマンドライン引数/設定):(Oracle Docs)
  • Red Hat Deployment Guide(Sendmail 概要):(Red Hat Docs)
  • mailwrapper / mailer.conf(MTA 切替の仕組み):(Socsvn)
スポンサーリンク
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント