Linux自動發送HTML格式並帶附件的郵件(轉)

Linux自動下發送HTML格式並帶附件的郵件

遇到問題:

統計報表實現基本思想,按處理流程順序
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."
}
 
要注意以下幾點:
1) 多媒體文件對應的格式可以從下面的鏈接參考,用於替換參數$6的mimetype。http://www.w3schools.com/media/media_mimeref.asp
2) 如何判斷自己的附件是不是純文本的呢?Windows下如果可以用notepad記事本打開,或者Linux下可以用cat顯示正常的都是可以用text/plain的MIME TYPE的,其他的一律需要用1)中提到的對應的編碼格式,還要保證又base64編碼再發送出去,郵件客戶端或者接受者可以base64解碼還原。這就是之所以Content-Transfer-Encoding: base64用base64並且要用base64 -e <文件名>編碼的原因,base64命令可以Google下並下載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章