# mlrcv.pl 最終更新 2009/04/16 #┌───────────────────────────────── #│ 携帯対応YY-BOARD(改) #│ mlrcv.pl 通常版・マルチ掲示板対応版共用 #│ さくらサーバー対応版 #│ for yyregi.cgi / yyadmin.cgi #└───────────────────────────────── #------------------------------------------------- # メール投稿されたファイル処理 #------------------------------------------------- # Web Liberty の Web Receiver を改造したものです。 # 作者の許可を得て、改造品を再配布するものです。 # Web Liberty # http://www.web-liberty.net/ # Web Receiver # http://www.web-liberty.net/download/receiver/index.html sub mlrcv { local ($str) = $_[0]; if ($upload != 1 || ($upload == 1 && $iupload != 1)) { &error("無効な機能\の呼び出しです"); } if ($str ne 'admin') { # 携帯個体識別情報チェック if ($imode && $UtnOn >= 1) { &UtnCheck('','reg'); } # 携帯識別情報による統合アクセス制限 # FOMA/i-mode/SBM/EZweb/EM 投稿拒否 if (($imode == 8 || $imode == 3 || $imode =~ /^5/ || $imode == 4 || $imode == 9) && $ExtUtnOn >= 1) { &UtnCheck('ext','reg'); } # IDによるアクセス制限 &IDCheck(1,'reg'); } ### メイン処理 use Socket; binmode(STDOUT); local ($mails,$error_mails,@mails) = &get_mail(); local $reg_mails; if ($mails != 0) { ($mails,$error_mails,$reg_mails) = &save_mail(@mails); } if ($str eq 'admin') { return ($mails,$error_mails,$reg_mails); } # 管理モードからの呼び出し else { &rcv_msg(); } # 投稿者からの呼び出し } ### HTML出力 sub rcv_msg { # PC if (!$imode) { my $message; if ($mails || $error_mails || $reg_mails) { # if ($mails eq '') { $mails = 0; } # if ($reg_mails eq '') { $reg_mails = 0; } my $all_mails = $mails + $error_mails + $reg_mails; my ($a1,$a2,$a3); if ($upload == 1 && $iupload == 1 && $mails) { $a1 = "
添付ファイルを$mails件保存しました。"; } if ($mailReg == 1 && $reg_mails) { $a2 = "
メール投稿を$reg_mails件保存しました。"; } if ($error_mails) { $a3 = "
不適切なメールを$error_mails通削除しました。"; } $message = "メールを$all_mails通受信しました。$a1$a2$a3\n"; } else { $message = "新着メールはありません。\n"; } &header; if (!$uemini_flag) { &uemini_link; &ue_msg("#00a7ad","#FFFFFF","メール受信"); print "

\n"; } print <


$message


EOM if ($miruPass) { # 閲覧者限定時 print < EOM if ($room ne '') { print "$multi_form\n"; } print <

EOM if ($room ne '') { print "$multi_form\n"; } print <

$WRver
for 携帯対応YY-BOARD(改) EOM } else { print <再取得する
掲示板に戻る

$WRver
for 携帯対応YY-BOARD(改) EOM } print < EOM # 携帯 } else { # DoCoMo用formタグ my $utnform1 = "

"; my $utnform2 = ""; my $message; if ($mails || $error_mails || $reg_mails) { # if ($mails eq '') { $mails = 0; } # if ($reg_mails eq '') { $reg_mails = 0; } my $all_mails = $mails + $error_mails + $reg_mails; my ($a1,$a2,$a3); if ($upload == 1 && $iupload == 1 && $mails) { $a1 = "
添付ファイルを$mails件保存しました"; } if ($mailReg == 1 && $reg_mails) { $a2 = "
メール投稿を$reg_mails件保存しました"; } if ($error_mails) { $a3 = "
不適切なメールを$error_mails通削除しました"; } $message = "メールを$all_mails通受信しました$a1$a2$a3\n"; } else { $message = "新着メールはありません\n"; } &header; &uemini_ilink if (!$uemini_flag); print <
$message

