如何在没有邮箱文件锁定的情况下删除邮件?我正在使用 Perl 的 Mail::Box

How can I delete a message without mailbox file lock? I'm using Perl's Mail::Box

I 运行 Postfix 在 Ubuntu 16.04 服务器上发送 "internal email" 消息和一个 crontab Perl 作业来解析相关的退回消息(投递到本地邮箱 /var/mail/bounceparser)。 Perl 代码主要检查 bounceparser 邮箱,解析所有邮件并采取一些措施(删除退回地址等)。

问题是,当我尝试使用 Mail::Box 库删除那些已解析的邮件时,邮箱被锁定,如果有新邮件到达,后缀守护程序将抛出尝试传递消息时出现异常:"cannot update mailbox /var/mail/bounceparser for user bounceparser. cannot open file: Permission denied".

有没有办法在不锁定邮箱文件的情况下删除邮件?如果不可能,还有其他建议的策略吗?

我用来删除消息的代码:

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');

谢谢!

正如@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');

幸运的是,我用来解析 bounce/delivery/etc 消息的 Sisimai 库也接受用于消息的 Maildir 路径:

my $v = Sisimai->make('/home/bounceparser/Maildir/new','hook'=>$x);

感谢您的帮助!