我正在尝试理解 procmailrc 语法。从我读过的文档中,我可以使用设置自己的变量VARNAME=value
,然后通过引用在其他地方使用它们$VARNAME
我也知道食谱会过滤邮件输入以执行不同的操作(处置)
我有一个带有单个配方和两个变量的 procmailrc,如下所示:
SUBJECT='formail -xSubject:'
FROM='formail -rt -xTo:'
:0:
* !^From:.gmail\.com
| (formail) | $SENDMAIL -t -oi
archive
我是否可以说,在这种情况下,变量SUBJECT
和FROM
是不相关的,因为它们在文件中其他地方没有使用?
另外,我对正则表达式不太在行,但从我读过的文档(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 来说是特殊的,因此分配例如LOGFILE
或LOCKFILE
或SENDMAIL
将对 Procmail 的操作产生影响)。
formail
不带参数的命令只是将标准输入传递到标准输出,并对标头进行一些规范化。我认为它在这里没有发挥任何有用的作用。命令周围的括号导致它在单独的 shell 中运行,这也是毫无意义和低效的。
再次使用 发送邮件sendmail -t
将产生邮件循环,因此,如果您处理的邮件不能保证一定会发送到当前地址,那么您可能根本不想执行此操作Bcc:
(在这种情况下,邮件将发送到可见的邮件会发送到标题中的收件人,但不会再发送给您;因此,不存在邮件循环)。
正则表达式中的^
将搜索锚定到行首,因此之前不能有其他文本From:
,并且未转义的点与除换行符之外的任何字符匹配,正如您所解释的那样;更好的正则表达式可能是^From:(.*\<)?gmail\.com
至少要求之前有一个非单词字符gmail.com
(但这不是有效的电子邮件地址,所以也许我无法正确猜测您希望完成什么)。最后,就像您已经弄清楚的那样,感叹号否定了正则表达式,因此当正则表达式不匹配时会触发配方。
也许你已经发现http://www.iki.fi/era/procmail/quickref.html和http://www.iki.fi/era/mail/procmail-debug.html- 尽管这些已经过时了,但希望它们能够帮助您解决今后的一些问题。