EOM if ($miruPass) { # 閲覧者限定時 print < $utnform2 EOM if ($room ne '') { print "$multi_form\n"; } print <

$WRver
for 携帯対応YY-BOARD(改) EOM } else { print <再取得する
掲示板に戻る


$WRver
for 携帯対応YY-BOARD(改) EOM } print < EOM } exit; } ### 受信メール保存 sub save_mail { local(@mails) = @_; local($subj,$subj_no,$subj_id); my (@regmails,$no2); my $times2; # 投稿間隔判定用 foreach (@mails) { $subj = ''; local($mail_header, $mail_body) = split(/\r\n\r\n/, $_, 2); $mail_header =~ s/\r\n? //g; $mail_body =~ s/\r\n[\t ]+/ /g; # 題名の取得 $subj = &get_subject($mail_header); if ($subj eq '') { $subj = "無題"; } # URLデコード(保険) $subj =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("H2", $1)/eg; # [記事番号]メールID my $pic_reg; if ($subj =~ /^\[(\d+)\](.{10})$/) { $subj_no = $1; $subj_id = $2; $pic_reg = 1; } my $flag=0; my @new=(); open(DAT,"+< $logfile") || &error("Open Error: ログファイル"); eval "flock(DAT, 2);"; my $top = ; # メール投稿チェック if (!$pic_reg && $mailReg == 1) { close(DAT); my ($name,$icon,$color,$pwd,$comment,$tail,$w,$h,$chk); my $chk = 0; # 記事NO処理 my ($no,$ip,$tim) = split(/<>/, $top); if ($no2) { $no2++;} else { $no2 = $no + 1; } # メールアドレス取得 my $mail_ad = &get_addr($mail_header); if ($mail_ad eq '') { $error_mails++; $mails--; $no2--; next; } my $flag2 = 0; # 送信者限定なし if ($mRgentei) { $flag2 = 1; $name = "メール投稿"; } # 送信許可メールアドレスチェック my @mRmail = split(/\s+/, $mRmail); foreach my $a (0 .. $#mRmail) { if ($mail_ad ne '' && $mRmail[$a] eq $mail_ad) { # 各値取得 $name = (split(/\s+/, $mRname))[$a]; if ($iconMode) { $icon = (split(/\s+/, $mRicon))[$a]; if ($icon eq 'xx') { $icon = ''; } } $color = (split(/\s+/, $mRcolor))[$a]; if ($color eq 'xx') { $color = ''; } $pwd = (split(/\s+/, $mRpwd))[$a]; if ($pwd eq 'xx') { $pwd = ''; } if ($pwd ne '') { $pwd = &encrypt($pwd); } # 暗号化 $flag2 = 1; last; } } if ($flag2) { $mails--; $reg_mails++; } else { $mails--; $error_mails++; $no2--; next; } # 時間取得 &get_time; # 投稿間隔判定用 $times2 = $times; # 記事認証機能 if ($adChk == 1 || $mRadChk != 1) { $times =~ s/^1/9/; } $mail_header =~ s/\r\n/ /g; $mail_header =~ s/\t/ /g; $mail_body =~ s/(\r\n)*$//g; # 添付ファイル有りのメール if ($mRupload == 1 && ($mail_header =~ /Content-type:.*multipart\//i || $mail_header =~ /Content\-Transfer\-Encoding:.*base64/i)) { local $boundary = ''; if ($mail_header =~ /boundary\=\"([^"]+)\"/i) { $boundary = $1; } # 本文無しのメール if ($boundary eq '') { $mails--; $error_mails++; $no2--; next; # local $ext = &get_ext($mail_header); # if ($ext ne '') { # ($tail,$w,$h) = &save_file($no2,$mail_header,$mail_body,$ext,'1',$tail); # } else { $tail2 = ''; } # 本文有りのメール } else { local $ext = &get_ext($mail_body); local @body_parts = split(/\r*\n*--$boundary-?-?/, $mail_body); if ($ext ne '') { ($tail,$w,$h) = &save_file($no2,$mail_body,$body_parts[$#body_parts],$ext,'',''); } else { $tail = ''; } # 添付を許可しないファイルが添付された場合 if ($tail eq "FileNG" || !$tail) { $tail = ''; } # 添付ファイル画像自動表示許可 if ($mRpicok == 1) { $chk = 1; } # 本文解析 my $mail_text = ''; foreach my $body (split(/\r\n/, $body_parts[1])) { &jcode::convert(\$body, 'sjis', '', 'z'); $body =~ s/\r//g; $body =~ s/\n//g; # $body =~ s/\t//g; $body =~ s/&/&/g; $body =~ s//>/g; $body =~ s/"/"/g; $body =~ s/'/'/g; $body =~ s/\032|\0//g; if ($body =~ /Content-type:/i || $body =~ /charset=/i || $body =~ /Content-Transfer-Encoding:/i) { next; } $mail_text .= "$body\n"; } $mail_text =~ s/^\n+//; $mail_text =~ s/\n+$//; $mail_text =~ s/\n/
/g; $comment = $mail_text; } # 添付ファイル無しのメール } else { &jcode::convert(\$mail_body, 'sjis', '', 'z'); $mail_body =~ s/\r?\n/\r/g; $mail_body =~ s/^\r+//; $mail_body =~ s/\r+$//; $mail_body =~ s/\r/
/g; $comment = $mail_body; } # エスケープ $subj =~ s/&/&/g; $subj =~ s/"/"/g; $subj =~ s//>/g; $subj =~ s/'/'/g; $subj =~ s/\032|\r|\n|\0//g; $subj =~ s/\t//g; # URL自動リンク if ($autolink) { &auto_link($comment); } # 投稿ランキング 投稿数を本体ログへ保存 my ($pl2,$pl2,$pl3,$pl4,$pl5); if ($WriteCnt && -e $writecntfile && -r $writecntfile && -w $writecntfile && (($plusKo1 >= 1 && $plusKo1Kei == 3) || ($plusKo2 >= 1 && $plusKo2Kei == 3) || ($plusKo3 >= 1 && $plusKo3Kei == 3) || ($plusKo4 >= 1 && $plusKo4Kei == 3) || ($plusKo5 >= 1 && $plusKo5Kei == 3))) { my $tkct; my $tkflag; # ログを読み込み open(TK,"$writecntfile"); while () { my ($tnam,$tcount) = split(/<>/); if ($tnam eq $name) { $tkct = $tcount+1; $tkflag=1; last; } } close(TK); if (!$tkflag) { $tkct = 1; } if ($plusKo1 >= 1 && $plusKo1Kei == 3) { $pl1 = $tkct; } if ($plusKo2 >= 1 && $plusKo2Kei == 3) { $pl2 = $tkct; } if ($plusKo3 >= 1 && $plusKo3Kei == 3) { $pl3 = $tkct; } if ($plusKo4 >= 1 && $plusKo4Kei == 3) { $pl4 = $tkct; } if ($plusKo5 >= 1 && $plusKo5Kei == 3) { $pl5 = $tkct; } } unshift (@regmails, "$no2<><>$date<>$name<><>$subj<>$comment<><>メール投稿<:>メール投稿<:><>$pwd<>$color<>$icon<>$times<>$chk<>$tail<>$w<>$h<>$pl2<>$pl2<>$pl3<>$pl4<>$pl5<>\n"); # 投稿ランキング更新 if ($WriteCnt) { require "${libDir}write_count_up.pl"; &WriteCountUp($no2,$date,$name,$subj); } next; } # 携帯からのメール添付チェック $mail_header =~ s/\r\n/ /g; $mail_header =~ s/\t/ /g; $mail_body =~ s/(\r\n)*$//g; my ($line,$tail2,$w2,$h2); while ($line = ) { my ($no,$re,$dat,$nam,$eml,$sub,$com, $url,$hos,$pw,$col,$ico,$mytime,$chk,$tail,$w,$h, $plus1,$plus2,$plus3,$plus4,$plus5) = split(/<>/,$line); # ログ移行時の対策 $mytime = &time_check($mytime); $chk = &time_check($chk); $plus1 = &time_check($plus1); $plus4 = &time_check($plus4); my $utn = (split(/<:>/,$hos))[2]; # FOMAの個体識別情報を編集 # (機種が違ってもFOMAカードが同じだとIDが同じになるため) if (index($utn,"ser") >= 0 && index($utn,"icc") >= 0) { $utn = substr($utn,3,15) . substr($utn,-6,5); } # EZWebの最後の.ne.jpを削除 $utn =~ s/\.ne\.jp$//; # 個体識別情報またはクッキー情報がなければ作成 if (!$utn) { $utn = &HosUaEnc($no); } # メール読み込み用パスワードを作成 my $temp = $no . $utn; $temp = substr($temp,0,5) . substr($temp,-5); $temp = &HosUaEnc($temp); # 記事番号とメールIDが一致 if ($subj_no && ($no eq $subj_no) && $subj_id && ($temp eq $subj_id)) { # 添付ファイル有りのメール if ($mail_header =~ /Content-type:.*multipart\//i || $mail_header =~ /Content\-Transfer\-Encoding:.*base64/i) { local $boundary = ''; if ($mail_header =~ /boundary\=\"([^"]+)\"/i) { $boundary = $1; } # 本文無しのメール if ($boundary eq '') { local $ext = &get_ext($mail_header); if ($ext ne '') { ($tail2,$w2,$h2) = &save_file($no,$mail_header,$mail_body,$ext,'1',$tail); } else { $tail2 = ''; } # 本文有りのメール } else { local $ext = &get_ext($mail_body); local @body_parts = split(/\r*\n*--$boundary-?-?/, $mail_body); if ($ext ne '') { ($tail2,$w2,$h2) = &save_file($no,$mail_body,$body_parts[$#body_parts],$ext,'',$tail); } else { $tail2 = ''; } } # 添付ファイル無しのメール } else { last; } # 添付を許可しないファイルが添付された場合 if ($tail2 eq "FileNG" || !$tail2) { last; } # 取得データ代入 if ($tail2 ne "FileNG" && $tail2) { $tail = $tail2; } if ($w2) { $w = $w2; } if ($h2) { $h = $h2; } # 携帯からの投稿画像自動表示許可 if ($telpicok == 1) { $chk = 1; } push(@new,"$no<>$re<>$dat<>$nam<>$eml<>$sub<>$com<>$url<>$hos<>$pw<>$col<>$ico<>$mytime<>$chk<>$tail<>$w<>$h<>$plus1<>$plus2<>$plus3<>$plus4<>$plus5<>\n"); $flag=1; # 該当以外の記事 } else { push(@new,$line); } } if ($flag == 1) { unshift(@new,$top); seek(DAT, 0, 0); print DAT @new; truncate(DAT, tell(DAT)); } else { $mails--; $error_mails++; } close(DAT); } # メール投稿記事ログ保存 if (@regmails > 0) { my $i=0; my $stop=0; my @new=(); # 通常記事 my @top=(); # 管理メッセージ my @data=(); # 過去ログ移行記事 my %no=(); # 管理メッセージ・保存記事の親記事を定義 my @no2=(); # スレッド参照数ファイルから削除する番号 open(DAT,"+< $logfile") || &error("Open Error: ログファイル"); eval "flock(DAT, 2);"; my $top = ; while () { my ($tno,$tre,$tdat,$tnam,$teml,$tsub,$tcom, $turl,$thos,$tpw,$tcol,$tico,$tmytime, $tchk,$ttail,$tw,$th,$tpl1,$tpl2,$tpl3,$tpl4,$tpl5) = split(/<>/); # ログ移行時の対策 $tmytime = &time_check($tmytime); $tchk = &time_check($tchk); $tpl1 = &time_check($tpl1); $tpl4 = &time_check($tpl4); $i++; if ($i > $max-1 && $tre eq "") { $stop = 1; } # 管理メッセージ(親記事) if (!$stop && !$tre && $tmytime =~ /AD$|AD\@\@\@/) { $no{$tno} = 'ad'; push(@top,$_); } # 管理メッセージ(親記事)のレス記事 elsif (!$stop && $tre && $no{$tre} eq 'ad') { push(@top,$_); } elsif (!$stop) { push(@new,$_); } # 保存記事 elsif ($tmytime =~ /^7/) { # 管理メッセージ以外の親記事番号を保存記事に定義 if (!$tre && $no{$tno} ne 'ad') { $no{$tno} = 'keep'; } push(@new,$_); } # 保存記事(親記事)のレス記事 elsif ($tre && $no{$tre} eq 'keep') { push(@new,$_); } elsif ($stop && $pastkey) { # スレッド参照数ファイルから削除する番号(過去ログ移行記事) if (-e "$viewcntfile" && -r "$viewcntfile" && -w "$viewcntfile" && !$tre) { push(@no2,$tno); } # 疑似削除した記事の処理 || 管理人未認証の記事 if ($tmytime =~ /^0/ || $tmytime =~ /^9/) { # 添付ファイルがあれば削除 if (-e "$updir$tno$ttail") { unlink("$updir$tno$ttail"); } if (-e "${updir}s$tno.jpg") { unlink("${updir}s$tno.jpg"); } # 親記事の場合(メッセージを変更) if (!$tre) { push(@data,"$tno<><>$tdat<>削除<><>削除<>管理人によって削除されました。<><>$thos<>$tpw<>#000000<><>0<>0<><><><><><><><><>\n"); # レス記事の場合(削除) } else { next; } } else { if ($ImageDel) { # 添付ファイルがあれば削除 if (-e "$updir$tno$ttail") { unlink("$updir$tno$ttail"); } if (-e "${updir}s$tno.jpg") { unlink("${updir}s$tno.jpg"); } push(@data,"$tno<>$tre<>$tdat<>$tnam<>$teml<>$tsub<>$tcom<>$turl<>$thos<>$tpw<>$tcol<>$tico<>$tmytime<>0<><><><>$tpl1<>$tpl2<>$tpl3<>$tpl4<>$tpl5<>\n"); } else { push(@data,$_); } } } elsif ($stop && !$pastkey) { # スレッド参照数ファイルから削除する番号(規定数に達して削除記事) if (-e "$viewcntfile" && -r "$viewcntfile" && -w "$viewcntfile" && !$tre) { push(@no2,$tno); } # 添付ファイルがあれば削除 if (-e "$updir$tno$ttail") { unlink("$updir$tno$ttail"); } if (-e "${updir}s$tno.jpg") { unlink("${updir}s$tno.jpg"); } } } unshift(@new,@regmails); unshift(@new,@top) if (@top > 0); unshift(@new,"$no2<>vai.mail<>$times2<>\n"); # 過去ログ更新 if (@data > 0) { require "${libDir}pastlog.pl"; &pastlog(@data); } # 更新 seek(DAT, 0, 0); print DAT @new; truncate(DAT, tell(DAT)); close(DAT); # スレッド参照数ファイルから番号を削除 if (-e "$viewcntfile" && @no2 > 0) { require "${libDir}viewcnt_del.pl"; &viewcntDel(@no2); } # メール処理 if ($mailing >= 1) { foreach (@regmails) { my $mail_on = 1; if ($mailing == 1) { # 自分の投稿判断 foreach my $tt (split(/,/,$mailto)) { if ($tt eq $in{'email'}) { $mail_on = 0; last; } } if ($mail_on == 1 && $myRegName ne '') { foreach my $tt (split(/\s+/,$myRegName)) { if ($tt eq $in{'name'}) { $mail_on = 0; last; } } } if ($mail_on == 1 && $myRegMail ne '') { foreach my $tt (split(/\s+/,$myRegMail)) { if ($tt eq $in{'email'}) { $mail_on = 0; last; } } } } if ($mail_on == 1) { require "${libDir}mail_to.pl"; &mail_to('メール投稿','',split(/<>/)); } } } # WWWCチェックファイル出力 if ($wwwc_use == 1) { require "${libDir}wwwc.pl"; my ($date,$name,$sub,$comment) = (split(/<>/,$regmails[0]))[2,3,5,6]; if ($adChk == 1 || $mRadChk != 1) { &wwwc_out($date,"未認証","未認証","管理人の認証後掲示板でご覧ください"); } else { &wwwc_out($date,$name,$sub,$comment); } } # RSSチェックファイル出力 if ($rss_use == 1) { require "${libDir}rss.pl"; &rss1; } } return ($mails,$error_mails,$reg_mails); } ### メール受信 sub get_mail { local $socket_mesg = ''; local $mail_number = 0; local $error_mails = 0; use Socket; socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp')); # local $server_ip = gethostbyname($pop_server); # local $server_addr = pack('Sna4x8', AF_INET, $pop_port, $server_ip); local $server_addr = sockaddr_in($pop_port, inet_aton($pop_server)); connect(SOCK, $server_addr) || &error("POPサーバーに接続できません。"); recv(SOCK, $socket_mesg, 512, 0); $socket_mesg .= &sendrecv("USER $pop_user\n"); $socket_mesg .= &sendrecv("PASS $pop_pwd\n"); if ($socket_mesg =~ /\-ERR/) { &error("POPサーバーにログインできません。"); } $socket_mesg = &sendrecv("STAT\n"); if ($socket_mesg =~ /^\+OK\s+(\d+)\s+\d+/) { $mail_number = $1; } else { &error("メール数を取得できません。"); } #メールダウンロード local @mails = (); local $mail_size = 0; foreach $loop (1 .. $mail_number) { $socket_mesg = &sendrecv("LIST $loop\n"); if ($socket_mesg =~ /^\+OK\s+\d+\s+(\d+)/) { $mail_size = $1; } else { &error("メールサイズを取得できません。"); } if ($mail_size < ($maxdata * 1024)) { $socket_mesg = &sendrecv("RETR $loop\n"); local $read_mail = $socket_mesg; while () { if ($_ =~ /^\.\r?\n$/) { last; } $_ =~ s/^\.\.\n/.\n/; $read_mail .= $_; } push(@mails, $read_mail); } else { # 規定サイズを超える容量のメールはエラー(保存せず削除) $mail_number--; $error_mails++; } $socket_mesg = &sendrecv("DELE $loop\n"); if ($socket_mesg !~ /^\+OK/) { &error("メールを削除できません。"); } } $socket_mesg = &sendrecv("QUIT\n"); close(SOCK); return ($mail_number,$error_mails,@mails); } ### サーバー交信 sub sendrecv { local($send_data) = @_; local $recv_data = ''; if ($send_data ne '') { send(SOCK, $send_data, 0); } recv(SOCK, $recv_data, 512, 0); return $recv_data; } ### 送信元メールアドレス取得 sub get_addr { local($_) = @_; my $addr = ''; $_ = "\n" . $_; if ($_ =~ /\nFrom:[ \t]*([^\r\n]+)/) { $addr = $1; if ($addr =~ /([\w\-]+\@[\w\-\.]+)/) { $addr = $1; } } return $addr; } ### メール件名取得 sub get_subject { local($_) = @_; local $subj = ''; $_ = "\n" . $_; if ($_ =~ /\nSubject:[ \t]*([^\r\n]+)/) { $subj = $1; #件名デコード(参考:けもけもこみゅにけーしょんず ... http://www.kemokemo.com/) while(($tmp1, $tmp2, $tmp3) = $subj =~ /(.*)=\?[Ii][Ss][Oo]-2022-[Jj][Pp]\?B\?([^\?]+)\?=(.*)/) { $tmp3 =~ s/ //g; $subj = $tmp1 . &mime_dec_base64($tmp2) . $tmp3; } jcode::convert(\$subj, 'sjis', '', 'z'); $subj =~ s/^\s+//; $subj =~ s/\s+$//; } return $subj; } ### 添付ファイル拡張子取得 sub get_ext { local($_) = @_; local $filename = ''; local $ext = ''; if ($_ =~ /name=\"?([^\"\n]+)\"?/i) { $filename = $1; $filename =~ s/[\t\r\n]//g; while(($tmp1, $tmp2, $tmp3) = $filename =~ /(.*)=\?[Ii][Ss][Oo]-2022-[Jj][Pp]\?B\?([^\?]+)\?=(.*)/) { $tmp3 =~ s/ //g; $filename = $tmp1 . &mime_dec_base64($tmp2) . $tmp3; } jcode::convert(\$filename, 'sjis', '', 'z'); $filename =~ s/^\s+//; $filename =~ s/\s+$//; $filename =~ /([^\/\\]*)\.([^.\/\\]*)$/; $ext = $2; $ext =~ tr/A-Z/a-z/; } return $ext; } ### 添付ファイル保存 sub save_file { local ($no,$mail_info,$mail_data,$fname,$temp,$old_tail) = @_; local (@file) = (); local ($file) = ''; local ($flag,$tail,$macbin,$imgfile,$W,$H); # 画像処理 $macbin=0; if ($temp == 1) { if ($mail_info =~ /(.*)Content-type:(.*)/i) { $tail=$2; } # if ($mail_info =~ /(.*)filename=\"(.*)\"/i) { $fname=$2; } # $extを使用 if ($mail_info =~ /application\/x-macbinary/i) { $macbin=1; } } else { if ($mail_data =~ /(.*)Content-type:(.*)/i) { $tail=$2; } # if ($mail_data =~ /(.*)filename=\"(.*)\"/i) { $fname=$2; } # $extを使用 if ($mail_data =~ /application\/x-macbinary/i) { $macbin=1; } } # ファイル形式を確認 require "${libDir}lib_regad.pl"; ($tail,$flag) = &upfile_kakunin($tail,$fname); if ($flag == 1) { # 既にファイルがあれば削除 if ($old_tail) { if (-e "$updir$no$old_tail") { unlink("$updir$no$old_tail"); } if (-e "${updir}s$no.jpg") { unlink("${updir}s$no.jpg"); } } @file = split(/\r\n\r\n/, $mail_data); if ($mail_info =~ /Content\-Transfer\-Encoding:.*base64/i) { $file[$#file] = &mime_dec_base64($file[$#file]); } # マックバイナリ対策 # これできなくない? if ($macbin) { $length = substr($file[$#file],83,4); $length = unpack("%N",$length); $file[$#file] = substr($file[$#file],128,$length); } $imgfile = "$updir$no$tail"; open(FILE, ">$imgfile") || &error("添付ファイルが保存できません。"); binmode(FILE); print FILE $file[$#file]; close(FILE); chmod (0666, $imgfile); # 画像サイズ取得 if ($tail eq ".jpg") { ($W, $H) = &JpegSize($imgfile); } elsif ($tail eq ".gif") { ($W, $H) = &GifSize($imgfile); } elsif ($tail eq ".png") { ($W, $H) = &PngSize($imgfile); } # 画像表示縮小 if ($W > $MaxW || $H > $MaxH) { $W2 = $MaxW / $W; $H2 = $MaxH / $H; if ($W2 < $H2) { $key = $W2; } else { $key = $H2; } $W = int ($W * $key) || 1; $H = int ($H * $key) || 1; require './resize.pl' if(-e './resize.pl'); eval{ imgbbs::imgresize("$imgfile","${updir}s$no.jpg",$W,$H,75,1); }; } return ($tail,$W,$H); } else { return ('FileNG','',''); } } ### BASE64デコード sub mime_dec_base64 { local($_) = @_; $_ =~ tr/A-Za-z0-9+\///cd; $_ =~ tr/A-Za-z0-9+\//\x00-\x3f/; $_ = unpack('B*', $_); $_ =~ s/(..)(......)/$2/g; $_ =~ s/((........)*)(.*)/$1/; $_ = pack('B*', $_); return $_; } 1;