通过 Sieve/Pigeonhole 函数过滤邮件
Filtering mail through Sieve/Pigeonhole function
正在尝试通过 Sieve 函数过滤邮件。
我想获取邮件 body 中指示的 e-mail 地址,而不是 header 中指示的地址。该地址(如 header 中的地址)位于 From:
字段之后。之后,应将电子邮件的副本发送到该地址。过滤的邮件还必须在其主题中包含 Returned mail
。
这是我的代码,但无法正常工作...
require ["body","copy","variables"];
if header :contains "Subject" "Returned mail"
{
if body :content "text" :matches "From: *"
{
redirect :copy "";
}
}
你能帮我修复那个代码吗?
谢谢!!
没有办法直接从消息body中grep出来做进一步处理。
Sieve 不会从 body 个匹配项中填充 </code> 等变量。</p>
<p><a href="https://www.rfc-editor.org/rfc/rfc5173#section-6" rel="nofollow noreferrer">RFC</a> 明确指出这绝不能可能。</p>
<p>然而,有可能通过提供(过滤)消息来解决这个问题,如下所示将所需信息放入 header.</p> 中的单独应用程序
<p>假设原始消息是:</p>
<pre><code>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 "";
}
}
filter-script "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())
这是一个非常简单的概念证明,仅适用于没有特殊字符的非多部分消息。否则此应用程序将崩溃。处理字符集会破坏此示例的边距。
切换回良好的旧 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 中,然后可以在未来的 procmail 脚本执行中永久访问。
在子块中,它将消息传递(:0 c
arbon 复制)到新匹配的目标地址。但请注意,此时并没有安全地检查它是否真的是一个电子邮件地址。这也可能留下远程代码执行的漏洞。
还必须有任何手动应用的 X-Loop 保护技术,此示例未涵盖
正在尝试通过 Sieve 函数过滤邮件。
我想获取邮件 body 中指示的 e-mail 地址,而不是 header 中指示的地址。该地址(如 header 中的地址)位于 From:
字段之后。之后,应将电子邮件的副本发送到该地址。过滤的邮件还必须在其主题中包含 Returned mail
。
这是我的代码,但无法正常工作...
require ["body","copy","variables"];
if header :contains "Subject" "Returned mail"
{
if body :content "text" :matches "From: *"
{
redirect :copy "";
}
}
你能帮我修复那个代码吗? 谢谢!!
没有办法直接从消息body中grep出来做进一步处理。
Sieve 不会从 body 个匹配项中填充 </code> 等变量。</p>
<p><a href="https://www.rfc-editor.org/rfc/rfc5173#section-6" rel="nofollow noreferrer">RFC</a> 明确指出这绝不能可能。</p>
<p>然而,有可能通过提供(过滤)消息来解决这个问题,如下所示将所需信息放入 header.</p> 中的单独应用程序
<p>假设原始消息是:</p>
<pre><code>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 "";
}
}
filter-script "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())
这是一个非常简单的概念证明,仅适用于没有特殊字符的非多部分消息。否则此应用程序将崩溃。处理字符集会破坏此示例的边距。
切换回良好的旧 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 中,然后可以在未来的 procmail 脚本执行中永久访问。
在子块中,它将消息传递(:0 c
arbon 复制)到新匹配的目标地址。但请注意,此时并没有安全地检查它是否真的是一个电子邮件地址。这也可能留下远程代码执行的漏洞。
还必须有任何手动应用的 X-Loop 保护技术,此示例未涵盖