簡體   English   中英

Perl - 如何從標題的 FROM 部分獲取電子郵件地址?

[英]Perl - How to get the email address from the FROM part of header?

我正在嘗試為我的本地樂隊通訊設置此腳本。

目前,有人發送了一封包含要添加請求的電子郵件,我們手動將其添加到我設置的時事通訊郵件程序中。 (非常感謝我在這里找到的幫助!)

現在的目的是讓下面的腳本登錄我為服務器上的列表設置的電子郵件帳戶,獲取信息以自動添加電子郵件。

我知道有很多應用程序可以做到這一點,但是,我想自己學習。

當從下面的標題(來自)返回一個電子郵件地址時,我已經有“添加到列表”工作,有時標題(來自)是一個名字而不是電子郵件地址( eg "persons name" is returned from persons name<email@address> but, not the <email@address> 。)

現在,我並沒有對下面的方法一成不變,但是,它的效果非常好......在某種程度上。

我閱讀了有關這些模塊的所有文檔,但始終找不到任何內容來獲取該死的電子郵件。

有人可以在這里幫助我嗎? 由於我正在努力學習 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 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;
use Email::Address;
my @addresses = Email::Address->parse('persons name <email@address>');
print $addresses[0]->address;

parse方法返回一個數組,所以上面的方法對我有用。

我將其作為一個單獨的答案,因為即使這些信息隱藏在已接受答案的評論中,我也花了一整天的時間才弄明白。

首先,您需要使用 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 個步驟。

最后一步令人困惑,因為 Email::Address 使用了一些伏都教,如果你打印 Email::Address->parse 返回的部分,它們看起來像簡單的字符串,但它們實際上是對象 例如,如果您像這樣打印 Email::Address->parse 的結果,

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

您將獲得完整的地址作為輸出:

"Some Name" <address@example.com>

在處理此問題時,這非常令人困惑。 當然,我首先打印結果引起了混亂,但我在調試時出於習慣這樣做。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM