【问题标题】:Procmail sends an extra emailProcmail 发送额外的电子邮件
【发布时间】:2013-08-20 00:45:58
【问题描述】:

我使用 procmail 将某些“发件人”转发到 Gmail 帐户

/home/user/.procmailrc

:0c
* !^FROM_MAILER
* ^From: .*aaa | bbb | ccc.*
! ^X-Loop: user@gmail\.com
| formail -k -X "From:" -X "Subject:" \
-I "To: user@gmail.com" \
-I "X-Loop: user@gmail.com"
:0
* ^From: .*aaa | bbb | ccc.*
$DEFAULT

这工作正常,但在我的服务器收件箱中,我也收到了“未送达”的邮件

邮件系统 (扩展自 ):未知用户: "^x-循环:"

如何避免这种情况?

我已尝试删除这些邮件。 这不是最好的方法。

无论如何它不起作用。

:0B * <"\^X-Loop:"@my-name-server.com> 
/dev/null 

【问题讨论】:

    标签: forwarding procmail


    【解决方案1】:

    配方包含多个语法错误,但出现退回消息是因为您在其中一个条件行上缺少星号,这使其成为操作行。

    Procmail 配方的一般语法是

    :0flags       # "prelude", with optional flags
    * condition   # optional, can have zero conditions
    * condition   # ...
    action
    

    action 可以是邮箱名称,也可以是 ! 后跟要将邮件转发到的目标邮箱,或者 | 后跟 shell 管道。

    所以您的第一个配方是“如果不是来自邮件程序并匹配来自:...,请转发到 ^X-Loop:

    之后的 | formail ... 行只是一个语法错误并被忽略,因为它需要位于前奏行 :0 和(可选)一些条件行之后。

    此外,^From: 正则表达式显然是错误的。它将匹配From: .*aaabbb(两边都有空格,在任何标题中,而不仅仅是From: 标题)或ccc

    最后,其意图显然是将生成的消息实际转发到某处。

    :0c
    * ! ^FROM_MAILER
    *   ^From:(.*\<)?(aaa|bbb|ccc)
    * ! ^X-Loop: user@gmail\.com
    | formail -I "X-Loop: user@gmail.com" | $SENDMAIL $SENDMAILFLAGS user@gmail.com
    

    如果您只是想转发传入的消息,其他-X-I 以及当然-k 选项是多余的或错误的。如果他们确实完成了与这个问题无关的事情,也许您需要将其中的部分或全部添加回来(并且还记得使用-X 提取您使用-I 添加的任何新标头,否则它们将被抑制;这很糟糕)。

    您的第二个配方也是多余的,除非您稍后在文件中有更多的 Procmail 配方,这些信息应该专门绕过这些配方。 (如果是这样,您还需要在此处修复 From: 正则表达式。)

    【讨论】:

    • .*(aaa|bbb|ccc).* 这意味着“包含其中之一”?...你建议 (.*\
    • 正则表达式 (.*\&lt;)? 的意思是“任何东西,只要它以单词边界结尾”(\&lt; 在单词边界处成功,在 Procmail 的正则表达式方言中,以及许多其他语言中)。所以是的,这基本上翻译为“发件人:标头包含 aaa 或 bbb 或 ccc 之一,未嵌入更长的字符串中”(取决于错误匹配的概率,您可能还想在最后一个之后添加 \&gt; 保护右括号)。
    • 您不需要尾随 .* -- 如果表达式可以匹配字符串中的任何位置,则正则表达式成功。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多