【发布时间】:2018-06-16 16:30:52
【问题描述】:
我的 fetchmail 脚本从邮箱中检索电子邮件并将它们放入名为 mario 的文件中,然后将其转储到我的 /var/mail/ 文件夹中。我正在尝试设置一个 procmail 脚本来处理 mario;通过处理,这就是我的意思:procmail 脚本应该过滤包含已知电子邮件地址列表的外部文本文件 (fromlist)。一旦匹配到mario/fromlist,消息就会从mario 中取出并存储到我的本地nbox/ 文件夹中。
在网上,我发现了一段代码,包括一个配方,我已将其输入到我的 procmail 控制文件 (.procmailrc) 中,但它似乎不起作用。这是代码:
FROMFL=$MAIL/fromlist
FROMLS=formail -xFrom: | sed -e 's/*(.*)//;s/>.*//;s/.*[:]*//'`
:0
* ? fgrep -xi $FROMLS $FROMFL
$MAIL/inbox
我想我已经解决了sed(请参阅我的问题Sed command and unknown patterns found online),但我仍然无法解决 formail 和 fgrep 部分.所以当我运行 procmail 脚本时,我得到的日志是:
$ mailstat var/log/procmail.log
/bin/sh: 0: Can't open fgrep
/bin/sh: 1: grep: not found
/bin/sh: 1: sed: not found
/home/user/var/mail/reginbox/
procmail: [6880] Sat Jun 16 16:57:32 2018
procmail: Acquiring kernel-lock
procmail: Assigning "FROMFL=/home/user/var/mail/fromlist"
procmail: Assigning "FROMLS="
procmail: Assigning "LASTFOLDER=/home/user/var/mail/reginbox/msg.XXX"
procmail: Assigning "SHELL=/bin/sh"
procmail: Executing "fgrep,-xi,/home/user/var/mail/fromlist"
procmail: Executing "formail -xFrom: | sed -e `'s/.*<//; s/>.*//'`"
procmail: No match on "fgrep -xi /home/user/var/mail/fromlist"
procmail: Non-zero exitcode (127) from "fgrep"
procmail: Notified comsat: "user@0:/home/user/var/mail/reginbox/msg.XXX"
procmail: Opening "/home/user/var/mail/reginbox/msg.XXX"
看起来 formail 似乎无法完全提取“发件人:”所在的行,这意味着这些行中的电子邮件地址不是由 SED 命令从其余部分中提取出来的,也没有与文本文件进行比较电子邮件列表(发件人列表),这就是日志显示“不匹配”消息的原因。
我怎样才能知道这些东西在哪里坏掉了?
【问题讨论】:
-
我们无法真正猜出您的
mailstat脚本中的内容,但我猜它要么有我在回复中概述的错误,要么您搞砸了PATH变量所以它找不到它需要的命令。 -
Mailstat 解析 procmail 日志并显示有关传递到所有文件夹的消息(总大小和平均大小以及消息数量)的摘要。
-
但错误消息似乎来自其中;您发布的 Procmail 配方甚至不包含
grep命令。 -
@tripleee 我已经尝试过你的建议(formail -rtzxTo:)。另外,我已将第二位更改为 > 这样 FROMLS 现在是
formail -rtzxTo: | grep -EiEio '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'。如果在命令行上单独运行这两个命令,则它们可以工作,但如果通过管道相互连接,它们似乎不起作用。 FROMLS 仍然没有被分配给任何东西,如上面的日志所示,因此是“不匹配”。如何将 FROMLS 分配给某事? -
grep根本不需要。您是为了幽默而反复提供相同的标志,还是您认为这会产生一些影响?大多数grep方言不支持\b。但是完全删除grep显然也会摆脱这些错误。正确的代码已经发布在我的答案中,并解释了它是如何工作的。