我将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中为每个收据消息创建文件夹是否有更好的解决方案?
答案 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调用ripmime
和python
。
:0
* ^Subject:[ ]*\/.+
{ SUBJECT=$MATCH }
:0c
| ripmime -i - -d Maildir/ --prefix
:0
| python3 Maildir/a.py -s "$SUBJECT"
(顺便说一句,不要将路径硬编码到ripmime
和python3
。相反,请确保PATH
是理智的。也许还要确保a.py
有一个正确的shebang行并标记它是可执行的,并取出python3
。)
您当前的解决方案通过从您从Procmail调用的shell脚本调用Python而不必要地使问题复杂化。如果Python不是实际问题的核心,可能就像
:0
| b.sh
其中b.sh
用{/ p>之类的内容替换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
包含文件名。