消除 mutt 的發送延遲

消除 mutt 的發送延遲

消除 mutt 的發送延遲

我最初使用的是mutt內建的SMTP MTA。然而,點擊發送後有相當長的停頓。這可以透過使用帶有set sendmail_wait=-1in 的外部 MTA 來停用muttrc

但是,如果我用作msmtpMTA,則不會有錯誤通知(儘管會按照 中指定的方式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"

這會導致所有電子郵件無法靜默發送,並在msmtps中出現以下錯誤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 

相關內容