2010-11-10 71 views
2

我正在嘗試爲本地樂隊簡報設置此腳本。Perl - 如何從頭部的FROM部分獲取電子郵件地址?

目前,有人發送一封電子郵件,其中包含要添加的請求,我們將其手動添加到我設置的通訊郵件程序中。 (這工作很好,謝謝我在這裏找到的幫助!)

現在的意圖是讓我的腳本登錄到我爲我們的服務器上的列表設置的電子郵件帳戶,獲取信息以自動添加電子郵件。

我知道有一堆應用程序可以做到這一點,但我想了解自己。

我已經有「添加到列表」時,有一個電子郵件地址從標題下方的返回(從)工作,但是,有時頭(從)是一個名稱,而不是電子郵件地址(eg "persons name" is returned from persons name<[email protected]> but, not the <[email protected]>。)

現在,我不是沉迷於下面的方法,但是,它着名... ...的一個點。

我閱讀了關於這些模塊的所有文檔,沒有任何我能找到的東西在那裏得到電子郵件。

有人可以幫我嗎?詳細的例子非常感謝,因爲我正在努力學習Perl。

#!/usr/bin/perl -w 
    ########## 
    use CGI; 
    use Net::IMAP::Simple; 
    use Email::Simple; 
    use IO::Socket::SSL; #optional i think if no ssl is needed 
    use strict; 
    use CGI::Carp qw(fatalsToBrowser warningsToBrowser); 
    ###################################################### 
    # fill in your details here 
    my $username = '#########'; 
    my $password = '#############'; 
    my $mailhost = '##############'; 
    ####################################################### 
    print CGI::header(); 
    # Connect 
    my $imap = Net::IMAP::Simple->new($mailhost, port=> 143, use_ssl => 0,) || die "Unable to connect to IMAP: $Net::IMAP::Simple::errstr\n"; 
    # Log in 
    if (!$imap->login($username, $password)) { 
     print STDERR "Login failed: " . $imap->errstr . "\n"; 
     exit(64); 
    } 
    # Look in the the INBOX 
    my $nm = $imap->select('INBOX'); 
    # How many messages are there? 
    my ($unseen, $recent, $num_messages) = $imap->status(); 
    print "unseen: $unseen, <br />recent: $recent, <br />total: $num_messages<br />\n\n"; 
    ## Iterate through unseen messages 
    for (my $i = 1 ; $i <= $nm ; $i++) { 
     if ($imap->seen($i)) { 
     my $es = Email::Simple->new(join '', @{ $imap->top($i) }); 
     printf("[%03d] %s\n\t%s\n", $i, $es->header('From'), $es->header('Subject')); 
     print "<br />"; 
     next; 
     }## in the long version these are pushed into different arrays for experimenting purposes 
     else { 
     my $es = Email::Simple->new(join '', @{ $imap->top($i) }); 
     printf("[%03d] %s\n\t%s\n", $i, $es->header('From'), $es->header('Subject')); 
     print "<br />"; 
     } 
    } 
    # Disconnect 
    $imap->quit; 
    exit; 

回答

5
use Email::Address; 
my @addresses = Email::Address->parse('persons name <[email protected]>'); 
print $addresses[0]->address; 

parse method返回數組,因此上述方法爲我工作。

+0

謝謝! my $ line = $ es-> header('From');我的@addresses = Email :: Address-> parse($ line);打印$地址[0] - >地址; – DulcimerDude 2010-11-10 16:54:09

+0

謝謝 - 謝謝 - 謝謝!完善... – DulcimerDude 2010-11-10 17:01:27

0

我在做這個單獨的答案,因爲即使這些信息隱藏在接受答案的評論中,我花了整整一天的時間才弄清楚。

首先你需要使用類似Email :: Simple的東西來獲取From頭文件。 然後你需要用Email :: Address來提取地址部分。

use Email::Simple; 
use Email::Address; 

my $email = Email::Simple->new($input); 
my $from = $email->header('From'); 
my @addrs = Email::Address->parse($from); 
my $from_address = $addrs[0]->address; # finally, the naked From address. 

這4個步驟依次進行。

的最後一步是由混亂通過電子郵件::地址使用一些巫術在那裏,如果您打印的電子郵件::地址 - >解析返回部分的事實,他們看起來像簡單的字符串,但它們實際上是對象。例如,如果您打印的電子郵件::地址 - >解析像這樣的結果,

my @addrs = Email::Address->parse($from); 
foreach my $addr (@addrs) { say $addr; } 

您將得到完整的地址作爲輸出:

"Some Name" <[email protected]> 

這方面的工作時,這是非常令人困惑。當然,我通過首先打印結果導致了混淆,但是我在調​​試時出於習慣。

相關問題