通过 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 carbon 复制)到新匹配的目标地址。但请注意,此时并没有安全地检查它是否真的是一个电子邮件地址。这也可能留下远程代码执行的漏洞。

还必须有任何手动应用的 X-Loop 保护技术,此示例未涵盖