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

Ale*_*lex 10 linux email shell crontab

我想在一个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
Run Code Online (Sandbox Code Playgroud)

但是当我直接在shell命令行中执行exec.sh时,Email会得到文本,有人可以帮我解释一下,谢谢.

sas*_*rsl 10

我自己也mailx遇到了同样的问题,只有我正在输出文字输出- Heirloom mailx 12.4 7/29/08

在命令行上运行脚本时,电子邮件将显示为带有文本正文的普通电子邮件.
但是,当我通过crontab电子邮件的正文运行完全相同的脚本作为附件 - ATT00001.BIN(Outlook),application/octet-stream(mutt)或"noname"(Gmail).

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

问题

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

从手册页:

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

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

echo "$Output" | /usr/bin/tr -cd '\11\12\15\40-\176' | mail ...
Run Code Online (Sandbox Code Playgroud)

但是因为我有挪威语UTF8字符:æøå - 列表扩展,你真的不想维护这样的列表,我需要挪威字符.

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

Sollution

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

LANG="en_US.UTF8" ; export LANG
Run Code Online (Sandbox Code Playgroud)

export在shell中运行- 或者setenv如果您运行cshtcsh确定您的语言环境设置为什么.

说明

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

如果crontab未设置LANG 运行,并且默认为LANG = C,则默认情况下crontab将仅运行一组受限制的环境变量(取决于系统).

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

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

参考文献:


adi*_*s12 8

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

cat logfile | tr -d \\r | mailx -s'the logfile' to-me@.....
Run Code Online (Sandbox Code Playgroud)

感谢这个论坛:

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


Sri*_*niV 1

确保在脚本中更改此设置

#/bin/sh
Run Code Online (Sandbox Code Playgroud)

被替换为

#!/bin/sh
Run Code Online (Sandbox Code Playgroud)

谈到问题

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

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

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

解释

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

或者尝试拥有完整路径,例如

./opt/bin/analysis.sh > test 
mail -s "Today's Weather" example@example.com < /opt/bin/test
Run Code Online (Sandbox Code Playgroud)

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

跟进:

尝试删除

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
Run Code Online (Sandbox Code Playgroud)