發新話題

用Perl編寫讀取POP3郵箱的應用程序

用Perl編寫讀取POP3郵箱的應用程序

本文將討論開發人員利用Perl特定的能力編寫POP3電子郵件應用程序。

像微軟的Outlook和Mozilla的雷鳥(Thunderbird)這樣的電子郵件客戶端程序能夠讓收發電子郵件變得極其簡單——絕大多數時候,你需要做的只不過是點擊一下工具條上的按鈕,軟件會為你完成與電子郵件服務器進行通信、驗證密碼、收取電子郵件等複雜的工作。

但是在這種具有欺騙性的簡單表象背後卻牽涉大量的軟件編程工作。而且,如果你是一個軟件開發人員,你可能有一天會發現如果能夠把這樣的程序放到自己的應用程序會有多好啊。

不用擔心那麼多,因為如果你在使用Perl,那麼你就可以利用一個叫做Net:OP3的小CPAN模塊來實現這一願望,這個十分有用的模塊會為你完成大多數複雜的工作。這個模塊向POP3服務器的交互操作公開一個簡單但是非常強大的API,提供一些預設的方法來進行服務器身份驗證、消息列表和收取、消息刪除,以及結束會話——簡而言之,它提供了滿足用戶基本需要的一切。

註:列表A到C裡的代碼文本可以從可下載的Zip文件裡獲得。

本文將通過使用Net:OP開發一個簡單的POP3電子郵件應用程序來探討它的一些功能。一開始你需要在Perl提示符下運行下面的命令來下載和安裝這個模塊(如果你還沒有的話):
複製內容到剪貼板
代碼:
perl> perl -MCPAN -e "install Net::POP3"
開始創建下面的Perl腳本(列表A):

列表A
複製內容到剪貼板
代碼:
#!/bin/perl

# import package
use Net::POP3;

# ask user for critical variables
print "Mail host: ";
$host = <STDIN>;
chomp($host);

print "\n";
print "Mailbox username: ";
$user = <STDIN>;
chomp($user);

print "\n";
print "Mailbox password: ";
$pass = <STDIN>;
chomp($pass);

# 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");

# display number of messages
if ($numMsg > 0) {
    print "Mailbox has $numMsg message(s).\n";
} else {
    print "Mailbox is empty.\n";
}

# close connection
$conn->quit();
這個代碼段會要求用戶輸入三個內容:電子郵件服務器的主機名、POP3用戶名和相應的密碼。一旦輸入了這三項內容,一個新的Net:OP3對象就會被創建,而對象的login()方法會被用來打開一個到主機的連接,並驗證所提供的憑據。如果提供的憑據被服務器認可,那麼login()方法就會返回郵箱裡的消息數量(或者返回0,如果沒有消息的話)。

下面就是它的一個實際例子:
複製內容到剪貼板
代碼:
Mail host: pop.mailbox.com
Mailbox username: jane
Mailbox password: secret

Mailbox has 77 message(s).
當然,僅僅知道消息的數量是遠遠不夠的——你肯定希望知道這些消息的內容。通過Net::POP3的top()方法就能夠達到這個目的,它會掃瞄消息的前X行,並返回一個指向含有已收取數據的數組的參考。下面就是一個例子,(列表B)會取回郵箱裡所有消息的前20行:

列表B
複製內容到剪貼板
代碼:
#!/bin/perl

# import package
use Net::POP3;

# ask user for critical variables
print "Mail host: ";
$host = <STDIN>;
chomp($host);

print "\n";
print "Mailbox username: ";
$user = <STDIN>;
chomp($user);

print "\n";
print "Mailbox password: ";
$pass = <STDIN>;
chomp($pass);

# 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)) {
        $ref = $conn->top($msg, 20);
        print @$ref;
        print "\n\n";
    }
} else {
    print "Mailbox is empty.\n";   
}

# close connection
$conn->quit();
你可以使用get()方法而不用top()方法,從而收取完整的消息。

如果你希望的話,你可以在命令行通過Getopt:ong模塊把服務器的參數傳遞給程序,下面的列表C顯示了這個模塊:

列表C
複製內容到剪貼板
代碼:
#!/bin/perl

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

# 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>");

# 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)) {
        $ref = $conn->top($msg, 20);
        print @$ref;
        print "\n\n";
    }
} else {
    print "Mailbox is empty.\n";   
}

# close connection
$conn->quit();
這些代碼模板會告訴你如何把Net::POP3集成到需要處理電子郵件的應用程序裡。自己動手試試吧,祝你編程愉快!

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。