Приведенная ниже строка кода/команды работает так, как и ожидалось, если я запускаю ее из терминала 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]