\x08_PAGE_\x08\n"); ///////////////////////////////////////////////// // 動作ステート define('CONTRIBUTE_STATE_NORMAL' , 0); define('CONTRIBUTE_STATE_AUTOGET', 1); ///////////////////////////////////////////////// // POPメール受信クラスの定義値 // POP3ポート define('CONTRIBUTE_MAILPORT','110'); // タイムアウト define('CONTRIBUTE_MAILTMOUT','30'); // 受信最大サイズ(default=102400 100kbyte) define('CONTRIBUTE_MAXSIZE','102400'); // 受信最大サイズを超えたときの受信行数 define('CONTRIBUTE_RCVLINE','500'); ///////////////////////////////////////////////// // 受信したメールを消去する 1:消去 0:サーバに残す define('CONTRIBUTE_MAIL_DELETE','0'); // APOPによる認証 0:使用しない 1:使用する define('CONTRIBUTE_USE_APOP','0'); ///////////////////////////////////////////////// // last UID file define('CONTRIBUTE_FILE_UID',CACHE_DIR.'contribute_uid.dat'); ///////////////////////////////////////////////// function plugin_contribute_action() { global $script,$vars,$post,$adminpass; global $contribute_invalid; $pass = array_key_exists('pass' ,$post) ? $post['pass'] : NULL; $toppage = array_key_exists('toppage',$post) ? $post['toppage'] : NULL; $post['page'] = $vars['page'] = $vars['refer']; // パスワード確認 if(md5($pass) == $adminpass) { // メールをチェックして取り込む $retval = plugin_contribute_getpage(CONTRIBUTE_STATE_NORMAL,$toppage); $title = $retval['title']; $body = $retval['body']; } else { $title = ($pass === NULL) ? '' : "

$contribute_invalid

\n"; $body = "

$title

"; } $retvars['msg'] = $title; $retvars['body'] = $body; return $retvars; } function plugin_contribute_convert() { global $script,$vars; global $contribute_msg,$contribute_button; $toppage = ''; if(func_num_args()) { $args = func_get_args(); $toppage = array_shift($args); } $page = htmlspecialchars($vars['page']); $string = <<

$contribute_msg

