消除 mutt 的發送延遲
我最初使用的是mutt內建的SMTP MTA。然而,點擊發送後有相當長的停頓。這可以透過使用帶有set sendmail_wait=-1
in 的外部 MTA 來停用muttrc
。
但是,如果我用作msmtp
MTA,則不會有錯誤通知(儘管會按照 中指定的方式msmtp
進行寫入)。logfile
~/.msmtprc
嘗試取得通知
從命令行,我可以在失敗時觸發命令msmtp
。
</tmp/tosend msmtp -a default [email protected] --read-envelope-from || echo failed
可以想像,我可以將失敗通知郵寄到我的本地 *nix 郵箱。但是,如果我在muttrc
.
set sendmail = "/usr/bin/msmtp || date >> /tmp/msmtp.fail"
這會導致所有電子郵件無法靜默發送,並在msmtp
s中出現以下錯誤logfile
。
Nov 05 10:53:09 host=mail.bar.com tls=on auth=on [email protected] [email protected] recipients=||,date,>>,/tmp/msmtp.fail,[email protected] smtpstatus=501 smtpmsg='501 #5.1.1 bad address ' errormsg='recipient address >> not accepted by the server' exitcode=EX_DATAERR
顯然,mutt
正在將命令的額外部分解析為接收者。
問題
有沒有辦法在後台發送時獲取發送失敗的電子郵件的通知?我沒有msmtp
必然的束縛。
答案1
為自己編寫一個小型 shell 腳本以用作「sendmail」值。~/.muttrc
例如配置
set sendmail = /home/yourid/bin/mymuttsendmail
並mymuttsendmail
放入類似的東西
#!/bin/bash
tmp=$(mktemp /tmp/mymutt.XXXXXX)
cat >$tmp
( if ! msg=$(msmtp "$@" <$tmp 2>&1)
then zenity --error --text "$msg"
fi
rm $tmp
) &
exit 0
和chmod +x
這個文件。請記住,此腳本將使用收件者作為額外參數進行調用,我們將其傳遞給 msmtp "$@"
,郵件將位於 stdin 上,我們立即將其複製到臨時檔案中,然後傳遞給msmtp
。任何錯誤訊息都會捕獲在變數中msg
,如果返回程式碼失敗,您可以運行彈出對話框,例如 zenity。
答案2
您是否考慮過使用更好的 nullmailer,msmtp
盡可能簡約?或者甚至像 exim 或 postfix 這樣的完整 MTA(它們配置起來並不困難)?
其他 nullmailer 選項的清單位於http://linuxmafia.com/faq/Mail/nullmailers.html
答案3
meuh的回答非常有幫助。這是 mymuttsendmail 的簡單版本。在以下程式碼中替換username
為您的用戶名,以便在出現錯誤時可以在本機向您發送電子郵件。變數$?儲存 msmtp 的退出代碼,並在發送電子郵件時發生錯誤時使用本機郵件向您發送電子郵件。只要記住設定 sendmail_wait=-1 即可。
#!/bin/bash
/usr/bin/msmtp "$@" 2>&1
VAL=$?
if (($VAL))
then
# message not sent
echo "Error sending mail to $@, exit code $VAL" | mail -s 'ERROR' username
fi