10

我想在一台 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 时,电子邮件会收到文本,有人可以为我解释一下吗,感激不尽。

4

4 回答 4

12

我自己也遇到了同样的问题,只有我将文本输出输入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如果您运行cshtcsh确定您的语言环境设置为什么。

解释

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

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

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

我的问题是 UTF8 字符,你的可能是输入中的其他控制字符。hexdump通过or运行它od -c,但由于它在常规 shell 中工作正常,我怀疑 LANG 问题。

参考:

于 2014-06-27T12:20:40.240 回答
9

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

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

感谢这个论坛:

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

于 2015-04-23T14:47:49.873 回答
1

确保在脚本中更改它

#/bin/sh

被替换为

#!/bin/sh

解决问题

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

修复电子邮件中出现的文本

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
于 2013-09-25T08:26:42.780 回答
0

在我的例子中,cron 不是一个 shell 脚本,而是一个 PHP 脚本(所以我不能放这个export LANG东西):

0 9 * * * apache php /test/myscript.php | mail -s "CRON - myscript" foo@bar.com

解决方案:

为了解决同样的问题(内容作为附件而不是正文邮寄),我LANG=fr_FR.UTF-8在 cron 文件的开头添加:

MAILTO=vme1.etc-crond-backoffice-conf
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
LANG=fr_FR.UTF-8

0 9 * * * apache php /test/myscript.php | mail -s "CRON - myscript" foo@bar.com

注意:放入文件LANG=fr_FR.UTF-8/etc/environment重新启动 cron 服务也可以。


参考:

于 2021-09-27T13:06:58.657 回答