尝试通过Sieve功能过滤邮件。
我想获取邮件正文中指示的电子邮件地址,而不是标题中的电子邮件地址。 From:
字段后面的地址(如标题中的那个)。之后,应将电子邮件的副本发送到此地址。过滤后的邮件在其主题中也必须包含Returned mail
。
这是我的代码,但没有工作......
require ["body","copy","variables"];
if header :contains "Subject" "Returned mail"
{
if body :content "text" :matches "From: *"
{
redirect :copy "${1}";
}
}
你能帮我解决一下这段代码吗? 谢谢!!
答案 0 :(得分:2)
切换回旧的procmail
Procmail支持在邮件正文中进行匹配,如下所示:
:0H
* ^Subject: .*Returned mail
{
:0B
* ^From: \/.+@.+
{
ADDR=$MATCH
:0 c
* ADDR ?? ^[a-z0-9_-+.]+@[a-z0-9-+.]+$
| $ADDR
}
}
这涵盖了消息正文中以“From:”开头的行之后的所有内容。
:0B
表示必须在邮件正文
\/
将记录开始到$ MATCH(内置变量)
匹配存储在Procmail变量$ ADDR中,然后可以在furturer procmail脚本执行中永久访问。
在子块中,它将消息传递给新匹配的目标地址(:0 c
arbon copys)。但请注意,此时不能安全地检查它是否真的是一个电子邮件地址。这也可能导致远程代码执行无法进行。
此外,还必须手动应用任何X-Loop保护技术
答案 1 :(得分:1)
无法直接从邮件正文中删除内容以进行进一步处理。
Sieve不会从正文匹配中填充${1}
等变量。
RFC明确指出这绝不可能。
然而,有可能通过提供(过滤)消息来解决这个问题,这个消息抛出了一个单独的应用程序,如下所示,它将所需的信息放入标题中。
想象一下原始信息是:
To: my@second.tld
Subject: Test
From: other@example.tld
Date: Wed, 25 Oct 2017 16:22:05 +0200
Hi guy, here starts the body
This mail contains a important dynamic address
From: important@match.tld
wich has to be matched und processed by sieve
然后你的筛子看起来像这样:
require ["copy","variables","vnd.dovecot.filter"];
if header :contains "Subject" "Returned mail" {
filter "bleed_from.py";
if header :matches "Bleeded-From" "*" {
redirect :copy "${1}";
}
}
过滤脚本" bleed_from.py":
#!/usr/bin/python
import re
import email
# Read the mail from stdin
parser = email.FeedParser.FeedParser()
mail = None
for line in sys.stdin.readlines():
parser.feed(line)
mail = parser.close()
# Grep the From out of the body and add it to the header
ret = re.findall("From: (.*)", mail.get_payload())
mail.add_header("Bleeded-From", ret[0])
# Return the message
print(mail.as_string())
这是一个非常简单的概念概念,仅适用于没有特殊字符的非多部分消息。否则此应用程序将崩溃。处理字符集会打破这个例子的边缘。