~/Mail/以下には、たくさんのメールが保存されています。ふと誰からのメールが多いんだろうと集計してみたくなりました。
やっていることは、メールのヘッダ部のFrom:行からメールアドレスを取得して回数をカウントアップしているだけなのですが、注意したことは、
- From:行が2行に渡っているメールがあるので、From:行にメールアドレスが含まれていない場合は、次の行からメールアドレスを取得する。
- メール本文の中のFrom:からメールアドレスを取ってこないようにする。
です。
あまりうまく書けていないと思いますので、何かアドバイスがありましたら遠慮なくコメントしてください。
#!/usr/bin/perl use strict; use warnings; my $debug = 0; # xxx を変更する my $dir = '~/Mail/xxx'; my %mail_addr; sub main { &calc; &display_by_count; } sub calc { NEXT_MAIL: while (my $file = <$dir/[0-9]*>){ open MAIL,$file or die "$!"; while (my $line = <MAIL>){ if ($line =~ /^From:/) { if ($line =~ /<(.*\@.*)>/) { print "$file: $1\n" if $debug; $mail_addr{"$1"}++; } else { # From:が2行に渡る場合 $line = <MAIL>; if ($line =~ /<(.*\@.*)>/){ print "$file: $1\n" if $debug; $mail_addr{"$1"}++; } } next NEXT_MAIL; # ヘッダ部だけを集計 } } } close MAIL; } sub display_by_count { foreach (sort by_count keys %mail_addr){ print "$_: $mail_addr{$_}\n"; } } sub by_count { $mail_addr{$b} <=> $mail_addr{$a}; } main; 1;