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

相关内容