วิธี 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

sendmailmailเป็นไบนารีที่ถูกใช้โดยระบบของคุณเพื่อกำหนดเส้นทางอีเมลที่ถูกส่งไปได้โดย มันเป็นส่วนหนึ่งของชุดโปรแกรมเช่นsendmail , postfix , eximและอื่น ๆ ดังนั้นคุณจึงจำเป็นต้องติดตั้งแพคเกจที่เหมาะสมสำหรับอีเมล บอกการกระจายลินุกซ์ที่คุณใช้
adamo

รูปแบบที่สอดคล้องกับ POSIX ทั้งหมดของ UNIX / Linux ควรมีไฟล์ปฏิบัติการที่เรียกว่า "sendmail" และใช้ชุดตัวเลือกเฉพาะซึ่งเข้ากันได้กับชุดย่อยของฟังก์ชั่นของ sendmail (รวมถึงตัวเลือก -t ที่อธิบายไว้ในคำตอบของ Exim, Postfix และ qmail ให้สิ่งเหล่านี้ --- บางครั้งพวกมันจะถูกติดตั้งภายใต้ / usr / libexec / sendmail แทนที่จะเป็น / usr / bin หรือ / usr / sbin
Jim Dennis

คำตอบ:


3

/ usr / sbin / sendmail

มันผิด

คุณควรมีmailคำสั่งบางที่ mailxมันอาจจะเรียกว่า ควรอยู่ใน/bin/ไดเรกทอรี ในฐานะที่เป็นมาตรฐานการปฏิบัติสคริปต์ PHP ไม่ควรเรียกร้องอะไรในหรือ/sbin /usr/sbinโปรแกรม sbin นั้นใช้สำหรับรูท

นอกจากนี้ php ยังมีฟังก์ชั่นเมลในตัว


หากไม่ได้mailหรือmailxอาจเป็นMailได้ แต่ถึงแม้ว่าเหล่านั้นไม่ได้อยู่ที่คุณสามารถติดตั้งโง่และเรียกใช้mutt -xซึ่ง mailxemulates
adamo

นี่คือความจริง ... เพื่อตรวจสอบเส้นทางของฉันฉันวิ่งและมันกลับมาwhich mail /bin/mail
เว็บเน็ต

2
sendmail เป็นวิธีที่ดีกว่า (เป็นมาตรฐาน Posix) ... แต่การใช้ sendmail -t ดีกว่า (ใช้ส่วนหัวจากอินพุตสตรีม) นี่เป็นการหลีกเลี่ยงช่องโหว่การแก้ไขตัวแปรเชลล์ที่เป็นไปได้จำนวนมากโดยการอนุญาตให้โปรแกรมส่งจดหมายโต้ตอบกับยูทิลิตี้ sendmail เท่านั้นโดยไม่ต้องเรียกใช้เชลล์ใด ๆ เลย) ดูคำตอบ "timday's" สำหรับรายละเอียดที่ดีกว่า
Jim Dennis

13

ในระบบ Debian ของฉัน (ซึ่งมี Exim มากกว่า sendmail "ของจริง" แต่ยังคงมี 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ล่ะ
adamo

@adamo: เพราะมันใกล้เคียงกับรูปแบบของคำถามต้นฉบับเพื่อไพพ์ลงใน sendmail ด้วย '|' (และในความเป็นจริงสถานที่ที่ฉันทำสิ่งนี้ด้วยตัวเองเป็นสิ่งปกติเช่น generate_test_message.sh | sendmail -t)
อังคารที่

2
นี่เป็นวิธีการที่ยอมรับได้ในการส่งจดหมายแบบเป็นโปรแกรมที่ปลอดภัยภายใต้ UNIX
Jim Dennis

ในที่สุดก็มีตัวอย่างการทำงานสำหรับ 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
สวัสดีและยินดีต้อนรับสู่ Server Fault บางทีคุณอาจอธิบายรายละเอียดเล็กน้อยได้ไหม?
slm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.