【问题标题】:postfix - access to incoming mail info inside of python script后缀 - 访问 python 脚本中的传入邮件信息
【发布时间】:2018-05-19 02:23:49
【问题描述】:

我将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 中的每条回执消息创建文件夹?

【问题讨论】:

  • 每条消息都有一个Subject: 标头;如果您希望操作无条件触发,请不要设置条件。

标签: python-3.x procmail


【解决方案1】:

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变量会被导出,所以你实际上可以直接从a.sh中访问$SUBJECT;这会带来不同的复杂性,因为您必须在测试脚本时显式设置此变量,但对于您的场景而言,它可能比实现选项解析更简单。

第三种选择是硬编码脚本参数,以便$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.sha.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 包含文件名。

【讨论】:

  • 将消息通过管道传输到 Python 与您当前的解决方案略有不同,但可能会更好。
  • 谢谢你的回答,第二个代码不起作用,这个procmail[2268]: Suspicious rcfile "/home/ali/.procmailrc" 显示。但单独的python部分工作正常。我想在名称库基于新邮件名称的单独文件夹中提取附件,然后运行 ​​python 代码将其(邮件和所有附件)完全传输到另一台服务器。
  • “可疑 rcfile”表示文件的所有权或权限存在问题。确保您的 .procmailrc 归您所有并且只能由您自己写入。
  • 您更新的问题陈述听起来好像您根本不需要 Python。编写一个 shell 脚本,在保存的消息上运行 ripmime,然后运行 ​​scp 将结果复制到其他地方。但这听起来也有点不清楚和宽泛 - 也许发布一个单独的问题?
猜你喜欢
  • 1970-01-01
  • 2020-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多