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

时间:2016-01-21 11:42:29

标签: perl imap

我正在尝试使用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的参数。我在这里缺少什么?

2 个答案:

答案 0 :(得分:2)

我怀疑文件末尾有一个空行。你有问题的循环遍历所有行和文件,记住最后一行,然后使用该数据构造IMAPClient。如果您使用空帐户/密码构建它,您可能会收到类似您提到的错误。

删除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
    # ....
}

答案 1 :(得分:0)

怪异。将perl升级到el5并将lib升级到pel-5.8.8-43.el5_11perl-Mail-IMAPClient-3.37-1.el5后,perl-Email-MIME-1.903-2.el5.rf(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);