Невозможно сгладить вещи непосредственно из тела сообщения для дальнейшей обработки. Сито не заполняет такие переменные, как ${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())
Этот это очень простое прообраз концепции и работает только для не многочастных сообщений без специальных символов. В противном случае это приложение выйдет из строя. Работа с кодировками ударит по краям этого примера.
К сожалению, это не должно быть возможным благодаря RFC 5173 Абс. 6. Меня это тоже раздражает. Возможно, построение глупого решения обхода путем подачи всего сообщения на скрипт python, посвященный единственному совпадению, который возвращает результат через возвращаемую переменную? Procmail ftw. – Sprinterfreak