遇到問題:
統計報表實現基本思想,按處理流程順序
1) 利用scp下載遠程線上機器的Log日誌文件
2) 利用awk,sed,sort等Linux下命令過濾並且分析日誌,生成基本的模板(template)文本。
3) 根據該模板(template)文本統計信息生成HTML格式的郵件正文。
4) 根據該模板(template)文本統計信息生成CVS、TXT、XLS格式的統計信息作爲郵件附件。
5) 利用sendmail或者mutt命令發送郵件。
6) 利用crontab計劃任務定時發送日報、週報、月報。
問題就出現在步驟5)。開始我嘗試利用
mutt來實現發送HTML格式正文郵件並且附帶附件:
mutt -e "my_hdr content-type:text/html" -s "郵件標題" -a 附件.xls
[email protected] < mail.html
用outlook做客戶端接收郵件,發現附件丟失了,變成了正文裏的亂碼,如果不加-e "my_hdr content-type:text/html"參數,附件成功又不能顯示HTML格式郵件,期間google了各種mutt相關問題官方FAQ都無從知曉爲什麼,現在看來既有可能是mutt版本沒有升級到1.5的一個bug,但自己不是admin也沒法裝最新版本的mutt,最終選擇放棄使用mutt。
解決方法:
編寫以下兩個函數,其中sendmail()函數配好參數,就可以直接調用了。這樣就可以發送帶多媒體附件的HTML格式正文的郵件了。在此感謝@lingbing同學的幫助。
#發送多媒體附件的HTML格式正文的函數 (多媒體附件指非txt或者cvs格式的文件,例如excel的xls)
#$1: mail_from
#$2: mail_to
#$3: subject
#$4: content mimetype, such as "text/plain"
#$5: content
#$6: attach mimetype, such as "text/csv"
#$7: attach display name
#$8: attach file path
function SendMailMultiMediaAttach(){
local MSG_FILE="/tmp/mail.tmp"
echo "From: $1" > $MSG_FILE
echo "To: $2" >> $MSG_FILE
echo "Subject: $3" >> $MSG_FILE
echo "Mime-Version: 1.0" >> $MSG_FILE
echo 'Content-Type: multipart/mixed; boundary="GvXjxJ+pjyke8COw"' >> $MSG_FILE
echo "Content-Disposition: inline" >> $MSG_FILE
echo "" >> $MSG_FILE
echo "--GvXjxJ+pjyke8COw" >> $MSG_FILE
echo "Content-Type: $4" >> $MSG_FILE
echo "Content-Disposition: inline" >> $MSG_FILE
echo "" >> $MSG_FILE
echo "$5" >> $MSG_FILE
echo "" >> $MSG_FILE
echo "" >> $MSG_FILE
echo "--GvXjxJ+pjyke8COw" >> $MSG_FILE
echo "Content-Type: $6" >> $MSG_FILE
echo "Content-Transfer-Encoding: base64" >> $MSG_FILE
echo "Content-Disposition: attachement; filename=$7" >> $MSG_FILE
echo "" >> $MSG_FILE
echo "" >> $MSG_FILE
${BIN_PATH}/base64 -e $8 >> $MSG_FILE
cat $MSG_FILE | /usr/lib/sendmail -t
}
##! @TODO: 發送郵件
##! @AUTHOR: zhangxu
##! @VERSION: 1.0
##! @IN:
##! @OUT:
function sendMail()
{
echo "Sending $Subject mail from $From to $To"
from="[email protected]"
to="[email protected]"
subject="${Subject}"
content_type="text/html"
body=`cat $MAIL_HTML`
attach_type="application/vnd.ms-excel"
attach_name="${file_title}.xls"
attach_path="${TEMP_DIR}/${file_title}.xls"
SendMailMultiMediaAttach "$from" "$to" "$subject" "$content_type" "$body" "$attach_type" "$attach_name" "$attach_path"
echo "Send mail done."
}
要注意以下幾點:
2) 如何判斷自己的附件是不是純文本的呢?Windows下如果可以用notepad記事本打開,或者Linux下可以用cat顯示正常的都是可以用text/plain的MIME TYPE的,其他的一律需要用1)中提到的對應的編碼格式,還要保證又base64編碼再發送出去,郵件客戶端或者接受者可以base64解碼還原。這就是之所以Content-Transfer-Encoding: base64用
base64並且要用base64
-e <文件名>編碼的原因,base64命令可以Google下並下載。