Perl - 如何从标题的FROM部分获取电子邮件地址?

时间:2010-11-10 15:48:18

标签: perl email

我正在尝试为我的本地乐队简报设置此脚本。

目前,有人发送了一封包含要添加的请求的电子邮件,我们会手动将其添加到我设置的新闻邮件中。 (这要归功于我在这里找到的帮助!)

现在的目的是让我的脚本登录到我为服务器上的列表设置的电子邮件帐户,获取信息以自动添加电子邮件。

我知道有很多应用可以做到这一点,但我想学习自己。

当BUT下方标题(从)返回电子邮件地址时,我已经有了“添加到列表”,有时标题(来自)是名称而不是电子邮件地址(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 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;

2 个答案:

答案 0 :(得分:5)

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

parse method返回一个数组,所以上面的方法适用于我。

答案 1 :(得分: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个步骤。

由于Email :: Address使用了一些voodoo,如果你打印Email :: Address-&gt; parse返回的部分,它们将看起来像简单的字符串,但它们是实际上是对象。例如,如果您打印Email :: Address-&gt;解析结果,那么

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

您将获得完整的地址作为输出:

"Some Name" <address@example.com>

在处理此问题时,这非常令人困惑。当然,我首先打印结果引起了混乱,但我在调试时习惯这样做。