Ответ 1
Вы можете использовать параметр "-r" для установки адреса отправителя:
mailx -r [email protected] -s ...
Я работаю над сценарием KornShell (ksh), работающим на сервере Solaris, который будет отправлять электронное письмо при возникновении условия ошибки. Я отправляю электронное письмо через mailx
.
Вопрос: Как установить адрес электронной почты "От" в команде mailx
?
Текущий код:
echo ${msg_txt} | mailx -s "Script Failure" ${to_email}
Примечание. Команда работает нормально, однако "От" - это имя пользователя, от имени которого я запускаю сценарий, и я хотел бы для этого перейти на другой адрес электронной почты.
Как бы я это сделал?
Вы можете использовать параметр "-r" для установки адреса отправителя:
mailx -r [email protected] -s ...
Параметр "-r" недействителен в моих системах. Мне пришлось использовать другой синтаксис для поля "От".
-a "From: Foo Bar <[email protected]>"
Если вы также хотите включить свое реальное имя в поле, вы можете использовать следующий формат
mailx -r "[email protected] (My Name)" -s "My Subject" ...
Если у вас на вашем имени есть символы, отличные от ASCII, например My AEÆoeøaaå (Æ = C3 86, ø = C3 B8, å = C3 A5), вы должны закодировать их следующим образом:
mailx -r "[email protected] (My =?utf-8?Q?AE=C3=86oe=C3=B8aa=C3=A5?=)" -s "My Subject" ...
Надеюсь, это может спасти кого-то час тяжелой работы/исследования!
В debian, где bsd-mailx
установлен по умолчанию, параметр -r
не работает. Однако вместо этого вы можете использовать mailx -s subject [email protected] -- -f [email protected]
. Согласно man-странице, вы можете указать параметры sendmail после --
.
Просто столкнулся с этой проблемой синтаксиса на компьютере с CentOS 7.
На очень старой машине с Ubuntu, на которой запущен mail
, синтаксис хорошо составленной электронной почты:
echo -e "$body" | mail -s "$subject" -a "From: Sender Name <$sender>" "$recipient"
Однако на коробке CentOS 7, поставляемой с установленным mailx
, она совершенно другая:
echo -e "$body" | mail -s "$subject" -S "from=Sender Name <$sender>" "$recipient"
Консультация man mail
указывает, что -r
устарела, и теперь адрес отправителя "От" должен быть установлен непосредственно с помощью -S "variable=value"
.
В этих и последующих примерах я определяю
$sender
как"Sender Name <[email protected]>"
и$recipients
как"[email protected]"
, как я делаю в своем скрипте bash.
Затем, как и я, вы можете обнаружить, что когда вы пытаетесь сгенерировать содержимое тела письма в своем скрипте в момент отправки письма, вы сталкиваетесь со странным поведением, когда вместо этого тело письма прикрепляется в виде двоичного файла ("ATT00001. bin "," application/octet-stream "или" noname ", в зависимости от клиента).
Это поведение, как Heirloom mailx обрабатывает нераспознанные/управляющие символы при вводе текста. (Подробнее: https://access.redhat.com/solutions/1136493, которая сама ссылается на справочную страницу mailx для решения.)
Чтобы обойти это, я использовал метод, который направляет сгенерированный вывод через tr
перед передачей в mail
, а также указывает кодировку электронной почты:
echo -e "$body" | tr -d \\r | mail -s "$subject" -S "from=$sender" -S "sendcharsets=utf-8,iso-8859-1" "$recipients"
В моем сценарии я также заранее явно отключаю локаль, поскольку она выполняется как cronjob (а cron не наследует переменные окружения):
LANG="en_GB.UTF8" ; export LANG ;
(здесь обсуждается альтернативный способ установки локалей для cronjobs is discussed here)
Подробнее об этих обходных путях через fooobar.com/questions/954565/... и fooobar.com/questions/318372/....
Пакет nail
предоставляет улучшенный интерфейс mailx. Он включает опцию -r
.
В Centos 5 установка пакета mailx
дает вам программу под названием mail
, которая не поддерживает параметры mailx
.
В macOS Sierra создание ~/.mailrc с настройкой smtp сделало трюк:
set smtp-use-starttls
set smtp=smtp://smtp.gmail.com:587
set smtp-auth=login
set [email protected]
set smtp-auth-password=yourpass
Затем отправить почту из CLI:
echo "your message" | mail -s "your subject" [email protected]
На Ubuntu Bionic 18.04 это работает как нужно:
$ echo -e "testing email via yourisp.com from command line\n\nsent on: $(date)" | mailx --append='FROM:Foghorn Leghorn <[email protected]>' -s "test cli email $(date)" -- [email protected]