【问题标题】:How can I delete a message without mailbox file lock? I'm using Perl's Mail::Box如何删除没有邮箱文件锁定的邮件?我正在使用 Perl 的 Mail::Box
【发布时间】: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


【解决方案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 库也接受 Maildir 路径来获取消息:

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

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2010-11-19
    • 2016-05-14
    相关资源
    最近更新 更多