Sendmail 失败时生成退回邮件

Sendmail 失败时生成退回邮件

当外发邮件无法到达 smtp 外部服务器时(由于我的本地互联网连接问题),我尝试接收退回邮件。

我使用以下方式发送电子邮件: mutt (撰写) - procmail - esmtp (代替 sendmail) - GMail smtp 服务器

当我的连接断开并且无法访问 gmail smtp 时,我需要收到来自我的电子邮件本地系统的退回邮件的提醒。

procmail 是否是为获得此行为而设置的正确“链中链接”?如何配置它的弹跳?

编辑:

.muttrc:

set sendmail="/usr/bin/formail -s /usr/bin/procmail -t -m /home/$myuser/.procmailoutrc"

.procmailoutrc:

MAILCONF=$HOME/.mail
LOGFILE=$MAILCONF/procmailout.log
LOGSENDMAIL=$MAILCONF/esmtp.log 
[...]
:0
* ^From.*address@gmail
{
        :0c:
        address@gmail
        :0
        | formail -I 'From ' | sendmail -v -t -X "$LOGSENDMAIL"
}

esmtprc:

identity address@gmail
        hostname smtp.gmail.com:587
        username "address@gmail"
        password "*"
        starttls required
        helo "*"
mda='/usr/bin/formail -a "Date: `date -R`" | /usr/bin/procmail -d %T'`

由于我发现以下错误:

"SMTP server problem Temporary failure in name resolution"

写在$LOGFILE而不是写在 中$LOGSENDMAIL,我认为 procmail 能够管理此返回的错误并向我的邮箱发送“传递失败”消息。

正如您在我的配置中看到的,mboxes 名称与真实电子邮件地址相同......

答案1

您将标准输出重定向sendmail到日志文件,但标准错误未重定向,因此最终出现在 Procmail 日志文件中。

我想这会sendmail设置一个合适的退出代码,并且如果您愿意,您可以在失败时简单地生成本地退回消息。

这变得足够复杂,我会创建一个单独的脚本,尽管代码可以可能以某种方式内联到你的.procmailout

#!/bin/sh
t=$(mktemp -t sendout.XXXXXXXXXXXX) || exit
trap 'rm -f "$t"' EXIT
trap 'exit 123' HUP INT TERM
formail -I "From " >"$t"
sendmail -v -t -X "$@" <"$t" && exit

# If we reached here, it's a failure
rc=$?
( printf "To: $USER\nFrom: MAILER_DAEMON\nSubject: Bounce\n\n"
  printf "The following message failed to send.  So sorry.\n\n"
  cat "$t" ) | sendmail -oi -t
exit $rc

您可以将此脚本作为sendout您的某个位置发送PATH(确保它PATH也在 Procmail 中)并像这样调用它

:0
| sendout "$LOGSENDMAIL"

库存Sendmail在邮件无法立即投递的情况下的正常模式是将邮件排队并在几个小时后报告临时失败,然后重试,直到大约一周过去,如果仍然无法投递,则将邮件返回为无法投递发表。我不熟悉,esmtp但在我看来,Sendmail 的默认行为(因此在某些配置中 Postfix、Exim 等)可能会符合您的喜好,所以也许只需切换到其中之一(如果esmtp不能的话)配置为类似的行为)并避免创建您自己的解决方案。

相关内容