我在 Ubuntu 16.04 服务器上运行 Postfix 来发送"内部电子邮件"消息,并使用 crontab Perl 作业来解析相关的退回消息(传递到本地邮箱/var/mail/bounceparser(。Perl代码基本上检查弹跳解析器邮箱,解析所有邮件并采取一些操作(删除退回的地址等(。
问题是,当我尝试使用 Mail::Box 库删除那些已经解析的邮件时,邮箱被锁定,如果新邮件到达,postfix 守护程序会引发异常,尝试传递邮件:"无法为用户反弹解析器更新邮箱/var/mail/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');
谢谢!
正如使用邮箱单个文件框@SteffenUllrich所建议的那样,这不是一个好主意(真诚地,我使用它只是因为它是默认的后缀配置值^_^(。
因此,如果您有类似的问题 1.- 将 Postfix 配置为使用 Maildir 而不是邮箱进行邮件传递(main.cf 文件(:
# Set Postfix to deliver messages to Maildir user folder
home_mailbox = Maildir/
和 2.- 使用邮件::框:邮件目录,而不是我用来查找-删除邮件的邮件::框: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 库也接受 Maildir 路径来获取消息:
my $v = Sisimai->make('/home/bounceparser/Maildir/new','hook'=>$x);
感谢您的帮助!