2016-03-04 6 views
1

Пытается фильтровать почту через функцию сита.Фильтрация почты через функцию 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 
} 
} 

Это охватывает все после того, как в строке, начинающейся с «From:», в сообщении тело.

:0B означает следующее соответствие должно быть сделано на теле

\/ сообщения в выражении начинается запись на $ MATCH (встроенный в переменном)

матч хранится в Procmail переменных $ ADDR, который затем постоянно доступен в процессе выполнения скрипта procmail. В субблоке он поставляет (:0 c arbon copys) сообщение на новый адрес назначения. Но учтите, что на данный момент он не проверяется безопасно, действительно ли это адрес электронной почты. Это также может оказаться вультурой для удаленного выполнения кода.

Там также должна быть любая защита X-Loop Techniq наносится вручную Wich не охватывается этим примером

1

Невозможно сгладить вещи непосредственно из тела сообщения для дальнейшей обработки. Сито не заполняет такие переменные, как ${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

 Смежные вопросы

  • Нет связанных вопросов^_^