![尝试通过邮件发送多个文本附件](https://linux22.com/image/79284/%E5%B0%9D%E8%AF%95%E9%80%9A%E8%BF%87%E9%82%AE%E4%BB%B6%E5%8F%91%E9%80%81%E5%A4%9A%E4%B8%AA%E6%96%87%E6%9C%AC%E9%99%84%E4%BB%B6.png)
在“Red Had Enterprise Linux Server 版本 5.11 (Tikanga)”上运行此脚本
邮件是:版本8.1 6/6/93(看起来很旧)。
尝试了各种方法,但似乎无法使其发挥作用。
echo "Email message" | mail -a /home/user/checks/notprocessed.txt -a /home/user/checks/dirlist.txt -s "Subject" [email protected] /home/user/checks
结果消息:
邮件:无效选项 -- a
mutt 尚未安装,我对该系统的访问权限有限,因为它属于我工作的公司所有。我可以添加其他组件,但必须经历变更管理和相关流程。
uuencode 也不可用。
这是我今天使用的,我正在尝试添加第二个文件:
if grep 'Not Empty' /home/user/checks/notprocessed.txt
then
echo "files were found";
SUBJECT="NIGHTLY DIRECTORY LISTING OF FILES SENT TO VENDOR";
FROM="SENDER<[email protected]>"
# EMAIL="JOHN DOE<[email protected]>"
EMAIL="MARY DOE<[email protected]>";
/bin/mail -s "$SUBJECT" "$EMAIL" -- -f "$FROM" < /home/user/checks/notprocessed.txt /home/user/checks/dirlist.txt
exit -20
fi
并且.. /home/user/checks/dirlist.txt 未附加或包含在电子邮件中。我希望 /home/user/checks/dirlist.txt 实际上是一个附件
这实际上确实有效 - 但包括 notprocessed.txt 作为电子邮件的正文。
if grep 'Not Empty' /home/user/checks/notprocessed.txt
then
echo "files were found";
SUBJECT="NIGHTLY DIRECTORY LISTING OF FILES SENT TO VENDOR";
FROM="SENDER<[email protected]>"
# EMAIL="JOHN DOE<[email protected]>"
EMAIL="MARY DOE<[email protected]>";
/bin/mail -s "$SUBJECT" "$EMAIL" -- -f "$FROM" < /home/user/checks/notprocessed.txt
exit -20
fi
答案1
好吧,当您执行标准输入重定向(<
)时,会发生的情况是,第一个文件(而且只有第一个)被打开,并将其内容传递到mail
使用它作为正文的标准输入。
由于您的mailx
实现较旧,因此它不支持当前版本的-a
标志来创建 MIME 附件。您可以做的是使用可用的东西自己创建 MIME 格式。
幸运的是,使用简单的 bash 脚本并不难(我 100% 确定该脚本可用,即使在 RHEL 5 上也是如此:-)),就像这样简单的事情可能会做到:
#!/bin/bash
msgid="$RANDOM$RANDOM$RANDOM$RANDOM"
to="$1"
shift
subject="$1"
shift
echo "To: $to"
echo "From: [email protected]"
echo "Subject: $subject"
echo "Message-ID: $msgid"
echo "MIME-Version: 1.0"
echo "Content-Type: multipart/mixed; boundary=$msgid"
echo "" # header termination
while [ -n "$1" ]; do
echo "--$msgid"
echo "Content-Type: text/plain; charset=UTF-8"
echo "Content-Disposition: attachment; filename=\"$(basename $1)\""
echo "Content-Transfer-Encoding: base64"
echo ""
base64 < "$1"
shift
done
然后您只需将生成的电子邮件文本提交以sendmail
进行传递,如下所示:
mail.sh "$SUBJECT" "$EMAIL" /home/user/checks/notprocessed.txt \
/home/user/checks/dirlist.txt | sendmail -t
该脚本使用base64
“ASCII Armor”文件的命令,因此您可以发送文本和二进制文件,但如果您不发送文本文件,您可能想弄清楚如何正确设置附件Content-type
(或者只是将其全部更改为application/octet-stream
,即“二进制”)。该命令作为 RHEL 5 上 coreutils 的一部分提供,因此我预计使用它不会出现任何问题。
另请注意,使用该-t
标志可以sendmail
使 MTA 仅从邮件本身读取电子邮件信封,因此无需在sendmail
命令参数中添加任何其他内容。只需确保脚本在输出中包含所有需要的字段 - 我已经让它像那样从命令行读取收件人和主题mailx
,但这不是必需的,而且发件人地址无论如何都是硬编码的。