通过Sieve / Pigeonhole功能过滤邮件

时间:2016-03-04 20:02:00

标签: email sieve-language

尝试通过Sieve功能过滤邮件。

我想获取邮件正文中指示的电子邮件地址,而不是标题中的电子邮件地址。 From:字段后面的地址(如标题中的那个)。之后,应将电子邮件的副本发送到此地址。过滤后的邮件在其主题中也必须包含Returned mail

这是我的代码,但没有工作......

        require ["body","copy","variables"];

        if header :contains "Subject" "Returned mail"
            {
            if body :content "text" :matches "From: *"
                {
                redirect :copy "${1}";
                }
            }

你能帮我解决一下这段代码吗? 谢谢!!

2 个答案:

答案 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())

这是一个非常简单的概念概念,仅适用于没有特殊字符的非多部分消息。否则此应用程序将崩溃。处理字符集会打破这个例子的边缘。