使用crontab作业发送邮件,电子邮件文本转换为名为ATT00001.bin的附件

我想分析一个Linux服务器中的一些数据,然后将它作为电子邮件文本发送到我的电子邮件帐户,但是当我在shell命令中执行这个shell脚本,它工作正常,奇怪的是,当我把所有的程序放入crontab作业,电子邮件文本将变成一个附件,有人可以帮忙吗?

#* * * * * sh -x /opt/bin/exec.sh >> /opt/bin/mailerror 2>&1 /* exec.sh */ #/bin/sh cd /opt/bin ./analysis.sh > test mail -s "Today's Weather" example@example.com < test 

但是当我直接在shell命令行执行exec.sh时,电子邮件会得到文本,有人可以为我解释,谢谢。

Solutions Collecting From Web of "使用crontab作业发送邮件,电子邮件文本转换为名为ATT00001.bin的附件"

自己跑到同一个问题,只有我管道文本输出到mailx – 传家宝mailx 12.4 7/29/08

当在命令行上运行脚本时,电子邮件以正常的电子邮件形式出现在文本正文中。
但是,当我通过crontab运行完全相同的脚本时,电子邮件正文是附件 – ATT00001.BIN(Outlook),应用程序/八位字节流(mutt)或“noname”(Gmail)。

花了一些研究来解决这个问题,但是这里有:

问题

如果遇到文本输入中的未知/控制字符,Mailx会将其转换为application / octet-stream mime-type set的附件。

从手册页:

对于包含除换行符和水平制表符以外的格式化字符的任何文件

所以你需要删除那些控制字符,这可以用ie tr来完成

 echo "$Output" | /usr/bin/tr -cd '\11\12\15\40-\176' | mail ... 

然而,因为我有挪威的UTF8字符:列表展开,你并不真正想维护这样一个列表,我需要挪威字符。

并检查附件,我发现我只有\ r,\ n在范围32-176“常规”ASCII字符 – 所有可打印 184和195 – > UTF8

Sollution

在脚本中明确设置区域设置:

 LANG="en_US.UTF8" ; export LANG 

在shell中运行export – 或者setenv如果你运行cshtcsh来确定你的语言环境设置为什么。

说明

Mailx – 在shell中运行时,LANG设置为.UTF8,将正确识别UTF8字符并继续。

crontab运行时,LANG没有设置,默认为LANG = C,因为默认情况下crontab将只运行一组受限制的环境变量(取决于系统)。

mailx(或其他程序)将无法识别UTF8字符,并确定输入包含未知的控制字符。

我的问题是UTF8字符,你的输入可能是其他控制字符。 运行它通过hexdumpod -c ,但因为它在一个正常的shell中工作正常,我怀疑LANG问题。

参考文献:

我有这个相同的问题,以上都没有解决这个问题。 移动文件中的额外回报为我解决了这个问题:

 cat logfile | tr -d \\r | mailx -s'the logfile' to-me@..... 

感谢这个论坛:

https://forums.opensuse.org/showthread.php/445955-mailx-creates-unwanted-attachment

确保你在你的脚本中改变了这个

 #/bin/sh 

被…取代

 #!/bin/sh 

来解决这个问题

你的脚本假定它正在从一个特定的目录运行(注意,几乎每个路径都是相对路径,而不是绝对路径)。 正好从另一个目录运行它。

电子邮件上显示的文字的修复

 mydir=$(dirname "$0") && cd "${mydir}" || exit 1 ./opt/bin/analysis.sh > test mail -s "Today's Weather" example@example.com < /opt/bin/test 

说明

$ 0是正在执行的shell脚本的文件名(可能是相对的)。 给定一个文件名,dirname命令返回包含文件名的目录。 所以,该行将目录更改为包含脚本的目录,或者如果dirname或cd失败,则会退出并显示错误代码。

或尝试像完整的路径

 ./opt/bin/analysis.sh > test mail -s "Today's Weather" example@example.com < /opt/bin/test 

注意:同样的问题在前面讨论过

跟进:

尝试删除

sh -x /opt/bin/exec.sh >> /opt/bin/mailerror 2>&1

而是使用

sh /opt/bin/exec.sh 2>&1 >> /opt/bin/mailerror

跟进

如果您不使用crontab命令编辑文件,则必须重新启动cron才能使更改生效。

 crontab -l > oldcrontab cp oldcrontab newcrontab echo "$newline" >> newcrontab crontab < newcrontab