Perl - Как получить адрес электронной почты из части заголовка? - PullRequest
2 голосов
/ 10 ноября 2010

Я пытаюсь настроить этот скрипт для рассылки моей местной группы.

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

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

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

У меня уже работает «добавить в список», когда есть адрес электронной почты, возвращаемый из заголовка (из) ниже НО, иногда заголовок (из) - это имя, а не адрес электронной почты (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 ]

5 голосов
/ 10 ноября 2010
use Email::Address;
my @addresses = Email::Address->parse('persons name <email@address>');
print $addresses[0]->address;

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

0 голосов
/ 29 июля 2017

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

Сначала вам нужно получить заголовок Отиспользуя что-то вроде Email :: Simple. ТО вам нужно извлечь адресную часть с помощью 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>

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...