Procmail 变量和配方语法

Procmail 变量和配方语法

我正在尝试理解 procmailrc 语法。从我读过的文档中,我可以使用设置自己的变量VARNAME=value,然后通过引用在其他地方使用它们$VARNAME

我也知道食谱会过滤邮件输入以执行不同的操作(处置)

我有一个带有单个配方和两个变量的 procmailrc,如下所示:

SUBJECT='formail -xSubject:'
FROM='formail -rt -xTo:'

:0:
* !^From:.gmail\.com
| (formail) | $SENDMAIL -t -oi
archive

我是否可以说,在这种情况下,变量SUBJECTFROM是不相关的,因为它们在文件中其他地方没有使用?

另外,我对正则表达式不太在行,但从我读过的文档(procmail 和 regex)来看,我说的配方会过滤掉不包含“From:Xgmail.com”的邮件,其中 X 是任意字符,对吗?也就是说,如果电子邮件中有mail from:<gmail.com>,它将不会被这个配方过滤,但如果电子邮件中有,那么它将被过滤?mail from:<[email protected]>

另外,在倒数第二行,如果 formail 没有任何参数,那么它会将响应邮件发送到哪里,内容是什么?有默认值吗?

最后,最后一行是否意味着邮件的副本放在邮件目录中的“存档”文件中?

答案1

首先,您的示例包含语法错误。一个配方只能包含一个动作。事实上,您的配方将被有效地解析为

:0:
* !^From:.gmail\.com
| (formail) | $SENDMAIL -t -oi

archive=''

您还会收到“忽略无关的本地锁文件”的信息,因为 Procmail 无法找出用于管道操作的锁文件。

如果您想要对一个菜谱执行两个操作,请使用括号:

:0
* !^From:.gmail\.com
{
  :0c
  | (formail) | $SENDMAIL -t -oi
  :0:
  archive
}

括号内第一个配方上的标志c表示“这不是最终交付”;默认情况下,当消息被视为已交付时,Procmail 将停止处理消息。

还要注意单引号和反引号之间的区别。你的任务创建了包含引号之间的文本的变量。想必你真正想说的是

SUBJECT=`formail -xSubject:`  # not SUBJECT='formail -xSubject:'
FROM=`formail -rt -xTo:`  # not FROM='formail -rt -xTo:'

事实上,如果您从未将这些变量用于任何事情,那么分配它们是没有意义的(尽管还有其他变量对于 Procmail 来说是特殊的,因此分配例如LOGFILELOCKFILESENDMAIL将对 Procmail 的操作产生影响)。

formail不带参数的命令只是将标准输入传递到标准输出,并对标头进行一些规范化。我认为它在这里没有发挥任何有用的作用。命令周围的括号导致它在单独的 shell 中运行,这也是毫无意义和低效的。

再次使用 发送邮件sendmail -t将产生邮件循环,因此,如果您处理的邮件不能保证一定会发送到当前地址,那么您可能根本不想执行此操作Bcc:(在这种情况下,邮件将发送到可见的邮件会发送到标题中的收件人,但不会再发送给您;因此,不存在邮件循环)。

正则表达式中的^将搜索锚定到行首,因此之前不能有其他文本From:,并且未转义的点与除换行符之外的任何字符匹配,正如您所解释的那样;更好的正则表达式可能是^From:(.*\<)?gmail\.com至少要求之前有一个非单词字符gmail.com(但这不是有效的电子邮件地址,所以也许我无法正确猜测您希望完成什么)。最后,就像您已经弄清楚的那样,感叹号否定了正则表达式,因此当正则表达式不匹配时会触发配方。

也许你已经发现http://www.iki.fi/era/procmail/quickref.htmlhttp://www.iki.fi/era/mail/procmail-debug.html- 尽管这些已经过时了,但希望它们能够帮助您解决今后的一些问题。

相关内容