procmail和python脚本存在权限问题

procmail和python脚本存在权限问题,python,procmail,Python,Procmail,这是我的瓷器。 脚本似乎以邮箱的“用户”身份运行,因此脚本无法创建锁、刷新或删除邮件,因为procmail似乎已锁定邮箱 SHELL = /bin/sh LOGFILE = $HOME/pm.log LOGABSTRACT = "All" VERBOSE = "on" :0 * ^From: .*address.* * ^Subject:.*su to root.* { :0c: /var/spool/mail/tdproxymail :0ahi | /usr/local/tdproxy/

这是我的瓷器。 脚本似乎以邮箱的“用户”身份运行,因此脚本无法创建锁、刷新或删除邮件,因为procmail似乎已锁定邮箱

SHELL = /bin/sh
LOGFILE = $HOME/pm.log
LOGABSTRACT = "All"
VERBOSE = "on"


:0
* ^From: .*address.*
* ^Subject:.*su to root.*
{
:0c:
/var/spool/mail/tdproxymail

:0ahi
| /usr/local/tdproxy/MAILSCRIPTS/script.py
}
我正在将邮件发送到收件箱并将其发送到脚本。当我运行python脚本时,我在邮箱中循环…寻找正确的电子邮件

mbox = mailbox.mbox('/var/mail/tdproxymail')

for key, msg in mbox.iteritems():
    print(key)
    if "su to root" not in (msg['subject']):
        continue
一切都很好,但当我到达

mbox.remove(key)
mbox.flush()
mbox.close()
这是说我没有procmail的锁权限我想

主题:su到根文件夹: /usr/local/tdproxy/mailscript/edwards_sudo.py 812 回溯(最近一次调用上次):文件 “/usr/local/tdproxy/MAILSCRIPTS/script.py”,第94行,在 mbox.lock()文件“/usr/lib64/python2.7/mailbox.py”,第625行,在锁中 _锁定文件(self.\u file)文件“/usr/lib64/python2.7/mailbox.py”,第1976行,在锁定文件中 pre_lock=_create_temporary(f.name+'.lock')文件“/usr/lib64/python2.7/mailbox.py”,第2025行,在_create_temporary中 os.getpid())文件“/usr/lib64/python2.7/mailbox.py”,第2015行,在“创建”中 fd=os.open(path,os.O_create | os.O_EXCL | os.O_RDWR,0666)操作系统错误:[Errno 13]权限被拒绝: “/var/mail/tdproxymail.lock.15718501.tdproxy.91248”

我想尝试只处理sys.stdin的电子邮件 但我尝试了两种方法:

#msg = email.message_from_file(sys.stdin)
#msg = email.parser.Parser().parse(sys.stdin)
它说is_multipart是false,我知道这不是正确的情况…所以简而言之,如果我访问邮箱,它会说有一个附件,但是如果我使用管道的stdin,应该没有附件

问题


如何处理然后从邮箱中删除电子邮件,因为作为传入邮件的用户运行脚本时似乎存在权限问题。

您的文件名不正确
/var/mail/tdproxymail.1571851019.tdproxy.81261
不是一个存在的文件,或者您不应该有任何访问权限。您的mbox文件名是
/var/mail/tdproxymail
,每个消息都是该文件中的片段

(这就是mbox的工作原理;其他文件夹有不同的结构,事实上,
1571851019.tdproxy.81261
看起来很像maildir文件夹目录中的单个邮件文件。)

无论如何,在整个邮箱中循环查找最新邮件是完全疯狂的。接受标准输入的信息是迄今为止更明智、更稳健、更高效的方法,因此我将转而探讨如何解决这个问题(可能是一些简单的问题;但也可能最好作为一个单独的问题发布)。如果您无法解决这个问题,那么一个更好的快速、肮脏但仍然非常绝望的解决方法可能是将消息写入一个单独的临时文件,并将其传递给Python

明确地说,这与邮箱锁定有关的假设似乎是错误的。在大多数体系结构上,锁定mbox的方式不是锁定文件(通常是
flock
fcntl
;但请检查
procmail-v
的输出,查看系统上编译的行为)-正是因为普通用户无权在其收件箱所在的目录中创建新文件

可能Python
mailbox
代码试图将
mbox
文件复制到不同的位置,因为在内存中操作它通常不是一个好主意(虽然在这种特殊情况下它可能会工作;但实际上,不要这样做)。我没有试过那个密码;但是一种典型的安排是让库函数检查是否设置了
os.environ['TMPDIR']
,如果设置了,则将其用于临时文件

但事实上,我想问题的根本原因是您在写入Python的配方中添加了
h
标志。当然你不会得到一个多部分的消息;因为您告诉Procmail只给脚本提供标题,所以根本没有正文

另外,等号周围的空格是语法错误。与shell一样,Procmail要求赋值的形式为
variable=string
variable=“quoted string”
,并且
=
字符的两边都没有空格

# Fix incorrect assignment syntax, no spaces around =
SHELL=/bin/sh
LOGFILE=$HOME/pm.log
LOGABSTRACT="All"
VERBOSE="on"

# Drop the h flag and then also the copying and the a flag
# Also, trailing wildcard is unnecessary in regexes; Procmail matches on any substring
:0i
* ^From: .*address
* ^Subject:.*su to root
| /usr/local/tdproxy/MAILSCRIPTS/script.py
如果您非常想先将消息保存到文件中,请将其写入类似于
/tmp/
的目录中,并从Procmail的
LASTFOLDER
变量中捕获文件名。但是由于修复了删除
h
标志,我相信这将是不必要的


(当然,您仍然需要删除代码以尝试从Python中操作
mbox
文件,并只接受标准输入上的消息。)

或者您没有向我们展示的Python代码尝试创建具有该名称的临时文件,但显然缺乏权限?这是有道理的,因为通常不会完全在内存中从mbox文件中删除单个消息,即使在这种特定的有限情况下,可能只需截断原始文件即可。也许你可以告诉temp file函数使用一个不同的目录,在那里你有写权限。所以我更新了error…你可以看到它可以追溯到python代码中的mbox.lock(),所以它甚至不能写锁文件…不,你试图创建一个文件,但它不是锁文件,可能正是根据我在上一篇评论中的推测。不清楚
sudo.py
milbox.py
script.py
sudo.py有何关联?邮箱地址?只有1个脚本…在用户帐户下运行,但不是通过procmail运行。。。。。。。。edwards_sudo.py是唯一运行的scrpit。。。另一个错误是从使用的python库进行错误报告。