2010-11-10 3 views
2

Я пытаюсь настроить этот скрипт для своего локального информационного бюллетеня.Perl - Как получить адрес электронной почты из части заголовка FROM?

В настоящее время кто-то отправляет электронное письмо с просьбой о добавлении, мы вручную добавляем его в рассылку новостей, которую я установил. (Который отлично работает благодаря помощи, которую я нашел здесь!)

Теперь у меня есть мой скрипт ниже, чтобы войти в учетную запись электронной почты, которую я настроил для списка на нашем сервере, захватить информацию, чтобы автоматически добавить письмо.

Я знаю, что есть множество приложений, которые это делают, но я хочу учиться.

У меня уже есть «добавить в список» работает, когда есть адрес электронной почты вернулся из заголовка (с) ниже, но, иногда заголовок (с) это имя, а не адрес электронной почты (eg "persons name" is returned from persons name<[email protected]> but, not the <[email protected]>.)

Теперь я не установлен в камне по методу ниже, но он отлично работает ... до определенной степени.

Я прочитал все документы на этих модулях, и я ничего не смог найти, чтобы получить письмо darn в нем все время.

Может кто-нибудь помочь мне здесь? Подробные примеры очень ценятся, так как я борюсь за изучение 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; 

The parse method возвращает массив, поэтому выше способ работает для меня.

+0

СПАСИБО !!! my $ line = $ es-> header ('From'); my @addresses = Email :: Address-> parse ($ line); print $ addresses [0] -> address; – DulcimerDude

+0

СПАСИБО - СПАСИБО - СПАСИБО !!! ИДЕАЛЬНО... – DulcimerDude

0

Я делаю это отдельным ответом, потому что, хотя эта информация скрыта в комментариях к принятому ответу, мне потребовался целый день, чтобы понять это.

Сначала вам нужно получить заголовок From, используя что-то вроде Email :: Simple. THEN вам необходимо извлечь адресную часть с адресом электронной почты: Адрес.

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-> parse, они будут выглядеть как простые строки, , но они фактически являются объектами. Например, если вы печатаете результат Email :: Адресно> синтаксического анализа, как так,

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

Вы получите полный адрес в качестве вывода:

"Some Name" <[email protected]> 

Это было очень запутанным при работе над этим. Конечно, я вызвал путаницу, напечатав результаты в первую очередь, но я делаю это по привычке при отладке.

Смежные вопросы