コマンドラインパイピングでsendmailを送信する方法


9

ファイルを実行するcronコマンドがあり、メールで送信されるように出力を設定しようとしています。ダイレクトファイルを変更したくないサードパーティのスクリプトでこれを使用しているため、PHPを変更する代わりに出力をパイプ処理する必要があります。

私が使用しているサーバーからの移行だmailという用途のサーバへsendmail。コマンドラインから件名をsendmailに正しく送信する方法を見つけるのに苦労しています。

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" test@email.com

sendmailによって送信されたメールをルーティングするためにシステムで使用されるバイナリですmail。これは、sendmailpostfixeximなどの一連のプログラムの一部です。したがって、メールに適切なパッケージをインストールする必要があります。使用しているLinuxディストリビューションを教えてください。
adamo

UNIX / LinuxのすべてのPOSIX準拠形式は、「sendmail」という名前の実行可能ファイルを提供し、sendmailの機能のサブセットと互換性のある特定のオプションセットを提供します(以下のtimdayの回答で説明されている-tオプションを含む)。Exim、Postfix、qmailはすべてこれらを提供します。たとえば、/ usr / binや/ usr / sbinではなく、/ usr / libexec / sendmailの下にインストールされる場合があります。
ジム・デニス

回答:


3

/ usr / sbin / sendmail

それは間違っている。

mailどこかにコマンドがあるはずです。と言うことができますmailx/bin/ディレクトリにある必要があります。標準的な方法として、phpスクリプトは、/sbinまたはで何も呼び出してはなりません/usr/sbin。sbinプログラムは通常、root用です。

また、phpにはメール機能が組み込まれています


そうでない場合、mailまたはmailx可能性がありますMail。しかし、それらが存在しない場合でも、muttをインストールしmutt -xてエミュレートするrun を実行できますmailx
adamo

これは本当です...私の道を決定するために、私は走りましたwhich mail、そしてそれは戻りました/bin/mail
Webnet 2012年

2
sendmailはより良いアプローチです(Posix標準です)...しかし、sendmail -t(入力ストリームからヘッダーを取得)を使用することをお勧めします。これにより、メールを送信するプログラムが、シェルをまったく呼び出さずにsendmailユーティリティとのみやり取りできるようにすることで、シェル変数の補間に関する多くの脆弱性が回避されます。詳細については、「timday's」の回答を参照してください。
ジム・デニス

13

私のDebianシステム( "本物の" sendmailではなくEximを持っていますが、互換性のためにsendmailバイナリを持っています)では、スクリプトからメールを送信したいときは、次のようなことを行います。

cat <<EOF | sendmail -t
To: recipient@example.com
Subject: Testing
From: sender@example.com

This is a test message
EOF

空白行が重要であることに注意してください。


1
空白行は、メッセージのヘッダー部分とメッセージ本文を区切るために使用されます。なんでsendmail -t <<EOF
アダモ2012年

@adamo: '|'でsendmailにパイプするのは元の質問のパターンに近いため (そして実際、私が自分でこれを行う場所は、一般的にはgenerate_test_message.sh | sendmail -tのようなものです)。
timday

2
これは、UNIXでプログラムによるメールを安全に送信するための標準的なアプローチです。
ジム・デニス

ついにsendmailの実用的な例を手に入れました!ありがとうございました!
Insidepower

sendmail失敗してSTDERRに書き込む場合、後でスクリプトで使用する変数としてこれをどのようにキャプチャできますか?
Streetster、

1
echo -e "This is my body\nSecond line" 2>&1 | sed '1!b;s/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

echo =メールの本文。
sed stuff =メールのヘッダーと、本文とヘッダーの間に重要な二重線を適用します。
sendmail -t = sendmailを介して直接パイプします。


-1
php -f file.php 2>&1 | sed 's/^/To: test@email.com\nSubject: My Test Email Subject\n\n/' | sendmail -t

1
こんにちは、サーバーフォールトへようこそ。おそらく、あなたの答えを少し詳しく説明できますか?
slm 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.