У вас неправильное имя файла. /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']
, и, если да, использовать это для временных файлов.
Но на самом деле, я предполагаю, что основная причина вашей проблемы заключается в том, что вы добавилиh
флаг к рецепту, который пишет в Python. Конечно, тогда вы не получите многочастное сообщение;вы вообще не получаете тела, потому что вы сказали Procmail, что вы должны указывать только заголовки для вашего скрипта.
Кроме того, пробелы вокруг знаков равенства являются ошибками синтаксиса. 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/
и запишите имя файла из переменной LASTFOLDER
Procmail. Но с исправлением, чтобы удалить флаг h
, я надеюсь, что это будет ненужным.
(Вам, конечно, все равно нужно будет удалить код, чтобы попытаться манипулировать файлом mbox
из Python, и просто принятьсообщение на стандартный ввод.)