OpenPNE携帯投稿用PHP

2009年10月02日 

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.php
shift-jis LFで保存してください。

▼cpmail.php
shift-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);
}

?>

 

 RSSリーダーで購読

ブログについて

あわせて読みたいブログパーツ