我自己也遇到了同样的问题,只有我将文本输出输入mailx
- Heirloom mailx 12.4 7/29/08
在命令行上运行脚本时,电子邮件作为带有文本正文的普通电子邮件出现。
然而,当我通过电子邮件的正文运行完全相同的脚本时crontab
,它以附件的形式出现 - ATT00001.BIN (Outlook)、application/octet-stream (mutt) 或“noname” (Gmail)。
花了一些研究来解决这个问题,但这里有:
问题
如果 Mailx 在文本输入中遇到未知/控制字符,则将其转换为设置了 application/octet-stream mime-type 的附件。
从手册页:
对于包含除换行符和水平制表符以外的格式字符的任何文件
所以你需要删除那些控制字符,这可以用ie来完成tr
echo "$Output" | /usr/bin/tr -cd '\11\12\15\40-\176' | mail ...
但是,因为我有挪威 UTF8 字符:æøå - 列表扩展,你真的不想维护这样的列表,我需要挪威字符。
并检查附件我发现我只有 \r, \n 范围为 32-176 的“常规”ASCII 字符 - 所有可打印以及184 和 195 --> UTF8
解决方案
在脚本中显式设置语言环境:
LANG="en_US.UTF8" ; export LANG
export
在您的 shell 中运行- 或者setenv
如果您运行csh
或tcsh
确定您的语言环境设置为什么。
解释
Mailx - 在您的 shell 中运行时 - LANG 设置为 .UTF8,将正确识别 UTF8 字符并继续。
未设置在crontab
LANG 中运行时,默认为 LANG=C,因为默认情况下 crontab 将仅运行一组受限制的环境变量(取决于系统)。
然后 mailx(或其他程序)将无法识别 UTF8 字符并确定输入包含未知控制字符。
我的问题是 UTF8 字符,你的可能是输入中的其他控制字符。hexdump
通过or运行它od -c
,但由于它在常规 shell 中工作正常,我怀疑 LANG 问题。
参考: