Email 在筛选电子邮件时,配置procmail以匹配外部电子邮件地址列表

Email 在筛选电子邮件时,配置procmail以匹配外部电子邮件地址列表,email,sed,procmail,Email,Sed,Procmail,我的fetchmail脚本从邮箱中检索电子邮件,并将其放入名为mario的文件中,然后将其转储到我的/var/mail/文件夹中。我正在尝试设置一个procmail脚本来处理mario;通过处理,这就是我的意思:procmail脚本应该根据包含已知电子邮件地址列表的外部文本文件(fromlist)进行过滤。一旦有了匹配的mario/fromlist,消息就会从mario中取出并存储到我的本地nbox/文件夹中 在网上,我找到了一段代码,包括一个配方,我已经将它输入到我的procmail控制文件(

我的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
(参见我的问题),但我仍然无法解决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"
$mailstat var/log/procmail.log
/bin/sh:0:无法打开fgrep
/bin/sh:1:grep:未找到
/bin/sh:1:sed:未找到
/主页/用户/var/mail/reginbox/
procmail:[6880]2018年6月16日星期六16:57:32
procmail:获取内核锁
procmail:分配“FROMFL=/home/user/var/mail/fromlist”
procmail:分配“FROMLS=”
procmail:分配“LASTFOLDER=/home/user/var/mail/reginbox/msg.XXX”
procmail:分配“SHELL=/bin/sh”
procmail:执行“fgrep,-xi,/home/user/var/mail/fromlist”
procmail:正在执行“formail-xFrom:| sed-e`'s/**/`”
procmail:fgrep-xi/home/user/var/mail/fromlist上没有匹配项
procmail:fgrep中的非零exitcode(127)
procmail:已通知通信卫星:user@0:/home/user/var/mail/reginbox/msg.XXX“
procmail:打开“/home/user/var/mail/reginbox/msg.XXX”
formail似乎无法完全提取“From:”所在的行,这意味着SED命令不会将这些行中的电子邮件地址从其余行中分割出来,也不会与电子邮件列表(fromlist)的文本文件进行比较,这就是日志显示“不匹配”消息的原因


如何找出这些东西的故障点?

运行外部命令的语法是

VARIABLE=`command to run`
你错过了开头的回跳,所以你跑得很有效

FROMLS="formail"
-xFrom: | sed etc is a syntax error
无论如何,提取发件人的方法有点不精确,因为它不能正确处理电子邮件地址格式的各种变化。一个更健壮但稍难理解的解决方案是

FROMLS=`formail -rtzxTo:`
这使得
正式
生成一个回复
-rt
,然后从生成的回复中提取
到:
地址,当然现在该地址指向原始发件人。根据设计,
formail
在生成回复时,只将输入消息的发件人的实际电子邮件地址放在
至:
标题中,因此这就是您要提取的内容

这样,您的脚本在技术上应该可以提取匹配的消息并将它们复制到您想要的目标文件夹中。下面是一个快速演示:

tripleee$ cd /tmp

tripleee$ echo moo@example.com >fromlist

tripleee$ cat one.rc
# temporary hack
SHELL=/bin/sh
MAILDIR=/tmp
MAIL=.
VERBOSE=yes

FROMFL=$MAIL/fromlist

FROMLS=`formail -rtzxTo:`

:0
* ? fgrep -xi "$FROMLS" "$FROMFL"
$MAIL/inbox


tripleee$ procmail -m one.rc <<\:
From: ick@example.com
To: poo@example.org
Subject: no match

hello
:
procmail: [16406] Wed Jun 27 13:41:35 2018
procmail: Assigning "FROMFL=./fromlist"
procmail: Executing "formail,-rtzxTo:"
procmail: Assigning "FROMLS=ick@example.com"
procmail: Executing "fgrep,-xi,ick@example.com,./fromlist"
procmail: Non-zero exitcode (1) from "fgrep"
procmail: No match on "fgrep -xi ick@example.com ./fromlist"
 Subject: no match
  Folder: **Bounced**                                                        61

tripleee$ procmail -m one.rc <<\:
From: moo@example.com
To: poo@example.org
Subject: match

hello
:
procmail: [16410] Wed Jun 27 13:41:37 2018
procmail: Assigning "FROMFL=./fromlist"
procmail: Executing "formail,-rtzxTo:"
procmail: Assigning "FROMLS=moo@example.com"
procmail: Executing "fgrep,-xi,moo@example.com,./fromlist"
procmail: Match on "fgrep -xi moo@example.com ./fromlist"
procmail: Assigning "LASTFOLDER=./inbox"
procmail: Opening "./inbox"
procmail: Acquiring kernel-lock
 Subject: match
  Folder: ./inbox                                                            68    
tripleee$cd/tmp
三重$echomoo@example.com>fromlist
tripleee$cat one.rc
#临时黑客
SHELL=/bin/sh
MAILDIR=/tmp
邮件=。
冗长=是
FROMFL=$MAIL/fromlist
FROMLS=`formail-rtzxTo:`
:0
* ? fgrep-xi“$FROMLS”“$FROMFL”
$MAIL/收件箱

tripleee$procmail-m one.rc我们无法真正猜测您的
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仍然没有分配给任何对象,因此“不匹配”。我怎样才能从分配给某个东西的字串中获得字串呢?
grep
应该一点也不必要。你是重复提供相同的字串来表达幽默呢,还是你认为这会有一些效果?
\b
在大多数
grep
方言中都不受支持。但是完全删除
grep
显然也会消除这些字串错误。我的答案中已经张贴了正确的代码,并解释了它是如何工作的。在回答您关于如何运行外部命令的答案时,我必须说,缺少的开头反勾号应该在procmail控制文件中,我不太清楚为什么我没有在问题中键入它,因为我复制了粘贴的命令行中的命令。感谢您建议使用这些标志并从“to:”标题提取电子邮件,而不是从“from:”标题提取电子邮件。我将立即解决这个问题。目前,我启动了一个调用procmail的脚本来处理输入文件(“/var/mail/mario”)在这个脚本中,我有“cat mario>>.newfile”和“formail-s procmail<.newfile”。procmail根据fromlist(“FROMFL=$MAIL/fromlist”)过滤.newfile,sed命令从“mario”内部“清除”所有不是电子邮件地址的内容,以便fgrep命令可以比较两者并尝试找到匹配项。这就是您在回答的最后一段中试图概述的内容吗?是的,这正是它所描述的。(请注意演示片段中的严格引用,尽管我不认为这会对您测试的特定地址产生影响。)