Cara mengirim email melalui pemipaan baris perintah

9

Saya memiliki perintah cron yang menjalankan file dan saya mencoba mengatur output sehingga mengirimkan email kepada saya. Saya menggunakan ini dengan skrip pihak ke-3 yang saya tidak ingin memodifikasi file langsung, jadi saya perlu menyalurkan output alih-alih memodifikasi PHP.

Saya bermigrasi dari server yang menggunakan mailke server yang menggunakan sendmail. Saya kesulitan menemukan cara mengirim subjek ke sendmail dengan benar melalui baris perintah.

/usr/local/bin/php -f /path/to/file.php 2>&1 | /usr/sbin/sendmail -s "My Test Email Subject" [email protected]
Webnet
sumber
sendmailadalah biner yang digunakan oleh sistem Anda untuk merutekan email yang dikirimkan kepadanya mail. Ini adalah bagian dari serangkaian program seperti sendmail , postfix , exim , dan sebagainya. Jadi, Anda perlu menginstal paket yang sesuai untuk surat . Jadi, beri tahu kami distribusi linux yang Anda gunakan.
adamo
Semua bentuk POSIX dari UNIX / Linux harus menyediakan beberapa executable bernama "sendmail" dan mengambil serangkaian opsi tertentu yang kompatibel dengan subset fungsi sendmail (termasuk opsi -t, dijelaskan dalam jawaban timday, di bawah). Exim, Postfix, dan qmail semuanya menyediakan ini --- kadang-kadang mereka akan diinstal di / usr / libexec / sendmail daripada / usr / bin atau / usr / sbin, misalnya.
Jim Dennis

Jawaban:

3

/ usr / sbin / sendmail

Itu salah.

Anda harus memiliki mailperintah di suatu tempat. Itu bisa disebut mailx. Harus di /bin/direktori. Sebagai praktik standar, skrip php tidak boleh memanggil apa pun di /sbinatau /usr/sbin. Program sbin biasanya untuk root.

Juga, php memiliki fungsi surat bawaan .

ablackhat
sumber
Jika tidak mailatau mailxmungkin Mail. Tetapi bahkan jika itu tidak ada, Anda dapat menginstal mutt dan menjalankan mutt -xyang mengemulasi mailx.
adamo
Ini benar ... untuk menentukan jalan saya, saya berlari which maildan kembali /bin/mail.
Webnet
2
sendmail adalah pendekatan yang lebih baik (ini adalah standar Posix) ... tetapi lebih baik menggunakan sendmail -t (ambil header dari aliran input). Ini menghindari banyak kemungkinan kerentanan interpolasi variabel shell dengan memungkinkan program pengiriman email berinteraksi hanya dengan utilitas sendmail tanpa menggunakan shell sama sekali). Lihat jawaban "timday's" untuk perincian yang lebih baik.
Jim Dennis
13

Pada sistem Debian saya (yang memiliki Exim daripada sendmail "nyata", tetapi masih memiliki biner sendmail untuk kompatibilitas), ketika saya ingin mengirim email dari skrip saya melakukan sesuatu yang setara dengan:

cat <<EOF | sendmail -t
To: [email protected]
Subject: Testing
From: [email protected]

This is a test message
EOF

Perhatikan bahwa baris kosong itu penting.

timday
sumber
1
Baris kosong digunakan untuk memisahkan bagian tajuk pesan dari badan pesan. Kenapa tidak sendmail -t <<EOF?
adamo
@adamo: Karena lebih dekat dengan pola pada pertanyaan awal untuk mengirim ke sendmail dengan '|' (dan sebenarnya tempat saya melakukan ini sendiri umumnya adalah sesuatu seperti generate_test_message.sh | sendmail -t).
timday
2
Ini adalah pendekatan kanonik untuk pengiriman surat terprogram yang aman di bawah UNIX.
Jim Dennis
akhirnya mendapat contoh untuk sendmail! Terima kasih!
Insidepower
jika sendmailgagal dan menulis ke STDERR, bagaimana saya bisa menangkap ini sebagai variabel untuk digunakan nanti dalam skrip?
streetster
1
echo -e "This is my body\nSecond line" 2>&1 | sed '1!b;s/^/To: [email protected]\nSubject: My Test Email Subject\n\n/' | sendmail -t

echo = Badan email.
sed stuff = Menerapkan tajuk email, dan dua baris penting antara tajuk dan tajuk.
sendmail -t = Memipangnya langsung melalui sendmail.

Praveen R
sumber
-1
php -f file.php 2>&1 | sed 's/^/To: [email protected]\nSubject: My Test Email Subject\n\n/' | sendmail -t
bernstein
sumber
1
Hai dan selamat datang di Server Fault. Mungkin Anda bisa sedikit menguraikan jawaban Anda?
slm