postfix - 访问python脚本中的传入邮件信息

时间:2018-05-19 02:23:50

标签: python-3.x procmail

我将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 :(得分:2)

Python本身包含一个email库,它当然允许您从标题和正文中提取文本,其精度比使用Procmail限制的纯正则表达式高一些。 (特别是在Procmail中处理MIME结构很棘手。)

如果你不想这样,并且每个消息都有一个小的静态标题集,那么正则表达式就足够了。 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是发件人等;但从可用性的角度来看这是可怕的,所以不是我想要推荐的东西。 (如果你这样做,你至少需要在脚本源中记录它,为了你自己的理智。)

我实际上会重构这一点,只需直接从Procmail调用ripmimepython

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

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

(顺便说一句,不要将路径硬编码到ripmimepython3。相反,请确保PATH是理智的。也许还要确保a.py有一个正确的shebang行并标记它是可执行的,并取出python3。)

您当前的解决方案通过从您从Procmail调用的shell脚本调用Python而不必要地使问题复杂化。如果Python不是实际问题的核心,可能就像

:0
| b.sh

其中b.sh用{/ p>之类的内容替换a.sha.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包含文件名。