#!/usr/bin/perl ##################################################### # # detail.cgi # VFリリース詳細用ファイル # 2009/2/16 # by uchino # #---------------------------------------------------- # # index.cgiのから分離させた # ##################################################### use CGI::Carp qw(fatalsToBrowser); use DBI; # 設定項目 ---------------------------------------------------------------------------------------------------- require './init.cgi'; # メイン処理 --------------------------------------------------------------------------------------- @key = &stdio::getFormData(\%in, 2, 'euc', "\x00", "$idir/"); $tm = stdio::getTime("%yyyy-%mm-%dd %hh:%nn:%ss", 3600 * 9); #$dbh = DBI->connect('DBI:Pg:dbname=pdb_matching;host=210.166.216.9', 'postgres', 'postgres'); #&error("データベースの接続に失敗しました。
$DBI::errstr") if(!$dbh && $dbg == 1); #&error("サーバーエラー

ご迷惑おかけします。しばらく待ってから再度お試しください。") if(!$dbh && $dbg == 0); $dbh = DBI->connect('DBI:mysql:pdb', 'root', '123pdb'); &error("データベースの接続に失敗しました。
$DBI::errstr") if(!$dbh && $dbg == 1); &error("サーバーエラー

ご迷惑おかけします。しばらく待ってから再度お試しください。") if(!$dbh && $dbg == 0); #文字化け対策 $setc = "set names ujis"; $rc = $dbh->do($setc) || die $dbh->errstr; $in{'m'} = 'd' if($in{'m'} eq ''); #■リリース詳細画面--------------------------------------------------------------------------------' if($in{'m'} eq 'd') { if($in{'p'} eq '1') { &ModeDetail(); sub ModeDetail{ $tm = stdio::getTime("%yyyy-%mm-%dd %hh:%nn:%ss", 3600 * 9); $in{'p'} = 1 if($in{'p'} eq ''); if($in{'p'} == 1) { $o = ' limit 0, 11'; #アクセスログを保存 if($#$rec < 0) { $ip_addr = $ENV{REMOTE_ADDR}; $referer = $ENV{'HTTP_REFERER'}; $sql = qq/insert into vfr_news_aces ( vfr_news_id, access_time, ip_addr, referer ) values ($in{'i'}, '$tm', "$ip_addr", "$referer")/; $rows = $dbh->do($sql); &error("データベースエラーが発生しました。__LINE__
$DBI::errstr
$sql
") if(!$rows && $dbg == 1); # &error("サーバーエラー

ご迷惑おかけします。しばらく待ってから再度お試しください。") if(!$rows && $dbg == 0); } } #文字化け対策 $setc = "set names ujis"; $rc = $dbh->do($setc) || die $dbh->errstr; #リリースの詳細取得 $sql = qq|select |. qq|vfr_news.id, vfr_news.entid, vfr_news.news_title, vfr_news.read_text, |. #0-3 qq|vfr_news.genre, vfr_news.date_publish, vfr_news.contents, |. #4-6 qq|vfr_news.detail_descriptions, vfr_news.key_words, vfr_news.deliver_to, |. #7-9 qq|vfr_news.admid, vfr_news.uptime, vfr_news.del, vfr_news.vpgenre, |. #10-13 qq|vfr_news.vpgenre2, vfr_news.vpgenre3 |. #14-15 qq|from vfr_news |. qq|where vfr_news.id = "$in{'i'}" | . qq|and vfr_news.del = 0 |; $rec1 = $dbh->selectall_arrayref($sql); &error("データベースエラーが発生しました。__LINE__
$DBI::errstr
$sql
") if(!$rec1 && $dbg == 1); &error("サーバーエラー

ご迷惑おかけします。しばらく待ってから再度お試しください。") if(!$rec1 && $dbg == 0); #企業情報の取得 $sql = qq|select vfr_news.id, vfr_news.entid, vfr_news.news_title, vfr_news.read_text, vfr_news.genre, vfr_news.date_publish, vfr_news.contents, vfr_news.detail_descriptions, vfr_news.key_words, vfr_news.deliver_to, vfr_news.admid, vfr_news.uptime, vfr_news.del, ent.entname | . qq|from vfr_news | . qq|left join ent on vfr_news.entid = ent.id | . qq|where vfr_news.entid = "$$rec1[0][1]" | . qq|and vfr_news.date_publish <= '$tm' | . qq|and ( vfr_news.del = 0 AND ent.del != 1 ) | . qq|order by vfr_news.date_publish desc | . qq|$o|; $rec2 = $dbh->selectall_arrayref($sql); &error("データベースエラーが発生しました。__LINE__
$DBI::errstr
$sql
") if(!$rec2 && $dbg == 1); &error("サーバーエラー

