【发布时间】:2017-11-16 17:24:53
【问题描述】:
我在 Ubuntu 16.04 服务器上运行 Postfix 来发送“内部电子邮件”消息和一个 crontab Perl 作业来解析相关的退回邮件(发送到本地邮箱 /var/mail/bounceparser)。 Perl 代码主要检查 bounceparser 邮箱,解析所有邮件并采取一些措施(删除退回的地址等)。
问题是,当我尝试使用 Mail::Box 库删除那些已解析的邮件时,邮箱会被锁定,如果有新邮件到达,postfix 守护程序会抛出异常尝试传递消息:“无法为用户bounceparser更新邮箱/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');
谢谢!
【问题讨论】:
-
我不确定,但如果您的目录被锁定,您可以尝试修改它,创建一个新的Mail::Box::Locker 并在创建 Mail::Box::Mbox 对象时传递它。跨度>
-
感谢您的想法 ^_^,我现在正在检查 Postfix 传递 mailbox_delivery_lock 参数的工作原理。- 也许他们使用不同的默认锁定方法?我会更新的。
-
这是我的第一个 Perl 代码 ^_^ 但我现在只是随机遇到锁定问题,而且大多数时候相关代码都能正常工作。- 用于解析我正在使用的消息Sisimai,不是 Mail::Box 解析函数...
-
如果邮箱是 mbox 格式(即一个文件中的所有邮件),如果你修改它需要锁定它,否则当两个进程修改文件时它会损坏(即从它删除并同时追加)。您需要使用 maildir 或类似格式,其中每封邮件都是一个单独的文件。
-
@NachoColl: 前面的评论并没有解决问题,即要么你仍然会遇到锁冲突,要么你最终可能会得到一个损坏的邮箱。postfix 中的默认投递代理支持多种邮箱格式,包括邮件目录。引用local:指定一个以 / 结尾的名称,用于与 qmail 兼容的邮件目录传递。
标签: perl cpan postfix email-bounces