postfix - доступ к информации о входящей почте внутри скрипта Python - PullRequest
0 голосов
/ 19 мая 2018

Я использую postfix для почтового сервера и procmail для некоторых вещей, таких как извлечение вложений, создание каталога для каждого сообщения и отправка всех данных на другой сервер.

Это мой постфиксный конфиг:

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = imiMailServerHost
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, XXX.YYYY.com, splnx, localhost.localdomain, localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 192.168.100.0/24
mailbox_command = procmail -a "$EXTENSION"
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4
home_mailbox = Maildir/

И это мой конфиг .procmailrc, для выполнения которого я вызываю скрипт bash:

VERBOSE=on
LOGFILE=/home/ali/procmail.log

:0
| /home/ali/Maildir/a.sh

И это a.sh:

#!/usr/bin/bash
/usr/bin/ripmime -i - -d Maildir/ --prefix;
/usr/bin/python3 /home/ali/Maildir/a.py;

Извлечение выполнено успешно, но я не могу получить доступ к своей почтовой информации, такой как тема или тело или ... внутри моего скрипта python.

Как я могу получить доступ к информации о доставленной почте внутри скрипта python?

Есть ли лучшее решение для создания папки для каждого сообщения о получении в postfix?

1 Ответ

0 голосов
/ 19 мая 2018

Python сам содержит библиотеку email, которая, безусловно, позволяет извлекать текст из заголовков и тела, с несколько большей точностью, чем чистый регулярное выражение, с которым вы ограничены Procmail.(Особенно структуры MIME сложно обрабатывать в Procmail.)

Если вы этого не хотите, и для каждого сообщения нужен небольшой статический набор заголовков, вполне может быть достаточно регулярного выражения.Procmail позволяет вытащить часть соответствия регулярному выражению с помощью специального токена \/.Захваченный текст доступен в специальной переменной MATCH.

:0 # The whitespace between [...] is a space and a tab
* ^Subject:[    ]*\/.+
{ SUBJECT=$MATCH }

:0
| /home/ali/Maildir/a.sh -s "$SUBJECT"

Переменные Procmail, которые вы определяете сами, будут экспортированы, так что вы фактически можете получить доступ к $SUBJECT из a.sh напрямую;это создает другую сложность, потому что вы должны явно установить эту переменную при тестировании сценария, но это может быть проще для вашего сценария, чем реализация разбора параметров.

Третий вариант - жестко закодировать аргументы сценария так, чтобы $1 - субъект, $2 - отправитель и т. Д .;но это ужасно с точки зрения юзабилити, поэтому я не рекомендую это делать.(Если вы все равно это сделаете, вам нужно как минимум документировать это в исходном коде скрипта, ради вашего здравого смысла.)

На самом деле я бы реорганизовал это, чтобы просто вызвать ripmime и python напрямую из Procmail.

:0
* ^Subject:[    ]*\/.+
{ SUBJECT=$MATCH }

:0c
| ripmime -i - -d Maildir/ --prefix
:0
| python3 Maildir/a.py -s "$SUBJECT"

(В качестве отступления не жестко кодируйте пути к ripmime и python3. Вместо этого убедитесь, что ваш PATH вменяемый. Возможно, также убедитесь, чтоa.py имеет правильную строку shebang и помечает его как исполняемый, и убирает python3.)

Ваше текущее решение без необходимости усложняет вопрос, вызывая Python из сценария оболочки, который вы вызываете из Procmail.Если Python не занимает центральное место в актуальном вопросе, может быть что-то вроде

:0
| b.sh

, где b.sh заменяет a.sh и a.py на что-то вроде

#!/bin/sh
t=$(mktemp -t -d procmbXXXXXXXXX) || exit
# clean up when done or if interrupted
trap 'rm -rf "$t"' EXIT HUP INT QUIT TERM
cat >"$t"/00input.msg
ripmime -i "$t"/00input.msg -d "$t" --prefix
# as per your updated requirement in a comment
scp "$t" remotehost:messages/"$(basename "$t")"

Если ваш реальныйНа самом деле вопрос «где Procmail сохранил это сообщение?», переменная Procmail $LASTFOLDER содержит имя файла.

...