\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 = <<
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);
}
}
}
?>