消除 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