如果我從 Unix 終端機運行下面的程式碼/命令行,它會按預期工作,但如果我將其包含在腳本中並運行腳本,則不會 - 完全相同。
我希望 X 優先權在 Outlook 中將郵件顯示為高優先權。如果我從命令列運行它,我會看到電子郵件正確顯示為高優先級,並且我看到文件已附加且正文按預期顯示。但是,如果我編寫一個 shell 腳本並運行該腳本,郵件將被格式化為文本,附件將附加到電子郵件正文中,並且電子郵件將在 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 腳本進行了測試
#!/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]"
編輯:更多細節/進一步研發的觀察:
在主題中,在我的實際命令中,有一個變數賦值,例如MyApp : ${HostName} : Restarted\nX-Priority: 1
.
HostName
是我在腳本中定義的變數。如果我替換變數硬編碼值(例如 )MyApp : myserver : Restarted\nX-Priority: 1
,則命令列和腳本的行為完全相同。如果我將變數保留在命令列中,它會按預期工作(X-Priority 部分),但主題會如MyApp : : Restarted
預期出現,因為變數未定義。
我嘗試在腳本中添加未定義的變量,但它仍然不起作用。
希望這能讓人們對這個問題有更多的見解。
注意:我最初在 stackoverflow 中問過這個問題。但有人建議我在這裡問 -https://stackoverflow.com/questions/75585298/mail-not-working-in-script-same-way-it-is-working-from-command-line
--
答案1
您使用什麼作業系統/發行版?
許多發行版通常使用 BSDmailx
作為命令的別名mail
,但可能會有替代方案,或者當您的腳本運行時,它具有不同的 PATH,因此使用與您期望的程式不同的程式。 (因為也許您的作業系統對於mail
用戶應該做什麼有一些其他想法。)
從您的終端嘗試:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
然後在你的腳本中進行相同的操作,看看 PATHS 是否有不同
BSDmailx
將在類似的地方/usr/bin/mailx
不過,它看起來與mail
您使用的任何命令都有不同的選項。 (看man mailx
/ man mail
)。您是否想獲得:
Subject: Message Subject
X-Priority: 1
或者主題,然後是一個附加標題:
Subject: Message Subject
X-Priority: 1
bash
如果您嘗試像這樣使用變數來呼叫另一個命令,您將從變數中刪除換行符。
如果它是mailx
:
- -A指定附加標頭字段在命令列上,例如“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]