2016-03-04 75 views
1

试图通过Sieve函数筛选邮件。通过Sieve/Pigeonhole函数筛选邮件

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

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

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

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

能否请你帮我解决这个问题的代码? 谢谢!

+0

可悲这必须是不可能由RFC 5173块腹肌。 6.也让我烦恼。也许构建一个愚蠢的解决办法,通过管道整个消息到一个python脚本专用于单匹配极其比通过返回变量返回结果? Procmail ftw。 – Sprinterfreak

回答

2

切换回好老的procmail

Procmail的确实消息体中像这样的范围内支持匹配:

:0H 
* ^Subject: .*Returned mail 
{ 
:0B 
* ^From: \/[email protected]+ 
{ 
    ADDR=$MATCH 
    :0 c 
    * ADDR ?? ^[a-z0-9_-+.][email protected][a-z0-9-+.]+$ 
    | $ADDR 
} 
} 

这之后涵盖一切,在该行开头的“发件人:”在邮件中身体。

:0B意味着下一个匹配必须在表达式中的消息正文

\/完成启动记录到$ MATCH(内置的变量)

匹配被存储在procmail的变量$ ADDR然后永久访问furturer procmail脚本执行。 在子块中,它将消息传递给新匹配的目标地址(:0 c arbon copys)。但请注意,此时并不安全地检查它是否真的是电子邮件地址。这也可能对远程代码执行造成危害。

还必须有techniq手动施加至极任何X-环路保护不包含在本示例

1

无法直接从消息主体中直接提取内容以进一步处理。 Sieve不会从身体匹配中填充变量,如${1}

RFC明确指出,这不可能。

然而,通过提供(过滤)消息抛出一个单独的应用程序来解决这个问题是可能的,如下所示,将所需的信息放入标题中。

想象的原始消息是:

To: [email protected] 
Subject: Test 
From: [email protected] 
Date: Wed, 25 Oct 2017 16:22:05 +0200 

Hi guy, here starts the body 
This mail contains a important dynamic address 

From: [email protected] 

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

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

+0

非常感谢你的回答!我会绕过我的代码,看看我能如何实现这个好主意! ...我必须删除特殊字符,因为我处理法语:-)再次感谢! – Satch