EOD; return $string; } // メールを受信してページを書き込む処理 function plugin_contribute_getpage($actmode, $toppage) { global $vars,$_title_edit,$now; global $contribute_pop_err,$contribute_none; global $contribute_ignore_list; $title = ''; $body = ''; // パスワード一致 // POP接続開始 $pop = new popmail_pop3_protocol(); if($pop->connect(CONTRIBUTE_MAILSERVER, CONTRIBUTE_MAILPORT,CONTRIBUTE_MAILTMOUT, CONTRIBUTE_MAILUSER,CONTRIBUTE_MAILPASS,CONTRIBUTE_USE_APOP) == FALSE) { die($contribute_pop_err); } if(CONTRIBUTE_MAIL_DELETE!='1') { // メールを残す設定 $last_uid = $pop->get_lastuid(CONTRIBUTE_FILE_UID); // 新着メールの確認 $newnum = $pop->check_newmail($last_uid); } else { $newnum = 1; } $rcv_counter = 0; // 処理メール件数 if($newnum>0 && $pop->get_mailnum()>0) { while($newnum <= $pop->get_mailnum()) { // 1件のメッセージのみ取得する $maildata = $pop->get_mail($newnum,0,0); // メールの解析開始 $mail = new popmail_parse(); $result = $mail->analyze($maildata); $ignore_flg = FALSE; // 投稿禁止リストを検索 foreach($contribute_ignore_list as $pattern) { if(preg_match("/$pattern/",$mail->from())==TRUE) { $ignore_flg = TRUE; break; } } // 投稿許可パターン $pattern = CONTRIBUTE_AUTO_ENABLE_PATTERN; if($ignore_flg == TRUE || preg_match("/$pattern/",$mail->from())==FALSE) { // 残念ながら無視されることになりました。 $newnum++; continue; } //////////////////////////////////////////////// // 登録するページ名を決定する // メールページの登録フォーマット: // '[引数で指定されたページ名]/[Subject]' // $subject = trim($mail->subject()); // 無効な文字は'_'に置換する。 $subject = preg_replace('/[\r\n\t\f\[\]<>#&:"]/','_',$subject); if($toppage!='') { $toppage .= "/"; } $wpage = "$toppage$subject"; //////////////////////////////////////////////// // 本文取得 if(CONTRIBUTE_PAGE_OVERWRITE==TRUE) { // 上書きする場合ページを読まない $postdata = ''; } else { $postdata = join('',get_source($wpage)); if($postdata!='') { // 追記する $postdata .= "\n"; } } // Content-Typeが"text/plain"のものを探す $str = ''; $img_attach = ''; $other_attach = ''; $unknown_count = 0; $body_flag = 0; foreach( $result as $key => $value ) { if( $body_flag!=0 || $value["Content-Type"]!="text/plain" ) { if($value["Body"]!='') { // ファイル名の取得 $filename = $value["Filename"]; if( $filename=='' ) { // ファイル名が不明な場合、適当なファイル名をつける $unknown_count++; $filename = "unknown$unknown_count.dat"; //echo $value["Content-Type"]; } if( preg_match("/^image\//i",$value["Content-Type"]) == True ) { // 画像リンク $img_attach .= "&ref(./$filename);\n"; } else { // 画像以外の添付ファイル $other_attach .= "-&ref(./$filename);\n"; } $basename = UPLOAD_DIR.encode($wpage).'_'.encode($filename); // 添付ファイルの保存 $fp = fopen($basename,'wb') or die_message('cannot write '.$basename); set_file_buffer($fp, 0); flock($fp,LOCK_EX); rewind($fp); fwrite($fp,$value["Body"]); flock($fp,LOCK_UN); fclose($fp); } } else { // テキスト $str .= $value["Body"]."\n"; $body_flag = 1; // 最初のtextを本文とみなす } } $str = str_replace("\r","",$str); // 文末のドットを取る $str = str_replace("\n.\n","",$str); // 先頭ドットの回復を取る $str = str_replace("\n..","\n.",$str); // 本文を "auto"→SOURCE_ENCODINGへ変換する $str = mb_convert_encoding($str, SOURCE_ENCODING, "auto"); // 本文を確定する $postdata .= "$str\n"; if( $img_attach!='' ) { $postdata .= "$img_attach"; } if( $other_attach!='' ) { $postdata .= "$other_attach"; } if(CONTRIBUTE_MAIL_DELETE=='1') { // 全てが終了してからメールを消去する $pop->delete_mail($newnum); } else { // 最後に受信したメールのUIDを保存しておく $pop->set_lastuid(CONTRIBUTE_FILE_UID); } $newnum++; $rcv_counter++; // 取ったメールの扱いを決める if($actmode==CONTRIBUTE_STATE_AUTOGET) { // 自動更新 page_write($wpage,$postdata); // ログファイルへの記録 $log = CONTRIBUTE_AUTO_LOGFORMAT; $log = str_replace("\x08_NOW_\x08" ,$now ,$log); $log = str_replace("\x08_ADR_\x08" ,$mail->from(),$log); $log = str_replace("\x08_PAGE_\x08",$wpage ,$log); $logdata = array(); // ログファイル $file = CONTRIBUTE_AUTO_LOGFILE; if(file_exists($file)==TRUE) { // 既にログファイルがある場合 $logdata = str_replace("\r", '', file($file)); } // 配列に加える $logdata = array_merge(array($log),$logdata); $logdata = array_slice($logdata, 0, CONTRIBUTE_AUTO_LOGAGE); $logdata = join('',$logdata); $fp = fopen($file, 'wb'); if($fp==FALSE) { die_message('contribute.inc.php:cannot open '.$file); } set_file_buffer($fp, 0); flock($fp,LOCK_EX); rewind($fp); fwrite($fp,$logdata,strlen($logdata)); flock($fp,LOCK_UN); fclose($fp); } else { // 編集フォームにする $post['page'] = $vars['page'] = $wpage; // タイトルの"$1"を置換 $title = str_replace('$1',$wpage,$_title_edit); // 編集画面へ $body = edit_form($wpage,$postdata); break; } } // 取得完了 } if($rcv_counter==0) { // メールがありませんでした $title = $contribute_none; $body = "

$title

"; } // POP接続の切断 $pop->disconnect(); return array('title'=>$title, 'body'=>$body); } // メール投稿チェック function plugin_contribute_check() { // 自動更新が有効な場合、一定間隔でメールの投稿をチェックする if(CONTRIBUTE_AUTO_INTERVAL > 0) { $file = CONTRIBUTE_AUTO_LOGFILE; if(file_exists($file)==TRUE) { // ログファイルの更新時刻が最後に取った時刻とする $progress = time() - filemtime($file); if($progress > (CONTRIBUTE_AUTO_INTERVAL * 60)) { // ファイルの最終更新日をセット touch($file); // あなたはジョーカーを引いてしまいました・・・ // これから投稿チェックを行います。 plugin_contribute_getpage(CONTRIBUTE_STATE_AUTOGET,''); } } else { // 初回起動 $fp = fopen($file, 'wb'); if($fp==FALSE) { die_message('contribute.inc.php:cannot create '.$file); } fclose($fp); } } } ?>