使用全局变量作为 Mail::IMAPClient 的参数

Using a global variable as parameter to Mail::IMAPClient

我正在尝试使用 perl 制作一个邮件批量下载器,它将连接多个帐户并下载它的附件,但我仍在学习这门语言。我在读取文本文件中存储的凭据时遇到问题。每当我将参数作为字符串传递时,我都可以连接到我的帐户并检索有关未读电子邮件的信息。片段:

my $imap = Mail::IMAPClient->new(
  Server   => 'mail.example.com',
  User     => 'nicolas',
  Password => 'password',
  Uid      => 1,
) or die "Erro ao conectar na conta";

连接成功,并使用 my @mails = ($imap->unseen);foreach 循环,我可以将所有未看到的邮件放在列表中。

但是,如果我尝试从文件中获取我的凭据并分配给一个变量并进一步使用该变量作为 $imap 的凭据,它会失败:

foreach my $line ( @lines ) {
  my @credentials = split( /\s+/, $line );
  my $domain = $credentials[0];
  my $account = $credentials[1];
  my $password = $credentials[2];

my $imap = Mail::IMAPClient->new(
  Server   => 'mail.example.com',
  User     => $account,
  Password => $password,
  Uid      => 1,) 
}

当我 运行 脚本时,我收到此消息:

$ ./folder_list.pl
Can't call method "select" on an undefined value at ./folder_list.pl line 43.

如果我 print "$account", "$password"; 我可以检查它的值,但不能将它们用作 $imap 的参数。我在这里错过了什么?

我怀疑你的文件末尾有一个空行。您遇到的这个循环遍历所有行和文件,只记住 最后一个,然后使用该数据构造 IMAPClient 。如果你用空 account/password 构造它,你可能会遇到你提到的那些错误。

删除 our 并使用 my 并将处理移至循环中,因为我知道这正是您想要的 - 对每个帐户进行 IMAP 处理。

foreach my $line ( @lines ) {
    my @credentials = split( /\s+/, $line );
    my  $domain = $credentials[0];
    my  $account = $credentials[1];
    my  $password = $credentials[2];

    my $imap = Mail::IMAPClient->new(
        Server   => 'mail.example.com',
        User     => $account,
        Password => $password,
        Uid      => 1,
    )

    # Rest of code for each mailbox
    # ....
}

奇怪。将 perl 升级到 pel-5.8.8-43.el5_11 并将库升级到 perl-Mail-IMAPClient-3.37-1.el5perl-Email-MIME-1.903-2.el5.rf 后,问题已在 el5(CentOS) 上解决。不知道 是他们造成问题的原因,但问题已解决。

代码还是一样:

  # Faz a conexão com a conta. Se não der certo passa pra próxima
  my $imap = Mail::IMAPClient->new(
    Server   => $mailserver,
    User     => $account,
    Password => $password,
    Uid      => 1) or ($log_script->log("$hora: Erro de autenticação na conta $account. Verifique as credenciais") and next);