Perlによるメール受信・パース(Net::POP3+Email::MIME)

先ほどのエントリーとは逆にPerlを使ってメールの受信をしてみます。メールサーバからメールを取得するのにはNet::POP3を、その内容をパースするのにはEmail::MIMEを利用します。

前回と同じく学習テストを兼ねてサンプルを作成してみました。今回も単純な例としてHTMLメールや添付ファイルとかは考慮せず、サーバに残っているメールからタイトルと本文を表示させてみます。

use strict;
use warnings;
use utf8;
use Encode qw(encode);
use Net::POP3;
use Email::MIME;

my $server   = 'mail.example.com';
my $account  = 'hoge';
my $password = 'bar';
my $protocol = 'pop3';

my $pop3     = Net::POP3->new($server) or die 'can not open account.';
my $count    = $pop3->login($account, $password);
my $messages = $pop3->list;

my $layout = << 'TMPL';
[TITLE]
%s

[BODY]
%s


TMPL

for my $id ( sort { $a <=> $b } keys %{ $messages } ) {
    my $mail   = join q(), @{ $pop3->get($id) };
    my $parsed = Email::MIME->new($mail);

    print sprintf $layout,
                  encode( 'utf8', $parsed->header('Subject') ),
                  encode( 'utf8', $parsed->body              )
    ;
}

$pop3->quit;
1;

サンプルではメールの取得はPOP3を想定してますが、Net::POP3でAPOPでのメール取得もできるみたいです。

またEmail::MIMEを通すと単純なメールならUTF-8(utf8フラグ付)にデコードした状態で内容を取得できるようになるので便利。