「郵件」在腳本中的工作方式與從命令列工作的方式不同

「郵件」在腳本中的工作方式與從命令列工作的方式不同

如果我從 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]

相關內容