Как отправить письмо через командную строку

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
Webnet
источник
sendmailэто двоичный файл, который используется вашей системой для маршрутизации почты, которая отправляется ему mail. Он является частью набора программ, таких как sendmail , postfix , exim и так далее. Поэтому вам необходимо установить соответствующий пакет для почты . Так скажите нам, какой дистрибутив Linux вы используете.
Адамо
Все POSIX-совместимые формы UNIX / Linux должны обеспечивать некоторый исполняемый файл с именем «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 имеет встроенную функцию почты .

ablackhat
источник
Если это не так mailили mailxможет быть Mail. Но даже если таких не существует, вы можете установить Mutt и запустить, mutt -xкоторый эмулирует mailx.
Адамо
Это правда ... чтобы определить мой путь, я побежал, which mailи он вернулся /bin/mail.
Webnet
2
Sendmail - лучший подход (это стандарт Posix) ... но лучше использовать sendmail -t (взять заголовки из входного потока). Это позволяет избежать многих возможных уязвимостей интерполяции переменных оболочки, позволяя программе, отправляющей почту, взаимодействовать только с утилитой sendmail, не вызывая вообще никакой оболочки). Смотрите ответ "Timday's" для более подробной информации.
Джим Деннис
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

Обратите внимание, что пустая строка важна.

timday
источник
1
Пустая строка используется для отделения части заголовка сообщения от тела сообщения. Почему бы sendmail -t <<EOFи нет?
Адамо
@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