#!/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|| $cname | \n|.
qq|
\n|.
qq|\n|.
qq|| $pr | \n|.
qq|
\n|.
qq|\n|.
qq|| 代表者:$pname | \n|.
qq|
\n|.
qq|\n|.
qq|| 設立:$fdate | \n|.
qq|
\n|.
qq|\n|.
qq|| 資本金:$corpus万円 | \n|.
qq|
\n|.
qq|\n|.
qq|| 〒$zip $address | \n|.
qq|
\n|.
qq|\n|.
qq|| 代表TEL:$tel | \n|.
qq|
\n|.
qq|\n|.
qq|| 代表FAX:$fax | \n|.
qq|
\n|.
qq|\n|.
qq|| URL:$curl | \n|.
qq|
\n|.
qq|
\n|.
qq|
\n|;
$rec2_right =
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|.
qq|\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|$rel_date $rel_cname $rel_genre \n|.
qq|$rel_title
\n|.
qq| | \n|.
qq|
\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;
}