プロが教えるわが家の防犯対策術!

ここで一週間も止まっています、どなたか助けてください。

あるサーバーにたまっているメールを受信して
Net::POP3;
MIME::Parser;
などを利用して本文を取り出したりしています。

件名などはきちんと解析できて日本語にできるのですが、どうしても本文だけはどうなっているのかわかりません。エンコード、デコードなどの説明が書いてあるサイトをたくさんみて200回くらいいろんな方法やパターンを試してみて本文を復元しようと試みましたが 「$B$^$7$m?'%7%s%U%)%K!<$N%Q%s$K$c(B」の文字は何も変わることなく、さすがに気が狂いそうになりましたのでここで質問しようとおもいます。

emlで保存したファイルから本文を取り出すことはできますが、読める状態になりません。

どなたか教えていただけないでしょうか?

いったい、どうしたらメールの本文をきちんと読める状態にできるのしょう?

=========================
Subject: =?ISO-2022-JP?B?GyRCJF4kNyRtPyclNyVzJVUlKSVLITwbKEI=?=
To: test@test.com
Status: RO
X-UIDL: 1358842469.4950.s323,S=1722
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit

$B$^$7$m?'%7%s%U%)%K!<$N%Q%s$K$c(B

A 回答 (2件)

No1 のお礼にあるプログラムを見る限り JIS でファイルに保存し、異なる環境 (UTF8, Shift_JIS など) で表示しているに過ぎないのではないかと思います。

確認方法として、ブラウザを利用することができます。xxx.txt などの名前で保存して、ブラウザで正常に表示されて文字エンコーディングが JIS (ISO-2022-JP) になっている、または文字エンコーディングを JIS (ISO-2022-JP) にしたら正常に表示された、のような現象であれば文字列として壊れてはいません。

文字列を変換するには、Encode モジュールを利用するのが簡単かと思います。なお、'utf8' のところは環境に合わせて変更してください ('shiftjis', 'cp932', 'euc-jp' など)。

use Encode;
...
@$message = map { encode('utf8', decode('jis', $_)) } @$message;
    • good
    • 0
この回答へのお礼

【 Perl メール 受信 文字化け 】

引き続き、解答ありがとうございますm(__)m

ブラウザにて確認した所、JIS形式になっていましたΣ(゜Д゜)
そして、文字化けもなく 綺麗に「ましろ色シンフォニーのパンにゃ
」と表示されていました・゜・(ノД`;)・゜・

つまり、サーバーに置いてある時点で JIS形式 それを何も加工せずにそのままeml形式に持って行っているという事でしょうか?

さっそく、教えていただいたコードを組み込んで見たいと思います!(またご報告いたします)

========================

お礼日時:2013/02/16 14:54

> $B$^$7$m?'%7%s%U%)%K!<$N%Q%s$K$c(B



本当にこれだけですか?

これだけだと、ISO-2022-JPのESC抜け、という典型的な文字化けパターンになっています。
先頭の$Bの前と、最後の(Bの前にESC( "\e" )を補って、ISO-2022-JP(いわゆる「JIS」)として解釈すれば

ましろ色シンフォニーのパンにゃ

と読めます。

○ メールの通信中にESCが落ちることがあります。
元のメールにESCが無い状態になっているのなら、自前で補う必要があります

○ メールには入っているのに、表示されていない、ということもあります。
ESCのようなコントロールキャラクタは、それ自体が表示されないことがよくあります。
例えば、質問に添付されているメール、どうやって貼り付けましたか?
cat XXXX.eml とか type XXXX.eml
とかして、画面に表示されたものをコピー&ペーストしてませんか?

○ どこかで、コントロールコードを削除するような処理は入っていませんか?
    • good
    • 0
この回答へのお礼

はい、本当にこれだけです。こちらのサイトを参考にして、BODY部分を取り出したりしていました。

http://digit.que.ne.jp/work/index.cgi?Perl%E3%83 …


以下は、そのプログラム(サブルーチン)ですが、

sub main {

my ($server, $account, $password, $protocol, $output) = @_;
my ($outfile, $message);

mkdir($output, 0777) unless (-d $output);
# Net::POP3オブジェクトを生成し、ログイン
my $pop3 = Net::POP3->new($server) or die "Can't not open account.";
my $login = (lc($protocol) eq 'apop') ? 'apop' : 'login';
my $count = $pop3->$login($account, $password);
# メールID/サイズのハッシュリファレンスを取得
my $messages = $pop3->list();
# メールを"<プロセスID>_<連番>_.eml"に保存
foreach $id (sort (keys %{$messages})) {

# $id番のメールを受信
$message = $pop3->get($id);

if ( $message ) { print "メールがありません $message"; }

# ファイル出力
$outfile = sprintf('%s/%d_%s.eml', $output, $$, $id);
if (open(OUT, ">$outfile")) {
print OUT @{$message};
close OUT;

}

}

# 接続を終了
$pop3->quit;

}


これを実行するとしていしたフォルダにemlファイルが生成されます。
そのemlファイルの本文の文字が文字化けしていて、そこでひっかかっていました。

お礼日時:2013/02/15 23:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!