如果我从 Unix 终端运行下面这行代码/命令,它会按预期工作,但如果我将其包含在脚本中并运行该脚本,则不会工作 - 完全相同。
我希望 X-Priority 在 Outlook 中将邮件显示为高优先级。如果我从命令行运行它,我会看到电子邮件正确显示为高优先级,并且我看到文件已附加,并且正文按预期显示。但是,如果我编写一个 shell 脚本并运行该脚本,邮件将格式化为文本,附件将附加到电子邮件正文中,并且电子邮件在 Outlook 中显示正常。
不确定我做错了什么。任何帮助我都感激不尽。
Shell 脚本
#!/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
作为命令的别名,但可能存在替代方法,或者当您的脚本运行时,它具有不同的 PATH,因此使用与您期望的不同的程序。(因为您的操作系统可能对用户应该做什么mail
有其他想法。)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]
不过,我认为没有一种(简单的)方法可以让普通的 mail/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]