Невозможно прикрепить файл и включить текст при отправке электронного письма в linux

Приведенная ниже команда отправит электронное письмо с темой и телом, но без вложения. Если я удалю < /usr/tmp/BODY_OF_EMAIL, я получу электронное письмо с темой и вложением, но без тела.

cat /usr/tmp/ATTACHMENT.xls | uuencode ATTACHMENT.xls | mailx -s "Subject of email!" emailaddress@company.com < /usr/tmp/BODY_OF_EMAIL

/ usr / tmp / BODY_OF_EMAIL содержит текст «Тело сообщения электронной почты».

Процесс mailx (как и любой другой процесс) имеет только один стандартный ввод. Вы, вероятно, захотите использовать cat для объединения тела и незашифрованного файла (BTW, называя это «вложением», предполагает составное / смешанное MIME, но это не то, что вы делаете - даже если ваш MUA заставляет их выглядеть одинаково!).

Toby Speight 13.09.2018 19:13
0
1
1 570
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Использование mailx:

(cat /usr/tmp/BODY_OF_EMAIL;
 echo; 
 uuencode ATTACHMENT.xls < /usr/tmp/ATTACHMENT.xls ) | 
 mailx -s "Subject of email!" emailaddress@company.com

Использование nail:

nail -s "Subject of email!" -a /usr/tmp/ATTACHMENT.xls emailaddress@company.com < /usr/tmp/BODY_OF_EMAIL

Почтовик nail иногда устанавливается как mail, но он понимает MIME для реальных вложений.

Во-первых, нет необходимости использовать cat для подачи uuencode, который вполне может читать из файла:

uuencode /usr/tmp/ATTACHMENT.xls ATTACHMENT.xls | ...

Основная проблема, с которой вы столкнулись, связана с этой частью:

... | mailx < body_text_file

Существует только один стандартный входной поток, поэтому, когда вы даете оболочке противоречивые инструкции, подобные этой, он должен выбрать, какое перенаправление вступит в силу (на самом деле происходит то, что stdin изначально настроен на поступление из конвейера процесса, а затем при чтении < , который отключается и заменяется файловым потоком).

Вероятно, вы захотите использовать cat для объединения основного текста с файлом в кодировке uuencoded, например:

... | cat body_text_file - | mailx

(Я предполагаю, что основной текст является введением, и поэтому идет первым - поменяйте аргументы на cat, если я ошибаюсь).

Тогда ваша полная команда будет

uuencode /usr/tmp/ATTACHMENT.xls ATTACHMENT.xls \
  | cat /usr/tmp/BODY_OF_EMAIL - \
  | mailx -s "Subject of email!" emailaddress@example.com

В своем ответе я был обеспокоен тем, что в BODY_OF_EMAIL может отсутствовать последний перевод строки, и использовал решение, которое компенсирует.

Cupcake Protocol 13.09.2018 19:21

Да, хорошая идея. Альтернативой является сохранение файла, содержащего только новую строку, и включение ее в аргументы cat.

Toby Speight 13.09.2018 19:23

Другие вопросы по теме