|
#!/usr/local/bin/perl
# **********************************************************
# メール受信テストサンプル
#
# 実行時、HTML 上で <> で挟まれたメールアドレス等は
# 表示されないのでソースを確認する必要があります
# **********************************************************
print "Content-Type: text/html; Charset=Shift_JIS\n";
print "\n";
$server_name = "ドメイン";
$user_name = "ユーザ.ドメイン";
$user_pass = "パスワード";
# メールを受信します
use Net::POP3;
# メールデータを解析します
use MIME::Parser;
# メールヘッダのデコードをします(日本語が混じっている情報)
# decode_mimewords のみをインポート
# 他に encode_mimeword がある
# 全てインポートは use MIME::Words qw(:all);
use MIME::Words qw(decode_mimewords);
# メールデータの JIS を SHIFT_JIS に変換します
use Jcode;
# 接続
$objPop3 = eval{ Net::POP3->new($server_name) or die "ERR"; };
if ( !$objPop3 ) {
if (substr($@,0,3) eq 'ERR') {
print "接続できませんでした";
}
else {
print $@;
}
exit();
}
#$objPop3 = Net::POP3->new($server_name) or die "ERR";
# メールデータ解析用オブジェクト作成
$objParse = new MIME::Parser;
# 既存のデイレクトリにデータを出力します
# ここで、pop3 はディレクトリ名
# 省略するとカレントディレクトリ
#$objParse->output_dir('pop3');
# メモリ上で行ないます
$objParse->output_to_core(1);
# ログイン
# $nMessage にはメッセージ数が返ります
$nMessage = $objPop3->login($user_name,$user_pass);
print "メッセージ数は $nMessage 件です<br>\n";
#ハッシュの参照が戻されます
$msgid = $objPop3->list();
# % を付けてハッシュとして操作
# メッセッージ番号逆順ソート用コンバート
foreach $key ( keys %$msgid ) {
$sortdata{sprintf("%03d", 1000 - $key)} = $$msgid{$key};
}
# 新着順
foreach $key ( sort keys %sortdata ) {
$value = $sortdata{$key};
# メッセッージ番号を元へ戻す
$key = 1000 - $key;
# この場合、$key にメッセージ番号、$value には大きさが入ります
print "$key = $value<BR>\n";
# メッセージ番号に対応するテキスト行が入った
# 配列への参照(変数名そのもの)
$objMail = $objPop3->get($key);
# $#$objMail が配列の最後の添え字
print "* ---------- 全てのヘッダ情報<br>\n";
for( $i = 0; $i <= $#$objMail; $i++ ) {
print $$objMail[$i] . "<br>\n";
}
print "* ---------- 個別ヘッダ情報<br>\n";
# 該当メールメッセージを解析する
# MIME::Entity を返します
$entity = $objParse->parse_data($objMail);
# MIME::Headを返します
$head = $entity->head;
# 該当ヘッダ情報を文字列で返します
$data = $head->get('From');
chomp($data);
print "From : $data<br>\n";
$data = $head->get('To');
chomp($data);
print "To : $data<br>\n";
print "* ---------- Subject情報<br>\n";
# Subject のみデコードしているが、From や To にも必要
$data = $head->get('Subject');
chomp($data);
print "Subject : $data<br>\n";
# キャラクタセット毎の配列が返される
@decode = decode_mimewords( $data );
# 配列の要素は、さらにデータとキャラクタセットの配列となる
$text = "";
foreach $data ( @decode ){
# $data に @ を付けて配列扱い
($target,$charset) = @$data;
# キャラクタセットは入っていない場合もある
print "charset=$charset<br>\n";
# ここでは、shift_jis に固定変換(本来は$charset で決める)
Jcode::convert(\$target, 'sjis', 'jis');
# 改行を置換
$target =~ s/\n//g;
$text .= $target
}
print "Subject : " . $text;
print "<br>\n";
print "* ---------- 本文情報<br>\n";
# MIME::Body を返します
$body = $entity->bodyhandle;
# 本文を文字列として返します
$data = $body->as_string;
# shift_jis へ変換
Jcode::convert(\$data, 'sjis', 'jis');
# trim
$data =~ s/^\s+//;
$data =~ s/\s+$//;
print $data . "<br>\n";
print "<br><br><br>";
}
# 接続解除
$objPop3->quit;
| |