簡體   English   中英

使用crontab job發送郵件,email文本轉為附件ATT00001.bin

[英]Use crontab job send mail, The email text turns to an attached file which named ATT00001.bin

我想分析一台 linux 服務器中的一些數據,然后將其作為 Email 文本發送到我的 Email 帳戶,但是當我在 shell 命令中執行這個 shell 腳本時,它運行良好,奇怪的是當我將所有程序放入 crontab 作業時, Email 的文字會變成一個附件,有人可以幫忙嗎?

#* * * * * 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時,Email會得到文本,誰能幫我解釋一下,謝謝。

我自己也遇到了同樣的問題,只有我將文本輸出發送到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 ...

但是因為我有挪威語UTF8字符:æøå - 列表擴展,你真的不想維護這樣的列表,我需要挪威字符。

並檢查附件,我發現我只有\\ r,\\ n范圍32-176中的“常規”ASCII字符 - 所有可打印 184和195 - > UTF8

Sollution

在腳本中明確設置區域設置:

LANG="en_US.UTF8" ; export LANG

在shell中運行export - 如果運行cshtcsh ,則運行setenv以確定您的語言環境設置為什么。

說明

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

來了問題

您的腳本假定它是從特定目錄運行的(請注意,幾乎每個路徑都是相對路徑,而不是絕對路徑)。 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

在我的例子中,cron 不是 shell 腳本而是 PHP 腳本(所以我不能把export LANG東西):

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

解決方案:

為了解決同樣的問題(內容作為附件而不是正文郵寄),我在 cron 文件的開頭添加了LANG=fr_FR.UTF-8

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 服務也有效。


參考:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM