我正在尝试使用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
的参数。我在这里缺少什么?
答案 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_11
和perl-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);