OpenPNEで携帯投稿を可能にする為のphpです。
作成するphpファイルは全部で4つ
chkmail.php
chkmail_ini.php
chkmailimg.php
cpmail.php
利用方法は[ OpenPNEで携帯電話から投稿できるようにする設置方法 ]を参照ください。
xrea・coreserverを利用の方は、以下のリンク先からパッケージがダウンロードできます。OpenPNE2.14.1.1でも利用できました。
http://www.itsup.net/a02/article.php?story=20061027113746347
他にも参考にさせて頂いたURLがあったのですが、作業をしていたのが2年ほど前になるので忘れてしまいました。
下記のソースは、xreaでも利用できるかもしれませんが、E-server用に利用したものですが、catch allが利用できる一般的なサーバーで利用できると思います。
「■■■■■」の部分は利用するOPENPNEまでのディレクトリ階層を書いてください。
「●●●●●」の部分は [ 6.ドメインのメールアドレスをcatch all に対応させる ] で作成した、メールアドレスの情報を入力してください。
保存と編集ができたら、ファイルをopenpne/bin/の中にアップロードします。
パーミッションは4つのファイル共に755に設定してください。
▼chkmail.phpとして保存してください。
shift-jis LFで保存してください。
// 標準入力からメールデータの読み込み
//$stdin = fopen('php://stdin', 'rb');
//$raw_mail = '';
//do {
// $data = fread($stdin, 8192);
// if(strlen($data) == 0) {
// break;
// }
// $raw_mail .= $data;
//} while(true);
//fclose($stdin);
require "chkmail_ini.php";//@@@@@ADD
// コマンドー送信!!
function _sendcmd($sock,$cmd) {
fputs($sock, $cmd."rn");
$buf = fgets($sock, 512);
if(substr($buf, 0, 3) == '+OK') {
return $buf;
} else {
die("$cmd => $buf");
}
return false;
}
$sock = fsockopen($_MS_host, 110, $err, $errno, 10) or die("サーバーに接続できません");
$buf = fgets($sock, 512);
if(substr($buf, 0, 3) != '+OK') die($buf);
$buf = _sendcmd($sock, "USER $_MS_user");
$buf = _sendcmd($sock, "PASS $_MS_pass");
$data = _sendcmd($sock, "STAT");//STAT -件数とサイズ取得 +OK 8 1234
sscanf($data, '+OK %d %d', $num, $size);
$raw_mail = '';
//メールがない時
if ($num == "0") {
$buf = _sendcmd($sock, "QUIT"); //バイバイ
fclose($sock);
echo "ないとき";
exit;
// メールがある時
}else{
echo "あるとき";
$mail_array=array();
// ----- $num件のメールを読み込んだ後削除する
for($i=1;$i<=$num;$i++) {
$raw_mail = '';//1通分のデータを初期化
$line = _sendcmd($sock, "RETR $i");//RETR n -n番目取得(ヘッダ含)
while (!ereg("^.rn",$line)) {//EOFの.まで読む
$line = fgets($sock,512);
$raw_mail.= $line;
}
$mail_array[]=$raw_mail;//1通分読み込んだら配列に追加
$data = _sendcmd($sock, "DELE $i");//DELE n n番目削除
}
$buf = _sendcmd($sock, "QUIT"); //バイバイ
fclose($sock);
}//end メールがある時の処理
//@@@@@<-----------------------------------
// メールの処理 1通ずつ処理する
foreach($mail_array as $a_mail){
m_process_mail($a_mail);
}
//@@@@@ デバッグ用ログ保存以下は 安定版 2.4.2 と同じ内容になっています。
//@@@@@ 違うバージョンで使用する場合は mail.phpより適切な内容を
//@@@@@ コピーしてください。
// デバッグ用ログ保存
m_debug_log(ob_get_contents(), PEAR_LOG_DEBUG);
while (@ob_end_clean());
/**
* メール処理
*/
function m_process_mail($raw_mail)
{
$options['from_encoding'] = MAIL_FROM_ENCODING;
$options['to_encoding'] = 'UTF-8';
$options['img_tmp_dir'] = OPENPNE_VAR_DIR . '/tmp';
$options['img_max_filesize'] = IMAGE_MAX_FILESIZE * 1024;
$options['trim_doublebyte_space'] = OPENPNE_TRIM_DOUBLEBYTE_SPACE;
$decoder =& new OpenPNE_KtaiMail($options);
$decoder->decode($raw_mail);
$from = $decoder->get_from();
$to = $decoder->get_to();
if (!db_common_is_mailaddress($from) || !db_common_is_mailaddress($to)) {
m_debug_log('mail.php::m_process_mail() ERROR code 3');
return false;
}
list($to_user, $to_host) = explode("@", $to, 2);
// check prefix
if (MAIL_ADDRESS_PREFIX) {
if (strpos($to_user, MAIL_ADDRESS_PREFIX) !== 0) {
m_debug_log('mail.php::m_process_mail() missing prefix');
return false;
}
$to_user = substr($to_user, strlen(MAIL_ADDRESS_PREFIX));
}
if ($to_host === MAIL_SERVER_DOMAIN) {
$mail_sns =& new mail_sns($decoder);
if (!$mail_sns->main()) {
m_debug_log('mail.php::m_process_mail() ERROR code 1');
return false;
}
} else {
m_debug_log('mail.php::m_process_mail() ERROR code 2');
return false;
}
return true;
}
/**
* デバッグ用ログ保存
*/
function m_debug_log($msg, $priority = PEAR_LOG_WARNING)
{
if (!MAIL_DEBUG_LOG) return;
$log_path = OPENPNE_VAR_DIR . '/log/mail.log';
$file =& Log::singleton('file', $log_path, 'MAIL');
mb_convert_encoding($msg, 'JIS', 'auto');
$file->log($msg, $priority);
}
?>
▼chkmail_ini.phpで保存してください。shift-jis LFで保存してください。
▼chkmailimg.phpshift-jis LFで保存してください。
▼cpmail.phpshift-jis LFで保存してください。
$buf");
}
return false;
}
$sock = fsockopen($_MS_host, 110, $err, $errno, 10) or die("サーバーに接続できません");
$buf = fgets($sock, 512);
if(substr($buf, 0, 3) != '+OK') die($buf);
$buf = _sendcmd($sock, "USER $_MS_user");
$buf = _sendcmd($sock, "PASS $_MS_pass");
$data = _sendcmd($sock, "STAT");//STAT -件数とサイズ取得
sscanf($data, '+OK %d %d', $num, $size);
$raw_mail = '';
//メールがない時
if ($num == "0") {
$buf = _sendcmd($sock, "QUIT");
fclose($sock);
echo "ないとき
";
exit;
// メールがある時
}else{
echo "ある
";
$mail_array=array();
// ----- $num件のメールread後削除
for($i=1;$i<=$num;$i++) {
$raw_mail = '';//初期化
$line = _sendcmd($sock, "RETR $i");//RETR n -n番目取得
while (!ereg("^.rn",$line)) {//EOFの.までread
$line = fgets($sock,512);
$raw_mail.= $line;
}
$mail_array[]=$raw_mail;//配列に追加
$data = _sendcmd($sock, "DELE $i");//DELE n n番目削除
}
$buf = _sendcmd($sock, "QUIT");
fclose($sock);
}//end メール時処理
// 1通ずつ処理
foreach($mail_array as $a_mail){
m_process_mail($a_mail);
}
m_debug_log(ob_get_contents(), PEAR_LOG_DEBUG);
while (@ob_end_clean());
//メール処理
function m_process_mail($raw_mail)
{
$options['from_encoding'] = MAIL_FROM_ENCODING;
$options['to_encoding'] = 'UTF-8';
$options['img_tmp_dir'] = OPENPNE_VAR_DIR . '/tmp';
$options['img_max_filesize'] = IMAGE_MAX_FILESIZE * 1024;
$options['trim_doublebyte_space'] = OPENPNE_TRIM_DOUBLEBYTE_SPACE;
$decoder =& new OpenPNE_KtaiMail($options);
$decoder->decode($raw_mail);
$from = $decoder->get_from();
$to = $decoder->get_to();
if (!db_common_is_mailaddress($from) || !db_common_is_mailaddress($to)) {
m_debug_log('mail.php::m_process_mail() ERROR code 3');
return false;
}
list($to_user, $to_host) = explode("@", $to, 2);
// check prefix
if (MAIL_ADDRESS_PREFIX) {
if (strpos($to_user, MAIL_ADDRESS_PREFIX) !== 0) {
m_debug_log('mail.php::m_process_mail() missing prefix');
return false;
}
$to_user = substr($to_user, strlen(MAIL_ADDRESS_PREFIX));
}
if ($to_host === MAIL_SERVER_DOMAIN) {
$mail_sns =& new mail_sns($decoder);
if (!$mail_sns->main()) {
m_debug_log('mail.php::m_process_mail() ERROR code 1');
return false;
}
} else {
m_debug_log('mail.php::m_process_mail() ERROR code 2');
return false;
}
return true;
}
//デバッグ用ログ保存
function m_debug_log($msg, $priority = PEAR_LOG_WARNING)
{
if (!MAIL_DEBUG_LOG) return;
$log_path = OPENPNE_VAR_DIR . '/log/mail.log';
$file =& Log::singleton('file', $log_path, 'MAIL');
mb_convert_encoding($msg, 'JIS', 'auto');
$file->log($msg, $priority);
}
?>


