end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

メールのタイトル(MIMEなSUBJECT)は、Encode::decode('MIME-Header',〜) or MIME::Words::decode_mimewords() でデコード可

Perl - Encode::decode('MIME-Header', $value) の挙動について - Qiita
↑全く知りませんでした。

#!/usr/local/bin/perl
use strict;
use utf8;
use Encode;
use MIME::Words qw/decode_mimewords/;
use Data::Dumper;

my @SUBJECTS =
    ('=?ISO-2022-JP?B?GyRCJDMkbCRPGyhCTUlNRSBTVUJKRUNUGyRCJE4bKEJkb2Nv?=
      =?ISO-2022-JP?B?ZGUbJEIlRiU5JUhNUSRHJDkbKEI=?=',
     '=?utf-8?B?44Ku44Ks44K344ON44OeIHdpdGggVS1ORVhUIOOBiueUs+OB?=
      =?utf-8?B?l+i+vOOBv+WujOS6huOBruOBiuefpeOCieOBmw==?=' );


main();
exit(0);

sub main {

    for my $subject_org ( @SUBJECTS ){
        my $subject = MIME::Words::decode_mimewords($subject_org);
        #MIME::Words::decode_mimewords()は、表示の際のEncode::encode()が不要みたい
        print "MIME::Words::decode_mimewords ->", $subject,"\n";

        $subject = Encode::decode('MIME-Header', $subject_org);
        print "Encode::decode ->               ",Encode::encode('utf8',$subject),"\n\n";

    }
}

確かに↑こう書いたら、↓こう動きました

$ ./decode_mail_subject.pl 
MIME::Words::decode_mimewords ->これはMIME SUBJECTのdocodeテスト用です
Encode::decode ->               これはMIME SUBJECTのdocodeテスト用です

MIME::Words::decode_mimewords ->ギガシネマ with U-NEXT お申し込み完了のお知らせ
Encode::decode ->               ギガシネマ with U-NEXT お申\xE3\x81\x97込み完了のお知らせ

参考までにMIMEエンコードは、次の通り

#!/usr/local/bin/perl
use strict;
use utf8;
use Encode;
use Data::Dumper;

main();

sub main {
    my $str_org = 'これはテストです';
    my $str_2022 = Encode::encode('MIME-Header-ISO_2022_JP', $str_org);
    my $str_utf8 = Encode::encode('MIME-Header', $str_org);

    print '#### MIME-Header-ISO_2022_JP ####',"\n";
    print encode('utf8',$str_org),"\n";
    print "$str_2022\n";

    print '#### MIME-Header ####',"\n";
    print encode('utf8',$str_org),"\n";
    print "$str_utf8\n";
}

↓実行結果

$ ./foo.pl 
#### MIME-Header-ISO_2022_JP ####
これはテストです
=?ISO-2022-JP?B?GyRCJDMkbCRPJUYlOSVIJEckORsoQg==?=
#### MIME-Header ####
これはテストです
=?UTF-8?B?44GT44KM44Gv44OG44K544OI44Gn44GZ?=