$BH*$G$9!#$=$N8e!J(B:-D$B!K$G$9!#(B
Post by Masanori HATA$B%k<+BN$N7g4Y$N$;$$$_$?$$$G$9$M!#(B
RFC 2822 $B$N(B WSP $B$H$7$FDj5A$5$l$F$$$k$b$N$r(B SP $B$H(B HTAB $B$G;H$$J,$1$k$h$&$K(B
$B$/!"F|K\8l!JCf9q8l!&4Z9q8l$bF1MM$G$9$,!K$K$H$C$F$N7g4Y$r2r>C$G$-$k$h$&$K(B
$B;W$($^$9!#(B
$B$k(B WSP $B$H$7$F07$&$H$$$&%k!<%k$K$9$l$P$$$$$H;W$&$o$1$G$9!#(B
$B!JCfN,!K(B
Post by Masanori HATA$B!J(Bunstructured$B!K$d%"%I%l%9!J(Bstructured$B!K$NI=<(L>!J(Bdisplay-name$B!K$G$b2DG=(B
$B$K$J$j$^$9$M!#(B
$B(!(!$J$s$F$3$H$r9M$($?$j$7$F$$$^$7$?$,!"$b$&0l$DJL$J$d$jJ}$r9M$($^$7$?!#(B
$B$=$l$O!"D9$$J8;zNs$r@^$jJV$9$k$?$a$K!"6/@)E*$K6uGrJ8;z$rA^F~$9$k>l9g!"6uGr(B
$BJ8;z$N8e$KB3$1$F!"@)8fJ8;z$N(BBS$B!J%P%C%/%9%Z!<%9!'(BASCII$B%3!<%I(B8$B!K$r%Z%"$K$9$k(B
$B$H$$$&J}K!$G$9!#$3$l$b!"%a!<%k%j!<%@B&$G(BBS$B$N2r<a$K$D$$$F%3%s%;%s%5%9$rF@$i(B
$B$l$F$$$J$1$l$P!"0UL#$O$"$j$^$;$s$N$G!"C1$J$kDs0F$K$9$.$^$;$s$,!#(B
$B$=$s$J$o$1$G!"(Bunstructured $B%X%C%@!JNc!'BjL>%X%C%@!K$K4X$7$F!"(BRFC 2047 $B$N(B
MIME $BId9f2=%X%C%@J}<0$rL5;k$7$F!"(BMIME $BId9f2=$7$J$$!"AG$N(B UTF-8 $B$NJ8;zNs$r(B
RFC 2822 $B$N@)8BJ8;z?t(B 78 $B%P%$%H0JFb$K@^JV$7$9$kJ}<0$r:NMQ$7$F$_$^$7$?!#$d(B
$B$C$F$$$k$N$O!"B?%P%$%HD9J8;z$N>l9g$O!"ESCf$G6/@)2~9T$,$5$l$k$3$H$N$J$$$h$&(B
$B$KCm0U$7$F$$$kDxEY$G$9!#(B
$B2<$K%W%m%H%?%$%W$r:\$;$F$*$-$^$9!#(B
# $B:F5"E*I=8=$G$9$C$-$j=q$1$?$D$b$j$G$9!#(B;-)
# $B$D$$$G$KF|K\8l;H$$$^$/$j!#(B
MIME $BId9f2=$9$kJ}<0$N$b$N$O$^$?JLES:n$kM=Dj$G$9!#(B
--
Masanori HATA
#!/usr/local/bin/perl -w
use 5.008;
use strict;
use warnings;
use utf8;
use Carp;
# $BDj?t$***@k8@(B
my $$B9TD9(B = 78;
my $$BC;8l(B = $$B9TD9(B - 1;
my $$BD98l(B = $$BC;8l(B + 1;
my $$B2~9T(B = "\x0D\x0A";
my $$B6uGrJ8;z<o(B = "\x20\x09";
my $$BBhH,0LJ8;z<o(B = "\x80-\xFF";
my $$B6/@)2~9T;~6uGr(B = "\x20\x08";
# $B%Q%C%1!<%8Fb%0%m!<%P%kJQ?t$***@k8@(B
my($$B=hM}:Q(B, $$BL$=hM}(B);
sub $BC;$$(BASCII$B8l(B ($) {
my $$B=hM}BP>](B = $_[0];
$$B=hM}:Q(B =~ m/($$B2~9T(B|^)([^$$B2~9T(B]*)$/;
my $$B:G8eHx(B = $2;
if (length($$B=hM}BP>](B) <= $$B9TD9(B - length($$B:G8eHx(B)) {
$$B=hM}:Q(B .= $$B=hM}BP>](B;
}
else {
$$B=hM}:Q(B .= $$B2~9T(B . $$B=hM}BP>](B;
}
}
sub $BD9$$(BASCII$B8l(B ($) {
my $$B=hM}BP>](B = $_[0];
$$B=hM}:Q(B =~ m/($$B2~9T(B|^)([^$$B2~9T(B]*)$/;
my $$B:G8eHx(B = $2;
my $$BM>CO(B = $$B9TD9(B - length($$B:G8eHx(B);
if ($$BM>CO(B and $$BM>CO(B >= length($$B=hM}BP>](B)) {
$$B=hM}:Q(B .= $$B=hM}BP>](B;
}
elsif ($$BM>CO(B) {
$$B=hM}:Q(B .= substr($$B=hM}BP>](B, 0, $$BM>CO(B);
# $B:F5"(B
&$BD9$$(BASCII$B8l(B( substr($$B=hM}BP>](B, $$BM>CO(B) );
}
else {
$$B=hM}:Q(B .= $$B2~9T(B . $$B6/@)2~9T;~6uGr(B;
# $B:F5"(B
&$BD9$$(BASCII$B8l(B($$B=hM}BP>](B);
}
}
sub $BD9$$BhH,0LJ8;z4^M-8l(B ($) {
utf8::decode(my $$B=hM}BP>](B = $_[0]);
utf8::encode(my $$B0lJ8;z(B = substr($$B=hM}BP>](B, 0, 1));
$$B=hM}:Q(B =~ m/($$B2~9T(B|^)([^$$B2~9T(B]*)$/;
my $$B:G8eHx(B = $2;
if (length($$B0lJ8;z(B) <= $$B9TD9(B - length($$B:G8eHx(B)) {
$$B=hM}:Q(B .= $$B0lJ8;z(B;
}
else {
$$B=hM}:Q(B .= $$B2~9T(B . $$B6/@)2~9T;~6uGr(B . $$B0lJ8;z(B;
}
utf8::encode(my $$B;D$j(B = substr($$B=hM}BP>](B, 1));
# $B:F5"(B
&$BD9$$BhH,0LJ8;z4^M-8l(B($$B;D$j(B) if $$B;D$j(B;
}
sub $B@^JV$9(B ($$) {
$$B=hM}:Q(B = $_[0] . ':';
utf8::encode($$BL$=hM}(B = "\x20" . $_[1]);
while ($$BL$=hM}(B) {
if ($$BL$=hM}(B =~ s/^[$$B6uGrJ8;z<o(B][^$$B6uGrJ8;z<o(B]{1,$$BC;8l(B}(?=[$$B6uGrJ8;z<o(B]|$)//) {
$BC;$$(BASCII$B8l(B($&);
}
elsif ($$BL$=hM}(B =~ s/^[$$B6uGrJ8;z<o(B]//) {
$BC;$$(BASCII$B8l(B($&);
}
elsif ($$BL$=hM}(B =~ s/^[^$$B6uGrJ8;z<o(B^$$BBhH,0LJ8;z<o(B]{$$BD98l(B,}(?=[$$B6uGrJ8;z<o(B]|$)//) {
$BD9$$(BASCII$B8l(B($&);
}
elsif ($$BL$=hM}(B =~ s/^[^$$B6uGrJ8;z<o(B]{$$BD98l(B,}(?=[$$B6uGrJ8;z<o(B]|$)//) {
$BD9$$BhH,0LJ8;z4^M-8l(B($&);
}
else {
carp 'unsupposed regex error: ' . $$BL$=hM}(B . ';';
}
}
}
# $B0J2<!";HMQNc(B
my $$BNN0hL>(B = 'Subject';
my $$BNN0hFbMF(B = '$B$3$l$OI.$G$9!#$3$l$OI.$G$9!#$3$l$OI.$G$9!#$3$l$OI.$G$9!#(B';
$B@^JV$9(B($$BNN0hL>(B, $$BNN0hFbMF(B);
print $$B=hM}:Q(B;