ご迷惑おかけします。しばらく待ってから再度お試しください。") if(!$rec2 && $dbg == 0); $m = $#$rec2 < 9 ? $#$rec2 : 9;#リリースが10件以下ならその数、10件以上なら10件 for($i = 0; $i <= $m; $i ++) { $id = $$rec2[$i][0]; # リリースID $ptitle = $$rec2[$i][2]; # タイトル $ptitle =~ s/\x0d\x0a|\x0d|\x0a/
\n/g; $ptitle =~ s/([a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+)/$1<\/a>/g; $ptitle = &stdio::setLink(\$ptitle, 'target="_blank"'); $pdate = $$rec2[$i][5]; # 時刻 $pdate =~ s/^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):\d\d$/$1年$2月$3日/; # $durl = "$script?m=d&i=$id"; $durl = "/release/$id.html"; $pgenre = $$rec2[$i][4]; $pgenre = qq|$pgenre| if($pgenre ne '' && $vpg2_hasu{"$pgenre"} ne ''); $pgenre = qq|[$pgenre]| if($pgenre ne ''); $rec2_10_block .= qq|

|. qq|$pdate $pgenre
|. qq|$ptitle|. qq|

|; } #詳細モードなら5件表示 if($in{'p'} == 1) { $m = $#$rec2 < 4 ? $#$rec2 : 4;#リリースが5件以下ならその数、5件以上なら5件 #一覧モードなら全件表示 } else { $m = $#$rec2; } for($i = 0; $i <= $m; $i ++) { $id = $$rec2[$i][0]; # リリースID $ptitle = $$rec2[$i][2]; # タイトル $ptitle =~ s/\x0d\x0a|\x0d|\x0a/
\n/g; $ptitle =~ s/([a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+)/$1<\/a>/g; $ptitle = &stdio::setLink(\$ptitle, 'target="_blank"'); $pdate = $$rec2[$i][5]; # 時刻 $pdate =~ s/^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):\d\d$/$1年$2月$3日/; # $durl = "$script?m=d&i=$id"; $durl = "/release/$id.html"; $pgenre = $$rec2[$i][4]; $pgenre = qq|$pgenre| if($pgenre ne '' && $vpg2_hasu{"$pgenre"} ne ''); $pgenre = qq|[$pgenre]| if($pgenre ne ''); $rec2_5_block .= qq|

|. qq|$pdate $pgenre
|. qq|$ptitle|. qq|

|; } $sql = qq|select | . qq|vfr_news_url.rel_url | . qq|from vfr_news_url | . qq|where vfr_news_url.vfr_news_id = $in{'i'}|; $rec3 = $dbh->selectall_arrayref($sql); &error("データベースエラーが発生しました。__LINE__
$DBI::errstr
$sql
") if(!$rec3 && $dbg == 1); &error("サーバーエラー

ご迷惑おかけします。しばらく待ってから再度お試しください。") if(!$rec3 && $dbg == 0); foreach $r (@$rec3) { foreach $d (@$r) { $url = $d; $url_block .= qq|・ $url
|; } } $title = $$rec1[0][2]; # タイトル $title =~ s/\x0d\x0a|\x0d|\x0a/
\n/g; # $title =~ s/([a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+)/$1<\/a>/g; # $title = &stdio::setLink(\$title, 'target="_blank"'); $rtext = $$rec1[0][3]; # リード文 $rtext =~ s/\x0d\x0a|\x0d|\x0a/
\n/g; $rtext =~ s/([a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+)/
$1<\/a>/g; $rtext2 = $rtext;#メタテキスト用にタグを設置する前の要約を代入 $rtext = &stdio::setLink(\$rtext, 'target="_blank"'); $contents = $$rec1[0][6]; # 本文 $contents =~ s/\x0d\x0a|\x0d|\x0a/
\n/g; $contents =~ s/&/&/g; $contents =~ s/&/&/g; $contents =~ s/([a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+)/
$1<\/a>/g; $contents = &stdio::setLink(\$contents, 'target="_blank"'); $date = $$rec1[0][5]; # 時刻 $date =~ s/^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):\d\d$/$1年$2月$3日 $4時/; $genre = $$rec1[0][4]; # ジャンル $genre = qq|$genre| if($genre ne '' && $vpg2_hasu{"$genre"} ne ''); $vpgenre = $$rec1[0][13]; # バリュープレス表示用ジャンル1 $vpgenre2 = $$rec1[0][14]; # バリュープレス表示用ジャンル2 $vpgenre3 = $$rec1[0][15]; # バリュープレス表示用ジャンル3 $vpgenre = qq|$vpgenre| if($vpgenre ne '' && $vpg1_hasu{"$vpgenre"} ne ''); $genre = qq|$vpgenre/$genre| if($vpgenre ne ""); $genre = "[$genre]" if($genre ne ''); # $av = "$script?m=d&i=$in{'i'}&p=2"; $av = "/list/$in{'i'}.html"; $rid = $in{'i'}; $entid = $$rec1[0][1]; #企業id #■企業情報の類を出力 $sql = qq|select |. qq|ent.entname, ent.pr, ent.id, ent.fddate, ent.capital, ent.zip, ent.address, |.#12-17 qq|ent.building, ent.tel, ent.fax, ent.url |. qq|from ent |. qq|where ent.id = "$entid" | . qq|and ( ent.del != 1 ) | . qq|order by ent.uptime desc|; $ent = $dbh->selectall_arrayref($sql); &error("データベースエラーが発生しました。__LINE__
$DBI::errstr
$sql
") if(!$ent && $dbg == 1); &error("サーバーエラー

ご迷惑おかけします。しばらく待ってから再度お試しください。") if(!$ent && $dbg == 0); #■企業情報の類を出力 $sql = qq|select |. qq|cst.cstname |. qq|from cst |. qq|where cst.entid = "$entid" and cst.ftop = "1" | . qq|and ( cst.del != 1 ) | . qq|order by cst.uptime desc|; $cst = $dbh->selectall_arrayref($sql); &error("データベースエラーが発生しました。__LINE__
$DBI::errstr
$sql
") if(!$cst && $dbg == 1); &error("サーバーエラー

ご迷惑おかけします。しばらく待ってから再度お試しください。") if(!$cst && $dbg == 0); $cname = $$ent[0][0]; # 会社名 $pr = $$ent[0][1]; $pr =~ s/<br \/>/
/g; $pname = $$cst[0][0]; $pname = "-" if($pname eq ""); $fdate = $$ent[0][3]; $fdate =~ s/^(\d\d\d\d)-(\d\d)-(\d\d)$/$1年$2月$3日/; $fdate = "-" if($$ent[0][3] eq "1930-01-00" or $$ent[0][3] eq "0000-00-00" or $$ent[0][3] eq ""); #初期値になっていたら表示しない $corpus = $$ent[0][4]; $corpus = $corpus / 10000; $corpus = "-" if($$ent[0][4] eq "0" || $$ent[0][4] eq ""); #初期値になっていたら表示しない $zip = $$ent[0][5]; $zip = "-" if($zip eq ""); $address = $$ent[0][6] . $$ent[0][7]; $address = "-" if($address eq ""); $tel = $$ent[0][8]; $tel = "-" if($tel eq ""); $fax = $$ent[0][9]; $fax = "-" if($fax eq ""); $curl = $$ent[0][10]; $curl = "-" if($curl eq ""); $ent_inf = qq|
\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|
$cname
$pr
代表者:$pname
設立:$fdate
資本金:$corpus万円
〒$zip $address
代表TEL:$tel
代表FAX:$fax
URL:$curl
\n|. qq|

\n|; $rec2_right = qq|
\n|. qq| \n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq| \n|. qq|\n|. qq|\n|. qq|\n|. qq|
\n|. qq|$rec2_10_block\n|. qq|
\n|. qq|
\n|. qq|
\n|. qq|
全てのリリースを見る >>
\n|. qq|
\n|. qq|\n|. qq|
\n|; #画像フォルダからリリース添付ファイル名を取得する opendir(DIR, "$idir"); while($file = readdir(DIR)) { if($file =~ /^(\d+)(\.)(.*)$/i) { $img{$1} = $file; } } closedir(DIR); $img = ''; if($img{$rid} =~ /\.(png|jpg|jpeg|gif)$/) { # $img = "$idir/$img{$id}"; # 画像ファイル名 $img = qq|$idir/$img{$rid}|; ($type, $width, $height) = stdio::getImageSize($img); if($width >= $height) { $width = $width > 250 ? 250 : $width; } else { $width = $height > 250 ? int(250 * $width / $height) : $height; } $img = qq||; } else { $img = ""; } $id = $in{'i'}; if(exists $img{$id}) { $img = ''; if($img{$id} =~ /\.(png|jpg|jpeg|gif)$/) { $img = "$idir/$img{$id}"; # 画像ファイル名 ($type, $width, $height) = stdio::getImageSize($img); $width = $width > 486 ? 486 : $width; $iurl_block2 .= qq||; } $iurl = "$murl/$img{$id}"; $h = 0; $iurl_block1 .= qq|$iurl
|. qq|
|; $iurl_block = $iurl_block1.$iurl_block2; } #解約企業のリリースにアドセンスを表示する my $usr = cqs->vfruser("$entid"); #&cqs::out($$usr{"contract_end"}); if($$usr{"contract_end"} eq ""){ $ads_contents = <<"_TEXT_"; # メールの本文(ヒアドキュメントで変数に代入) [広告]

_TEXT_ } $ads_contents ="" if($in{'pdb'} eq "pdb"); # $ads_contents ="" ; #関連するプレスリリース $rel_genre = $$rec1[0][4]; # ジャンル $rel_vpgenre = $$rec1[0][13]; # バリュープレス表示用ジャンル1 $rel_vpgenre2 = $$rec1[0][14]; # バリュープレス表示用ジャンル2 $rel_vpgenre3 = $$rec1[0][15]; # バリュープレス表示用ジャンル3 $rel_vpgenre = "%%" if($rel_vpgenre eq ""); $rel_vpgenre2 = "%%" if($rel_vpgenre2 eq ""); $rel_vpgenre3 = "%%" if($rel_vpgenre3 eq ""); $rel_genre = "%%" if($rel_genre eq ""); #文字化け対策 $setc = "set names ujis"; $rc = $dbh->do($setc) || die $dbh->errstr; $sqls = qq|SELECT vfr_news.id, vfr_news.entid, vfr_news.news_title, vfr_news.read_text, vfr_news.genre, |.#0-4 qq|vfr_news.date_publish, vfr_news.contents, vfr_news.detail_descriptions, vfr_news.key_words, vfr_news.deliver_to, |.#5-9 qq|vfr_news.admid, vfr_news.uptime, vfr_news.del,ent.entname , vfr_news.vpgenre | .#10-14 qq|FROM vfr_news | . qq|LEFT JOIN ent ON vfr_news.entid = ent.id | . qq|WHERE vfr_news.date_publish <= '$tm' | . # qq|and vfr_news.genre LIKE "$rel_genre" | . qq|and vfr_news.vpgenre LIKE "$rel_vpgenre" | . # qq|and vfr_news.vpgenre2 LIKE "$rel_vpgenre2" | . # qq|and vfr_news.vpgenre3 LIKE "$rel_vpgenre3" | . qq|and ( vfr_news.del = 0 AND ent.del != 1 ) | . qq|$testdel | . #テストアカウントのデータは出力しない qq|ORDER BY vfr_news.date_publish DESC | . qq|LIMIT 7 |; $rec4 = $dbh->selectall_arrayref($sqls); &error("データベースエラーが発生しました。__LINE__
$DBI::errstr
$sql
") if(!$rec4 && dbg == 1); &error("サーバーエラー

