Как задать адрес электронной почты From для команды mailx?
Вопрос
Я работаю над скриптом KornShell (ksh), запущенным на сервере Solaris, который отправит электронное письмо при выполнении условия ошибки.Я отправляю электронное письмо через mailx
.
Вопрос: Как мне указать адрес электронной почты "От" в mailx
командовать?
Текущий Код:
echo ${msg_txt} | mailx -s "Script Failure" ${to_email}
Примечание:Команда работает нормально, однако "From" - это имя пользователя, от имени которого я запускаю скрипт, и я хотел бы отправить его на другой адрес электронной почты.
Как бы я этого добился?
Решение
Вы можете использовать опцию «-r», чтобы установить адрес отправителя:
mailx -r me@example.com -s ...
Другие советы
Опция «-r» недействительна в моих системах.Мне пришлось использовать другой синтаксис для поля «От».
-a "From: Foo Bar <foo.bar@someplace.com>"
В случае, если вы также хотите указать свое настоящее имя в поле "От кого", вы можете использовать следующий формат
mailx -r "me@example.com (My Name)" -s "My Subject" ...
Если у вас в имени есть символы, отличные от ASCII, например, мой aeaeoeøaaå (Æ = C3 86, ø = C3 B8, å = C3 A5), вы должны закодировать их следующим образом:
mailx -r "me@example.com (My =?utf-8?Q?AE=C3=86oe=C3=B8aa=C3=A5?=)" -s "My Subject" ...
Надеюсь, это сэкономит кому-то час напряженной работы / исследований!
В Дебиане где bsd-mailx
устанавливается по умолчанию, -r
вариант не работает.Однако вы можете использовать mailx -s subject recipient@abc.com -- -f sender@abc.com
вместо.Согласно справочной странице, вы можете указать параметры sendmail после --
.
Пакет nail
предоставляет улучшенный интерфейс, подобный mailx.Он включает в себя -r
вариант.
На Centos 5 установка пакета mailx
дает вам программу под названием mail
, который не поддерживает mailx
параметры.
Только что столкнулся с этой синтаксической проблемой на машине 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 <sender.address@domain.tld>"
и$recipients
как"recipient.name@domain.tld"
как я делаю в своем 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"
В моем сценарии я также заранее явно указываю локаль, поскольку она запускается как задание cron (и cron не наследует переменные среды):
LANG="en_GB.UTF8" ; export LANG ;
(Альтернативный метод установки локалей для cronjobs. обсуждается здесь)
Дополнительную информацию об этих обходных путях можно найти на странице https://stackoverflow.com/a/29826988/253139 и https://stackoverflow.com/a/3120227/253139.
В macOS Sierra создание ~/.mailrc с настройкой smtp помогло:
set smtp-use-starttls
set smtp=smtp://smtp.gmail.com:587
set smtp-auth=login
set smtp-auth-user=youremail@gmail.com
set smtp-auth-password=yourpass
Затем, чтобы отправить почту из CLI:
echo "your message" | mail -s "your subject" to_email@gmail.com
В Ubuntu Bionic 18.04 это работает по желанию:
$ echo -e "testing email via yourisp.com from command line\n\nsent on: $(date)" | mailx --append='FROM:Foghorn Leghorn <fleghorn@yourisp.com>' -s "test cli email $(date)" -- recipient@acme.com