2009-10-22 66 views
-2

編輯如何從Mail :: Message中獲取電子郵件內容?

現在我的代碼是這樣的:

#!/usr/bin/perl 

# import packages 
use Net::POP3; 
use Getopt::Long; 
use Mail::Message; 
use strict; 
use warnings; 

# read command line options 
# display usage message in case of error 
GetOptions ('h|host=s' => \$host, 
      'u|user=s' => \$user, 
      'p|pass=s' => \$pass) or die("Input error. Try calling me with: -h <host> -u <username> -p <password>"); 

# file operations 
open($email_file, ">>", "Mail.txt"); 

# initiate connection 
# default timeout = 120 sec 
$conn = Net::POP3->new($host) or die("ERROR: Unable to connect.\n"); 

# login 
$numMsg = $conn->login($user, $pass) or die("ERROR: Unable to login.\n"); 

# get message numbers 
# iterate over list and print first 20 lines of each 
if ($numMsg > 0) { 
    $msgList = $conn->list(); 
    foreach $msg (keys(%$msgList)) { 
     $rawdata = $conn->get($msg); 
     my $msg_obj = Mail::Message->read($rawdata); 
     my $body = $msg_obj->body; 
     print $email_file @body; 
     print $email_file "\n====================================================\n"; 
    } 
} else { 
    print "Mailbox is empty.\n"; 
} 

# close connection 
$conn->quit(); 
close($email_file); 

但是當我試圖執行它我得到這個:

[[email protected]:~/Desktop/mail] ./get.pl -h pop.vix.terra.com.br -u nathanpc -p secret 
Global symbol "$host" requires explicit package name at ./get.pl line 12. 
Global symbol "$user" requires explicit package name at ./get.pl line 13. 
Global symbol "$pass" requires explicit package name at ./get.pl line 14. 
Global symbol "$email_file" requires explicit package name at ./get.pl line 17. 
Global symbol "$conn" requires explicit package name at ./get.pl line 21. 
Global symbol "$host" requires explicit package name at ./get.pl line 21. 
Global symbol "$numMsg" requires explicit package name at ./get.pl line 24. 
Global symbol "$conn" requires explicit package name at ./get.pl line 24. 
Global symbol "$user" requires explicit package name at ./get.pl line 24. 
Global symbol "$pass" requires explicit package name at ./get.pl line 24. 
Global symbol "$numMsg" requires explicit package name at ./get.pl line 28. 
Global symbol "$msgList" requires explicit package name at ./get.pl line 29. 
Global symbol "$conn" requires explicit package name at ./get.pl line 29. 
Global symbol "$msg" requires explicit package name at ./get.pl line 30. 
Global symbol "$msgList" requires explicit package name at ./get.pl line 30. 
Global symbol "$rawdata" requires explicit package name at ./get.pl line 31. 
Global symbol "$conn" requires explicit package name at ./get.pl line 31. 
Global symbol "$msg" requires explicit package name at ./get.pl line 31. 
Global symbol "$rawdata" requires explicit package name at ./get.pl line 32. 
Global symbol "$email_file" requires explicit package name at ./get.pl line 34. 
Global symbol "@body" requires explicit package name at ./get.pl line 34. 
Global symbol "$email_file" requires explicit package name at ./get.pl line 35. 
Global symbol "$conn" requires explicit package name at ./get.pl line 42. 
Global symbol "$email_file" requires explicit package name at ./get.pl line 43. 
Execution of ./get.pl aborted due to compilation errors. 
[[email protected]:~/Desktop/mail] 

原始

你好,

我正在學習Perl,並在同一時間做一個自制的項目,我將它用於我的家人的事件,但是當我使用Mail :: Message獲取只有電子郵件的身體我一無所獲。見我的代碼:

#!/usr/bin/perl 

# import packages 
use Net::POP3; 
use Getopt::Long; 
use Mail::Message; 

# read command line options 
# display usage message in case of error 
GetOptions ('h|host=s' => \$host, 
      'u|user=s' => \$user, 
      'p|pass=s' => \$pass) or die("Input error. Try calling me with: -h <host> -u <username> -p <password>"); 

# file operations 
open(file, ">>", "Mail.txt"); 

# initiate connection 
# default timeout = 120 sec 
$conn = Net::POP3->new($host) or die("ERROR: Unable to connect.\n"); 

# login 
$numMsg = $conn->login($user, $pass) or die("ERROR: Unable to login.\n"); 

# get message numbers 
# iterate over list and print first 20 lines of each 
if ($numMsg > 0) { 
    $msgList = $conn->list(); 
    foreach $msg (keys(%$msgList)) { 
     my $msg_obj = Mail::Message::->read($rawdata); 
     my $body = $msg_obj->body; 
     print file @body; 
     print file "\n====================================================\n"; 
    } 
} else { 
    print "Mailbox is empty.\n"; 
} 

# close connection 
$conn->quit(); 
close(file); 

而且我使用存儲電子郵件的文件:

==================================================== 

==================================================== 

==================================================== 

什麼,我做錯了什麼?謝謝。

+0

這是很好的進展。我看到你已經使用'my'來聲明一些變量。 'use strict'要求你使用'my'來表示你使用的所有變量。 – mob 2009-10-22 18:37:17

+0

非常感謝!現在我學會了自己,我可以繼續我的項目給我的家人。謝謝! – 2009-10-22 18:52:08

+0

:(爲什麼下來投票 – 2009-10-22 18:55:29

回答

2

$rawdata從哪裏來?你忘了說些什麼像

$rawdata = $conn->get($msg); 

use strictuse warnings位於腳本的頂部可能會幫助您理解這一點。

+0

我得到了同樣的事情 – 2009-10-22 17:03:58

+3

爲什麼不。 「T你使用嚴格和使用警告,修復您的代碼,並更新你的問題的代碼示例我在郵件::消息不是專家,但我在使用未初始化的變量產生錯誤的專家;?) – mob 2009-10-22 17:11:47

2

$raw_data中沒有任何內容,因爲您從未分配給它。

@body(數組變量)中沒有任何內容。你把東西放在$body(一個標量變量)中。

這些是use strict爲您找到的各種問題。 :)

+0

使用'嚴格「和」使用警告「,直到你明白你爲什麼使用它們。然後繼續使用它們。 – mob 2009-10-22 17:26:04

0

所有形式的信息:

Global symbol "$host" requires explicit package name at ./get.pl line 12. 

從您啓用嚴格的變量與use strict,這就需要你在使用之前聲明變量的事實來。

嘗試添加use diagnostics以獲取有關錯誤消息的擴展說明。

您還可以運行splain來解釋錯誤消息。運行腳本並將stderr捕獲到文件中get.pl 2> errors然後運行splain errors

對於您的錯誤splain說:

全局符號 「$主機」 需要在./get明確的包名。PL線12(#1) (F)你說:「使用嚴格瓦爾」,這表示所有變量 必須被詞法範圍(使用「我的」),宣佈提前使用 「我們的」,或明確合格說這包全局變量 是(用「::」)。

退房perldoc strictperldoc warningsperldoc perllexwarn,最後是perldoc -f my

腳本的第一位固定的(畢竟使用語句):

# read command line options 
# display usage message in case of error 

# predeclaring all variables with `my` 
my $host = 'localhost'; # you can set default values for Getopt::Long this way. 
my $user; 
my $pass; 

GetOptions ('h|host=s' => \$host, 
      'u|user=s' => \$user, 
      'p|pass=s' => \$pass, 
) or die("Input error. Try calling me with: -h <host> -u <username> -p <password>"); 
相關問題