使用Perl的Mail::IMAPClient模块将邮件移动到垃圾箱

4
我需要将所有未读消息移动到垃圾箱并从收件箱中删除。
my $inbox = $imap->select("Inbox");
my @mails = ( $imap->unseen );

foreach my $msgid (@mails) {
    $imap->set_flag( "Deleted", @mails )
        or die "Could not set flag: $@\n";
}

这段代码可以完全删除消息(不包括清除垃圾桶)。
我尝试使用“移动”和“复制”:
my $Trash = "Trash";
my $newUid = $imap->move( $Trash, $msgid )
    or die "Could not move: $@\n";
my $uidList = $imap->copy( $Trash, @mails )
    or die "Could not copy: $@\n";

但是,“移动”会创建新的标记(文件夹),而“复制”则不起作用,“无法复制:6 NO [TRYCREATE] No folder Trash(Failure)”。 我尝试使用名称:/Trash,[imap]Trash等,结果类似。 这必须适用于不同的邮件服务!
我使用{{link1:Mail :: IMAPClient }}。

1
你使用哪个 IMAP 包?[无需进行不必要的猜测] - AnFi
哦,我忘记写Mail::IMAPClient了。 - Kostiuk Aleksandr
你能看到哪些文件夹?my $folders = $imap->folders or die "List folders error: ", $imap->LastError, "\n"; print "Folders: @$folders\n"; - AnFi
是的,我有[Gmail]/垃圾邮件箱,但如果我更改邮件服务呢? - Kostiuk Aleksandr
它不能在西里尔字母上运行。 - Kostiuk Aleksandr
1个回答

4

如果您使用支持RFC6154的imap服务器(例如Gmail),请尝试下面的代码。它应该能够检测到废纸篓文件夹的名称。

use  Mail::IMAPClient; 
 ......
my $Trash;
{
  my @Trash;
  my @fhashes = $imap->folders_hash or die "Could not get list of folder hashes.\n";
  foreach my $fhash (@fhashes) {
    next unless map { /^\\Trash$/ ? ($_) : () } @{$fhash->{attrs}};
    push (@Trash, $fhash->{name});
  }
  $Trash = pop( @Trash) if @Trash == 1;
}
if( defined( $Trash)) {
   ...
}   

是的!它适用于英语、乌克兰语和俄语。 (我改变了这个push(@Trash, $fhash->{name});) 非常感谢! - Kostiuk Aleksandr
错误修复完成。我在测试之后勇敢/愚蠢地修改了代码。无论如何,你应该把它视为一个可工作的原型。 - AnFi
我找到了一个带有垃圾邮件文件夹命名为TRASH的邮件服务。很抱歉,但是如何在正则表达式中添加“TRASH”? - Kostiuk Aleksandr
要以不区分大小写的方式检查文件夹属性,请使用/^\\Trash$/i。如果@Trash==0,则可以作为备选方案检查预定义的垃圾桶文件夹名称列表中任何文件夹的存在。 - AnFi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接