Як 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. Це частина набору програм, таких як sendmail , postfix , exim тощо. Тож вам потрібно встановити відповідний пакет для пошти . Тож скажіть нам, що ви використовуєте дистрибутив Linux.
адамо

Усі сумісні форми UNIX / Linux, що відповідають сумісності POSIX, повинні надавати виконуваний файл з назвою "sendmail" і приймати певний набір опцій, сумісних із підмножиною функціональності sendmail (включаючи опцію -t, описану у відповіді timday, нижче). Exim, Postfix і qmail - це все, вони інколи - інколи вони будуть встановлені під / usr / libexec / sendmail, а не / usr / bin або / usr / sbin, наприклад.
Джим Денніс

Відповіді:


3

/ usr / sbin / sendmail

Це неправильно.

Ви повинні мати mailкоманду десь. Це можна було б назвати mailx. Повинен бути в /bin/каталозі. Як звичайна практика, php-скрипти ніколи не повинні дзвонити в /sbinабо /usr/sbin. Програми sbin, як правило, для root.

Також php має вбудовану функцію пошти .


Якщо його немає mailчи mailxможе бути Mail. Але навіть якщо таких не існує, ви можете встановити mutt і запустити mutt -xемуляцію mailx.
адамо

Це правда ... щоб визначити мій шлях, я побіг which mailі він повернувся /bin/mail.
Вебнет

2
sendmail - кращий підхід (це стандарт Posix) ... але краще використовувати sendmail -t (взяти заголовки з вхідного потоку). Це дозволяє уникнути багатьох можливих вразливих місць інтерполяції змінної оболонки, дозволяючи програмі, що надсилає пошту, взаємодіяти лише з утилітою sendmail, не викликаючи жодної оболонки взагалі). Детальнішу інформацію див. У відповіді "Тимдень".
Джим Денніс

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: Тому що це було ближче до шаблону в оригінальному питанні, щоб передати його на sendmail із "| (а насправді місця, які я роблю сам, це, як правило, щось на кшталт generator_test_message.sh | sendmail -t).
тайм

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.