ご迷惑おかけします。しばらく待ってから再度お試しください。") if(!$rec4 && $dbg == 0); # &cqs::out($sqls); for($i = 0; $i < $#$rec4; $i ++) { my $rel_id; my $rel_title; my $rel_rtext; my $rel_date; my $rel_cname; my $rel_genre; my $rel_vpgenre; my $rel_date; my $rel_durl; $rel_id = $$rec4[$i][0]; # リリースID $rel_title = $$rec4[$i][2]; # タイトル $rel_title =~ s/\x0d\x0a|\x0d|\x0a/
\n/g; $rel_title =~ s/([a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+)/$1<\/a>/g; # $title = &stdio::setLink(\$title, 'target="_blank"'); なぜかリリーストップページのタイトルにセットリンクがあるので、外す $rel_rtext = $$rec4[$i][3]; # 文章 $rel_rtext =~ s/\x0d\x0a|\x0d|\x0a/
\n/g; $rel_rtext =~ s/([a-zA-Z0-9_\.\-]+?@[A-Za-z0-9_\.\-]+)/
$1<\/a>/g; $rel_rtext = &stdio::setLink(\$rel_rtext, 'target="_blank"'); $rel_date = $$rec4[$i][5]; # 時刻 $rel_cname = $$rec4[$i][13]; # 会社名 $rel_genre = $$rec4[$i][4]; # ジャンル $rel_genre = qq|$rel_genre| if($rel_genre ne '' && $vpg2_hasu{"$rel_genre"} ne ''); $rel_vpgenre = $$rec4[$i][14]; # バリュープレス表示用ジャンル $rel_vpgenre = qq|$rel_vpgenre| if($rel_vpgenre ne '' && $vpg1_hasu{"$rel_vpgenre"} ne ''); $rel_genre = qq|$rel_vpgenre/$rel_genre| if($rel_vpgenre ne ""); $rel_genre = "[$rel_genre]" if($rel_genre ne ''); $rel_date =~ s/^(\d\d\d\d)-(\d\d)-(\d\d) (\d\d):(\d\d):\d\d$/$1年$2月$3日/; $rel_durl = "/release/$rel_id.html"; $rec4_block .= qq|\n|. qq|\n|. qq|\n|. qq|\n|. qq|
\n|. qq|$rel_date $rel_cname $rel_genre
\n|. qq|$rel_title

\n|. qq|
\n|; } # &cqs::out($rec4_block); } $page_title = "$title | $cname | ".$page_title; $meta_keywords = "$cname,".$meta_keywords; $meta_description = "$cnameのプレスリリース。$rtext2"; $page_lead_h1 = "$cnameのプレスリリース"; if(length $cname < 55){ $page_lead = "|プレスリリース配信なら「VFリリース」" ; }else{ $page_lead = ""; } $page_footer_text ="$page_footer_text"; $uv_block = &cqs::vfr_uv(); $vfr_info = &cqs::vfr_front_info(4); $vfr_ranking = &cqs::vfr_front_ranking(5); $html = &tmpl_set($html ,$tdir , front_header); $html = &tmpl_set($html ,$tdir , front_left); $html = &tmpl_set($html ,$tdir , front_detail); $html = &tmpl_set($html ,$tdir , front_right); $html = &tmpl_set($html ,$tdir , front_footer); $dbh->disconnect; &cqs::out($html); }elsif($in{'p'} eq '2'){ &ModeDetail(); $iurl_block =""; $url_block =""; $page_title = "$cnameのプレスリリース | ".$page_title; $meta_keywords = "$cname,".$meta_keywords; $meta_description = "$cname"; $page_lead_h1 = "$cnameのプレスリリース"; if(length $cname < 55){ $page_lead = "|プレスリリース配信なら「VFリリース」" ; }else{ $page_lead = ""; } $page_footer_text ="$page_footer_text"; # &cqs::out($rec2_5_block); $uv_block = &cqs::vfr_uv(); $vfr_info = &cqs::vfr_front_info(4); $vfr_ranking = &cqs::vfr_front_ranking(5); $html = &tmpl_set($html ,$tdir , front_header); $html = &tmpl_set($html ,$tdir , front_left); $html = &tmpl_set($html ,$tdir , front_list); $html = &tmpl_set($html ,$tdir , front_right); $html = &tmpl_set($html ,$tdir , front_footer); $dbh->disconnect; #&ip_cheack; &cqs::out($html); } } #############################################サブルーチン##########################################' sub ip_cheack { $tm_s = stdio::getTime("%yyyy-%mm-%dd %hh:%nn:%ss", 3600 * 9); $tm_m = stdio::getTime("%yyyy-%mm-%dd %hh:%nn", 3600 * 9); $file = "access_ip_list.txt"; if($tm_m eq ""){ $count = $count + 1; } #もし一分間に同一IPから5回以上のアクセスがあれば、.htaccessに制限文を記入 if($count >= 5){ $ng_ip = "#".$tm." 分間に$countのアクセス\n"; $ng_ip .= "Deny from ".$ENV{'REMOTE_ADDR'}."\n"; &html_out($ng_ip,"/home/release/public_html",".htaccess2"); #4回以下の場合は、テキストファイルにログを残しておく }else{ $access_ip .= $ENV{'REMOTE_ADDR'}."\t$tm_m"; &html_out($access_ip,"/home/release/public_html","$file"); } } #■HTMLファイル出力 sub html_out { my $html = shift;#htmlファイル内容 my $html_dir = shift;#htmlファイル保管場所 my $html_name = shift;#htmlファイル名 # &cqs::out("$html_dir/$html_name"); use Jcode; &Jcode::convert(\$html, 'euc'); #ファイルの先頭に書き込むために、一度ファイルを読み込み $ret = open(IN, "$html_dir/$html_name"); &error("list_import.html ファイルの読込みに失敗しました。") if(!$ret); while($line = ) { chomp $line; &jcode::convert(\$line, 'euc'); $line =~ s/__(.*?)__/${$1}/g; $html2 .= "$line\n" } close(IN); open OUTFILE, ">", "$html_dir/$html_name" or die "file open error: $!"; if($html ne ""){ $html = $html2."\n".$html; }else{ $html = $html2; } print OUTFILE "$html"; close OUTFILE; return true; } sub error { $mes = shift; $html = ''; &out("システムエラー") if(!open(IN, "$tdir/error.html")); while($line = ) { chomp $line; &jcode::convert(\$line, 'euc', 'sjis'); $line =~ s/__(.*?)__/${$1}/g; $html .= "$line\n"; } close(IN); &out($html); } sub out { my $html = shift; print "Content-type: text/html\n\n"; &jcode::convert(\$html, 'sjis', 'euc'); print $html; exit; } #メール送信 sub SendMail { my $sendmail = '/usr/lib/sendmail'; # sendmailコマンドパス my ( $from, $to, $cc, $subject, $msg ) = @_; &jcode::convert(\$subject,'sjis', 'euc'); &jcode::convert(\$msg,'sjis', 'euc'); $subject = jcode($subject)->mime_encode; # sendmail コマンド起動 open(SDML,"| $sendmail -t -i") || &error("送信失敗"); # メールヘッダ出力 print SDML "From: $from\n"; print SDML "To: $to\n"; print SDML "Cc: $cc\n"; my $base64table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; # 変換処理 $subject =~ s/(\e\$[\@B].*?\e\([BJ])/ '=?ISO-2022-JP?B?' . &base64encode($1) . '?=' /eg; print SDML "Subject: $subject\n"; print SDML "Content-Transfer-Encoding: 7bit\n"; print SDML "Content-Type: text/plain;\n\n"; # print SDML "Content-type: text/plain;charset=\"ISO-2022-JP\"\n\n"; # メール本文出力 print SDML "$msg"; # sendmail コマンド閉じる close(SDML); } sub base64encode { my $str = shift; my $table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; my $ret; # 2 : 0000_0000 1111_1100 # 4 : 0000_0011 1111_0000 # 6 : 0000_1111 1100_0000 my ($i, $j, $x, $y); for($i=$x=0, $j=2; $i>$j) & 0x3f, 1); if ($j != 6) { $j+=2; next; } # j==6 $ret .= substr($table, $x & 0x3f, 1); $j = 2; } if ($j != 2) { $ret .= substr($table, ($x<<(8-$j)) & 0x3f, 1); } if ($j == 4) { $ret .= '=='; } elsif ($j == 6) { $ret .= '='; } return $ret; }