Cron
如何從 Vixie-cron (debian) 和 msmtp 自定義電子郵件標題?
我在讓 cron 發送電子郵件方面遇到了一些麻煩。我的 ISP 要求“發件人:”欄位與發送電子郵件的電子郵件地址相匹配,否則電子郵件將被拒絕。由於 cron 將“發件人:”欄位硬編碼為“root(Cron 守護程序)”,因此不會發送這些電子郵件。
我已經設置了 msmtp 並且可以從命令行毫無問題地發送電子郵件。事實上,我已經將我的一些 cron 作業包裝在一個發送電子郵件本身的腳本中。這很好用,但我想要一個更優雅的解決方案。
我最初使用的是 package
msmtp-mta
,它只是符號連結/usr/lib/sendmail
,/usr/bin/msmtp
以便 cron 使用 msmtp 發送電子郵件。由於這不起作用,我刪除了包並放入了一個 bash 腳本,/usr/lib/sendmail
而不是應該從標準輸入中讀取並發送帶有正確標題的電子郵件:#!/bin/bash HEADERS="To: <myemail> From: Cron <myotheremail> Subject: Vixie-cron snooper ($@) " INPUT=$( cat /dev/stdin ) echo -e "$HEADERS""Stdin:\n$INPUT\n" | msmtp <myemail> echo "$HEADERS""Stdin:\n$INPUT\n" > /tmp/vixielog
但是,這並沒有達到預期的效果。我剛剛收到一封幾乎是空的電子郵件,
/tmp/vixielog
其中包含相同的內容:To: <myemail> From: Cron <myotheremail> Subject: Vixie-cron snooper (-i -FCronDaemon -oem <myemail>) Stdin:
電子郵件來得正是時候,所以我知道 cron 作業正在正常執行,但我沒有得到輸出。我如何調整這種方法以在電子郵件中獲取命令的輸出?
最終我得出了以下解決方案。我沒有使用
mstmp-mta
,而是編寫了自己的簡單 bash 腳本來充當 MTA。放置在 中/usr/sbin/sendmail
,它會替換 From 標頭並繼續發送電子郵件。#!/bin/bash sed -e "s/From: root (Cron Daemon)/From: WHATEVER YOU LIKE/" | msmtp $BASH_ARGV
希望這可以幫助任何想要解決問題的輕量級解決方案的人。
它不需要知道郵件頭的來源(以前的文章來自:root(Cron Daemon)):
#!/bin/bash # /usr/sbin/sendmail # We write the sent letter to the stdin variable stdin=$(cat) # Text to which we will replace the From header: __REPLACE_WITH="sender name <your.from.mail@domain.com>" # Find the text between From: and To :, write it to the __FIND_WHAT variable. __FIND_WHAT=$(echo $stdin | grep -o -P '(?<=From: ).*(?=To:)') # grep command (above) adds a space to the variable at the end of the line. It must be deleted, otherwise the text replacement will not work. # Remove the space at the end of the variable __FIND_WHAT=$( echo $__FIND_WHAT | sed -e 's/\s$//g' ) # Replace the text __FIND_WHAT with __REPLACE_WITH mail=$(echo "$stdin" | sed -e "s/$__FIND_WHAT/$__REPLACE_WITH/" ) # Send a letter, with the correct sender in the header of the letter. echo -e "$mail" | msmtp $BASH_ARGV