mutt の送信遅延の削除
当初は mutt の組み込み SMTP MTA を使用していました。しかし、送信ボタンを押した後にかなりの一時停止が発生します。これは、set sendmail_wait=-1
内の外部 MTA を使用することで無効にできますmuttrc
。
msmtp
ただし、 をMTA として使用すると、エラーは通知されません (で指定されたとおりmsmtp
に書き込みは行われます)。logfile
~/.msmtprc
通知を取得しようとする
コマンドラインから、msmtp
失敗したときにコマンドをトリガーできます。
</tmp/tosend msmtp -a default [email protected] --read-envelope-from || echo failed
おそらく、失敗通知をローカルの *nix メールにメールで送信できるでしょう。ただし、 で以下を設定した場合、これは mutt では機能しないようですmuttrc
。
set sendmail = "/usr/bin/msmtp || date >> /tmp/msmtp.fail"
msmtp
これにより、 の次のエラーが表示され、すべての電子メールがサイレントに送信されなくなります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
「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