Как я могу удалить сообщение без блокировки файла почтового ящика? Я использую Perl's Mail::Box
Я запускаю Postfix на сервере Ubuntu 16.04, чтобы отправлять "внутренние почтовые сообщения", и задание Perl crontab для анализа связанных отказов (доставляется в локальный почтовый ящик /var/mail/bounceparser). Код Perl в основном проверяет почтовый ящик bounceparser, анализирует все сообщения и предпринимает некоторые действия (удаление ошибочных адресов и т. Д.).
Проблема в том, что когда я пытаюсь удалить эти уже проанализированные сообщения с помощью библиотеки Mail::Box, почтовый ящик блокируется, и, если приходит новое сообщение, демон postfix выдает исключение, пытаясь доставить сообщение: "не удается обновить почтовый ящик /var/mail/bounceparser для пользователя bounceparser. не может открыть файл: разрешение запрещено ".
Есть ли способ удалить сообщение без блокировки файла почтового ящика? Если это невозможно, какая-либо другая предложенная стратегия?
Код, который я использую для удаления сообщений:
my $mbox = Mail::Box::Mbox->new(folder =>'/var/mail/bounceparser', access => 'rw');
# @mailbox_pending_deletes contains the list of message ids to delete
for my $message_id (@mailbox_pending_deletes){
$message = $mbox->find($message_id);
$message->delete;
}
my $delete_result = $mbox->close(write=>'MODIFIED');
Спасибо!
1 ответ
Как подсказывает @SteffenUllrich, используя почтовый ящик для одного почтового ящика, это не очень хорошая идея (искренне я использовал его только потому, что это настроенное по умолчанию значение Postfix ^_^).
Итак, если у вас есть похожая проблема 1.- Настройте Postfix для использования Maildir вместо Mailbox для доставки сообщений (файл main.cf):
# Set Postfix to deliver messages to Maildir user folder
home_mailbox = Maildir/
и 2.- используйте Mail::Box:Maildir, а не Mail::Box:Mbox, который я использовал для поиска-удаления сообщений.
my $mbox = Mail::Box::Maildir->new(folder =>'/home/bounceparser/Maildir', access => 'rw');
# @mailbox_pending_deletes contains the list of message ids to delete
for my $message_id (@mailbox_pending_deletes){
$message = $mbox->find($message_id);
$message->delete;
}
my $delete_result = $mbox->close(write=>'MODIFIED');
К счастью, библиотека Sisimai, которую я использую для разбора сообщений bounce/delivery/etc, также принимает путь Maildir для этих сообщений:
my $v = Sisimai->make('/home/bounceparser/Maildir/new','hook'=>$x);
Спасибо за помощь!