«mail» не работает в скрипте так же, как из командной строки

«mail» не работает в скрипте так же, как из командной строки

Приведенная ниже строка кода/команды работает так, как и ожидалось, если я запускаю ее из терминала Unix, но не если я включаю ее в скрипт и запускаю скрипт — то же самое.

Я ожидаю, что X-Priority покажет почту как высокоприоритетную в Outlook. Если я запущу его из командной строки, я увижу, что электронное письмо отображается правильно как высокоприоритетное, и я вижу, что файл прикреплен, а тело отображается так, как и должно быть. Однако, если я напишу его в виде скрипта оболочки и запущу скрипт, почта будет отформатирована как текст, а вложение будет добавлено к телу письма, и письмо будет отображаться в Outlook как обычно.

Не уверен, что я делаю неправильно. Любая помощь приветствуется.

Скрипт оболочки

#!/bin/sh
echo "Message Body" | mail -r "[email protected]" -c "[email protected]" -s "$(echo -e "Message Subject\nX-Priority: 1")" -a "logFile.log" "[email protected]"

Также протестировано с Shell Script

#!/bin/bash
echo "Message Body" | /usr/bin/mail -r "[email protected]" -c "[email protected]" -s "$(echo -e "Message Subject\nX-Priority: 1")" -a "logFile.log" "[email protected]"

Командная строка

echo "Message Body" | mail -r "[email protected]" -c "[email protected]" -s "$(echo -e "Message Subject\nX-Priority: 1")" -a "logFile.log" "[email protected]"

EDIT: Дополнительные подробности/наблюдения по дальнейшим исследованиям и разработкам:

В Subject, в моей фактической команде, есть назначение переменной, например MyApp : ${HostName} : Restarted\nX-Priority: 1. HostName— это переменная, которую я определил в скрипте. Если я заменю переменную жестко закодированным значением, например MyApp : myserver : Restarted\nX-Priority: 1, командная строка и скрипт будут вести себя точно так же. Если я оставлю переменную в командной строке, она будет работать так, как и ожидалось (часть X-Priority), но subject будет отображаться так, как и MyApp : : Restartedожидалось, поскольку переменная не определена.

Я попытался добавить неопределенную переменную в скрипт, но это все равно не сработало.

Надеюсь, это поможет глубже понять проблему.


Примечание: Первоначально я задал этот вопрос на stackoverflow. Но мне посоветовали задать его здесь -https://stackoverflow.com/questions/75585298/mail-not-working-in-script-same-way-it-is-working-from-command-line

--

решение1

Какую ОС/дистрибутив вы используете?

Многие дистрибутивы обычно используют BSD mailxв качестве псевдонима для mailкоманды, но может быть и альтернатива, или когда ваш скрипт запускается, у него другой PATH, и поэтому он использует другую программу, а не ту, которую вы ожидаете. (Возможно, у вашей ОС есть какие-то другие идеи относительно того, что mailдолжны делать пользователи.)

Попробуйте с вашего терминала:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

Затем то же самое в вашем сценарии, чтобы увидеть, есть ли что-то другое в ПУТЯХ

BSD mailxбудет где-то вроде/usr/bin/mailx

Похоже, что у него есть другие параметры, чем у любой mailкоманды, которую вы используете. (См. man mailx/ man mail). Вы пытаетесь получить:

Subject: Message Subject 
  X-Priority: 1

Или тема, затем дополнительный заголовок:

Subject: Message Subject
X-Priority: 1

bashудалит символы новой строки из переменных, если вы попытаетесь использовать их таким образом для вызова другой команды.

Если это mailx:

  • Указатьдополнительные поля заголовкав командной строке, например, «X-Loop: foo@bar» и т. д.

Я бы попробовал что-то вроде:

#!/bin/bash
echo "Message Body" | /usr/bin/mailx -a "X-Priority: 1" -s "Message Subject" -r [email protected] -c [email protected] -- [email protected]

Я не думаю, что есть (простой) способ заставить стандартную почту/mailx добавлять вложения. Этого она не умеет.

Вы можете использовать альтернативу, например, muttили neomutt:

options:

  --            Special argument forces NeoMutt to stop option parsing and treat
                remaining arguments as addresses even if they start with a dash

  -a <file>     Attach one or more files to a message (must be the last option)
                Add any addresses after the '--' argument

  -c <address>  Specify a carbon copy (Cc) recipient

  -s <subject>  Specify a subject (must be enclosed in quotes if it has spaces)


Похоже, что в любом случае это будет больше похоже на то, что вам нужно.

echo "Message Body" | mutt -s "Message Subject" \ 
-e "my_hdr X-Priority: 1" \
-e "my_hdr From: [email protected]" \ 
-c [email protected] \
-a /path/to/logFile.log \
-- [email protected]


echo "Message Body" | mutt -s "Message Subject" -e "my_hdr X-Priority: 1" -e "my_hdr From: [email protected]" -c [email protected] -a /path/to/logFile.log -- [email protected]

Связанный контент