我有一个Procmail规则,它使用formail解析To:电子邮件头,以确定电子邮件发送到的电子邮件地址:
TO_=`formail -XTo:`这是行不通的,因为我希望${TO_}评估为"address@domain.com",但我得到的是" to : firstName lastName“。
如何将procmail脚本中的环境变量设置为我想要的格式?
发布于 2022-09-01 18:20:04
不,您正在提取To:头的全部内容,它通常应该类似于To: Real Name <recipient@example.net>。但是,有许多不同的版本;例如,它也可以是recipient@example.net (Real Name),尽管这种格式已经过时了。
演示:
bash$ cat <<\: >nst.rc
SHELL=/bin/sh
TO_=`formail -XTo:`
:
bash$ cat <<\: >nst.eml
From: me <sender@example.org>
To: Real Name <recipient@example.net>
Subject: All your base
They are belong to us
:
bash$ procmail -m VERBOSE=yes DEFAULT=/dev/null nst.rc <nst.eml
procmail: [271] Fri Sep 2 10:01:29 2022
procmail: Assigning "DEFAULT=/dev/null"
procmail: Assigning "MAILDIR=."
procmail: Rcfile: "nst.rc"
procmail: Assigning "SHELL=/bin/sh"
procmail: Executing "formail,-XTo:"
procmail: Assigning "TO_=To: Real Name <recipient@example.net>"
procmail: Assigning "LASTFOLDER=/dev/null"
procmail: Opening "/dev/null"
Subject: All your base
Folder: /dev/null 114如果您知道标头包含<brokets>之间的地址,则可以在它们之间提取文本,而无需使用formail或其他外部实用程序。
:0
* ^To:.*<\/[^>]+
{ TO_=$MATCH }这使用Procmail的特殊\/提取令牌,它将匹配的文本分配给特殊的内部变量MATCH。
bash$ cat <<\: >nst2.rc
SHELL=/bin/sh
:0
* ^To:.*<\/[^>]+
{ TO_=$MATCH }
:
bash$ procmail -m VERBOSE=yes DEFAULT=/dev/null nst2.rc <nst.eml
procmail: [275] Fri Sep 2 10:03:26 2022
procmail: Assigning "DEFAULT=/dev/null"
procmail: Assigning "MAILDIR=."
procmail: Rcfile: "nst2.rc"
procmail: Assigning "SHELL=/bin/sh"
procmail: Assigning "MATCH="
procmail: Matched "recipient@example.net"
procmail: Match on "^To:.*<\/[^>]+"
procmail: Assigning "TO_=recipient@example.net"
procmail: Assigning "LASTFOLDER=/dev/null"
procmail: Opening "/dev/null"
Subject: All your base
Folder: /dev/null 114切线上,如果您想提取一个没有header关键字本身的标头值,那将是
formail -zxTo:用小写的-x。
但这仍然提取整个值,即Real Name <recipient@example.net>。当然,您可以添加一个简单的sed脚本来提取电子邮件终端;但是一般来说,出于效率原因,您希望避免产生外部进程。
https://stackoverflow.com/questions/73573726
复制相似问题