设为首页收藏本站

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 360|回复: 5

Using PHP to read email in a POP3 mailbox (0)

[复制链接]
发表于 2015-6-11 01:03:18 | 显示全部楼层 |阅读模式
This code opens a pop3 mailbox and reads in the messages stored there one at a time. Each messages is taken and the subject line and body are built and passed to a create_incident function which would process it according to the needs of your application (you get to write this part!).

Each message is read and checked for some kind of validity (I checked the subject line for certain items) and if its spam, it flagged for deletion. Regular allowable messages are then separated into a subject and a full body line (handles base64 encoded messages as well). Once the message was processed, its flagged for deletion, which happens when the server closes the connection to the mailbox.

The intent of this code was not to emulate a mail system, its design goal was to read emails, and produce database records based on that email's data. It does not make full use of the POP3 functionaility, but then it didn't need to.



 楼主| 发表于 2015-6-11 10:32:45 | 显示全部楼层

RE: Using PHP to read email in a POP3 mailbox (1-1)

<?php

require("email_functions.php");

global $timeout, $error, $buffer;

// Date in the past
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");

// always modified
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");

// HTTP/1.1
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);

// HTTP/1.0
header("Pragma: no-cache");

ob_start();

//-----------------------------------------------------------------------------
//                 Declarations
//-----------------------------------------------------------------------------

$error            = "";                                                        //    Error string.

$timeout          = 90;                                                        //    Default timeout before giving
up on a network operation.

$Count            = -1;                                                        //    Mailbox msg count

$buffer           = 512;                                                       //    Socket buffer for socket
fgets() calls, max per RFC 1939 the returned line a POP3
                                                                            //    server can send is 512 bytes.

$server               = "mail.yourdomain.com";                //    Set this to hard code
the server name

$RFC1939          = true;                                                    //    Set by noop(). See
rfc1939.txt

$msg_list_array = array();                                                  //    List of messages from server

$login                 = 'email_login';
$pass                  = 'email_password';
$KeyUserID            = 'me';                                                      //        for the db record to id the program
as the user

//-----------------------------------------------------------------------------
//                 Control Code
//-----------------------------------------------------------------------------
   //echo "<h2>Starting Program</h2><br>";
        set_time_limit($timeout);

        $fp = connect ($server, $port = 110);

    $Count = login($login,$pass, $fp);

    if( (!$Count) or ($Count == -1) )
    {
        do_log("TIRS", "Check for new messages",'', "No Messages");
        exit;
    }// end if

    // ONLY USE THIS IF YOUR PHP VERSION SUPPORTS IT!
    // register_shutdown_function(quit());

    if ($Count < 1)
    {
        die();
    } else {
        //echo "Login OK: Inbox contains [$Count] messages<BR>\n";
        do_log("TIRS", "Check for new messages",'', "$Count Messages");
        $msg_list_array = uidl("", $fp);
        set_time_limit($timeout);
    }// end if

    // loop thru the array to get each message
    for ($i=1; $i <= $Count; $i++){
            set_time_limit($timeout);
            $MsgOne = get($i, $fp);

            if( (!$MsgOne) or (gettype($MsgOne) != "array") )
            {
                //echo "oops, Message not returned by the server.<BR>\n";
                exit;
            }// end if
            /*
                call the function to read the message
                returns true if access, breakdown and insertion
                in to db are completed sucessfully
           */
              message_details($MsgOne, $i, $fp);

      }// end for loop

      //close the email box and delete all messages marked for deletion
      quit($fp);

    //close the application
    //echo "<br>Finished</b>";
    exit;



 楼主| 发表于 2015-6-11 10:33:43 | 显示全部楼层

RE: Using PHP to read email in a POP3 mailbox (1-2)

//-----------------------------------------------------------------------------
//                                    Function Listing
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//                                    Get the Message Details
//-----------------------------------------------------------------------------
function     message_details($MsgOne, $msgNo, $fp)
        {
        /*
        Function to read the message and extract :
            a. subject
            b. date
            c. split the body line by line
   */
            $body                     = '';                    // get the body of the message into 1 variable
            $subjects             = '';         // get the subject of the email
            $dates                     = '';                    // get the date of the email
           $body_start_key = false;          // body starts at blank line, blank line is
separator for from headers to body
           $TIRSFlag             = false;      // flag for seeing if the email is really to
be processed by the app
           $base64Flag     = false;      // flag to handle base 64 encoding by
email systems.



            foreach ($MsgOne as $key => $value)
        {
        if (trim($value) == "Content-Transfer-Encoding: base64"){
          $base64Flag = true;
        }//end if

        //get the subject line of the email
        if (strlen(stristr($value, "Subject"))>1){
          $subjects = trim(stristr($value, " "));

          //look for IncidentNo in the subject to see if we need to attempt to process the email
          if (strlen(stristr($subjects, "IncidentNo:"))>1){
              $TIRSFlag = true;
            }// end if
        }// end if

        //get the date of the email
        if (strlen(stristr($value, "Date"))>1){
          $dates = trim(stristr($value, " "));
            $date_key = $key;
        }// end if


        //the body
        if (strlen(trim($value))==0){
          if ($body_start_key == false){ $body_start_key = true; } //set the start key for the body
        }//end if

        if ($body_start_key == true){
          $body .= trim($value);
          if ($base64Flag == false){ $body .="<br />"; }
        }// end if

      }// end foreach

      // only create incident if the subject line contains the word incident
      if ($TIRSFlag == false){

          //delete the message
          delete($msgNo, $fp);

      }else{

          //decode the message if its base64 encoded
          if ($base64Flag == true) {
            $body = base64_decode($body);
          }//end if

          // call the function that does the sql inserts
          create_incident($subjects, $body, $msgNo, $fp);

      }// end if
        }// end function

//-----------------------------------------------------------------------------
//                                    Create the incident
//-----------------------------------------------------------------------------
function create_incident($subject, $message_body, $msgNo, $fp)
        {
             //process the body of the email and take it apart and find stuff in it...do whatever processing you need to here
             //the code below is simply a hint and probably not relevant to your situation
             //its strictly here as a guide as to what can be done with the body of the email
             //my application takes the subject and body apart and creates a record in our web-based
             //application's database (the code for this has been removed...)


             // declarations for function
                $inc_sec_off = '';
                $inc_site    = '';
                $inc_type    = '';
                $inc_issue   = '';
                $inc_co_id   = '';
                $inc_http    = '';
              $options     = '';

              // take the subject apart to get the individual elements

           $sub_details         = stristr($subject, ":");                                       // get
rest of subject line from the first ':'
           $split_subject     = explode (" ", $sub_details);                                  //
split on space
           $incident_no            =    trim($split_subject[1]);                                      //
incident number from email
           $incident_type        = trim($split_subject[3]);                                      //
incident type from email
           $inc_date                 = trim($split_subject[5]);                                                        // incident date
from email
             $inc_dates                = explode("/",$inc_date);


             if (count($inc_dates)>1){
                     $inc_date            = $inc_dates[2]."-".$inc_dates[0]."-".$inc_dates[1];
    //proper date format (Damned Americans)
             }//end if

             $weekday                    = date( "l", $inc_date);                                                            // get the weekday

             $time                         = strtotime($inc_date . " ". trim($split_subject[6]));

             $inc_time                 = date("H:i:s", strftime($time) );                                        // incident
time from email

             //convert the body crlf to <br> tags if not done when the message was built
             if (strlen(stristr($message_body,"<br>"))==0){
                     $message_body = nl2br($message_body);
           }

           // take the body apart to get the individual elements
           $body                        =    explode("<br />", $message_body);

           for ($x=0; $x<count($body); $x++){

                   if (strlen(stristr($body[$x], "Security Officer"))>1)       {  
$inc_sec_off            = substr(stristr($body[$x], ":"),1);   }
                   if (strlen(stristr($body[$x], "client_number"))>1)                {  $inc_site  
            = substr(stristr($body[$x], ":"),1);   }
                   if (strlen(stristr($body[$x], "Company ID"))>1)                      {  $inc_co_id  
            = substr(stristr($body[$x], ":"),1);   }
                   if (strlen(stristr($body[$x], "Are"))>1)                            {  $inc_issue
            = substr(stristr($body[$x], ":"),1);   }
                   if (strlen(stristr($body[$x], "http"))>1)                           {  $inc_https
            = explode("//",$body[$x]);                 }

       }// end for loop

       //echo $message_body;


      //delete the email if the insertion was succesful
          if ($result && $result1){
            delete ($msgNo, $fp);
          }// end if


        }// end function


?>
 楼主| 发表于 2015-6-11 10:37:04 | 显示全部楼层

RE: Using PHP to read email in a POP3 mailbox (2-1)

email_functions.php
<?php
/*
<!-- Version=2.30 Date=11/05/04 Name=email_functions.php --> */

function connect ($server, $port)
    {
        global $buffer;
        //    Opens a socket to the specified server. Unless overridden,
        //    port defaults to 110. Returns true on success, false on fail

        // If MAILSERVER is set, override $server with it's value
        $e_server = $server;

        if(!$fp = fsockopen($e_server, $port, &$errno, &$errstr))
        {
            $error = "POP3 connect: Error [$errno] [$errstr]";
            return false;
        }

        stream_set_blocking($fp,true);
        update_timer();
        $reply = fgets($fp,$buffer);
        $reply = strip_clf($reply);
        if(!is_ok($reply))
        {
            $error = "POP3 connect: Error [$reply]";
            return false;
        }

        $BANNER = parse_banner($reply);
        $RFC1939 = noop($fp);
        if($RFC1939)
        {
            $error = "POP3: premature NOOP OK, NOT an RFC 1939 Compliant server";
            quit($fp);
            return false;
        }
        return $fp;
    }// end function

function noop ($fp)
    {

        $cmd = "NOOP";
        $reply = send_cmd($cmd, $fp);
        if(!is_ok($reply))
        {
            return false;
        }
        return true;
    }// end function

function user ($user, $fp)
    {
        // Sends the USER command, returns true or false

        if(empty($user))
        {
            $error = "POP3 user: no user id submitted";
            return false;
        }

        $reply = send_cmd("USER $user", $fp);
        if(!is_ok($reply))
        {
            $error = "POP3 user: Error [$reply]";
            return false;
        }
        return true;
    }// end function

function pass ($pass, $fp)
    {
        // Sends the PASS command, returns # of msgs in mailbox,
        // returns false (undef) on Auth failure

        if(empty($pass))
        {
            $error = "POP3 pass: no password submitted";
            return false;
        }

        $reply = send_cmd("PASS $pass", $fp);
        if(!is_ok($reply))
        {
            $error = "POP3 pass: authentication failed [$reply]";
            quit($fp);
            return false;
        }
        //    Auth successful.
        //echo "<br>User Authenticated<br>";
        $count = last("count", $fp);
        $COUNT = $count;
        $RFC1939 = noop($fp);
        if(!$RFC1939)
        {
            $error = "POP3 pass: NOOP failed. Server not RFC 1939 compliant";
            quit($fp);
            return false;
        }
        return $count;
    }// end function

function login ($login = "", $pass = "", $fp)
    {
        // Sends both user and pass. Returns # of msgs in mailbox or
        // false on failure (or -1, if the error occurs while getting
        // the number of messages.)

        if(!user($login, $fp))
        {
            //    Preserve the error generated by user()
            return false;
        }

        $count = pass($pass, $fp);
        if( (!$count) or ($count == -1) )
        {
            //    Preserve the error generated by last() and pass()
            return "-1";
        }
        return $count;
    }// end function

function top ($msgNum, $numLines = "0", $fp)
    {
        //    Gets the header and first $numLines of the msg body
        //    returns data in an array with each returned line being
        //    an array element. If $numLines is empty, returns
        //    only the header information, and none of the body.


        update_timer();


        $buffer = $buffer;
        $cmd = "TOP $msgNum $numLines";
        fwrite($fp, "TOP $msgNum $numLines\r\n");
        $reply = fgets($fp, $buffer);
        $reply = $strip_clf($reply);
        if($DEBUG) { @error_log("POP3 SEND [$cmd] GOT [$reply]",0); }
        if(!is_ok($reply))
        {
            $error = "POP3 top: Error [$reply]";
            return false;
        }

        $count = 0;
        $MsgArray = array();

        $line = fgets($fp,$buffer);
        while ( !ereg("^\.\r\n",$line))
        {
            $MsgArray[$count] = $line;
            $count++;
            $line = fgets($fp,$buffer);
            if(empty($line))    { break; }
        }

        return $MsgArray;
    }// end function

function pop_list ($msgNum = "", $fp)
    {
        //    If called with an argument, returns that msgs' size in octets
        //    No argument returns an associative array of undeleted
        //    msg numbers and their sizes in octets
                global $buffer;

        $Total = $Count;
        if( (!$Total) or ($Total == -1) )
        {
            return false;
        }
        if($Total == 0)
        {
            return array("0","0");
            // return -1;    // mailbox empty
        }

        $update_timer();

        if(!empty($msgNum))
        {
            $cmd = "LIST $msgNum";
            fwrite($fp,"$cmd\r\n");
            $reply = fgets($fp,$buffer);
            $reply = $strip_clf($reply);
            if(!is_ok($reply))
            {
                $error = "POP3 pop_list: Error [$reply]";
                return false;
            }
            list($junk,$num,$size) = explode(" ",$reply);
            return $size;
        }
        $cmd = "LIST";
        $reply = $send_cmd($cmd, $fp);
        if(!is_ok($reply))
        {
            $reply = $strip_clf($reply);
            $error = "POP3 pop_list: Error [$reply]";
            return false;
        }
        $MsgArray = array();
        $MsgArray[0] = $Total;
        for($msgC=1;$msgC <= $Total; $msgC++)
        {
            if($msgC > $Total) { break; }
            $line = fgets($fp,$buffer);
            $line = $strip_clf($line);
            if(ereg("^\.",$line))
            {
                $error = "POP3 pop_list: Premature end of list";
                return false;
            }
            list($thisMsg,$msgSize) = explode(" ",$line);
            settype($thisMsg,"integer");
            if($thisMsg != $msgC)
            {
                $MsgArray[$msgC] = "deleted";
            }
            else
            {
                $MsgArray[$msgC] = $msgSize;
            }
        }
        return $MsgArray;
    }// end function

function get ($msgNum, $fp)
    {
        //    Retrieve the specified msg number. Returns an array
        //    where each line of the msg is an array element.

        global $buffer;
        update_timer();

        $buffer = $buffer;
        $cmd = "RETR $msgNum";

        $reply = send_cmd($cmd, $fp);

        if(!is_ok($reply))
        {
            $error = "POP3 get: Error [$reply]";
            return false;
        }

        $count = 0;
        $MsgArray = array();

        $line = fgets($fp,$buffer);
        while ( !ereg("^\.\r\n",$line))
        {
            $MsgArray[$count] = $line;
            $count++;
            $line = fgets($fp,$buffer);
            if(empty($line))    { break; }
        }
        return $MsgArray;
    }// end function



 楼主| 发表于 2015-6-11 10:37:50 | 显示全部楼层

RE: Using PHP to read email in a POP3 mailbox (2-2)

function last ( $type = "count", $fp )
    {
        //    Returns the highest msg number in the mailbox.
        //    returns -1 on error, 0+ on success, if type != count
        //    results in a popstat() call (2 element array returned)

        $last = -1;

        $reply = send_cmd("STAT", $fp);
        if(!is_ok($reply))
        {
            $error = "POP3 last: error [$reply]";
            return $last;
        }

        $Vars = explode(" ",$reply);
        $count = $Vars[1];
        $size = $Vars[2];
        settype($count,"integer");
        settype($size,"integer");
        if($type != "count")
        {

            return array($count,$size);
        }
        return $count;
    }// end function

function resets($fp)
    {
        //    Resets the status of the remote server. This includes
        //    resetting the status of ALL msgs to not be deleted.
        //    This method automatically closes the connection to the server.


        $reply = $send_cmd("RSET", $fp);
        if(!is_ok($reply))
        {
            //    The POP3 RSET command -never- gives a -ERR
            //    response - if it ever does, something truely
            //    wild is going on.

            $error = "POP3 reset: Error [$reply]";
        }
        quit($fp);
        return true;
    }// end function

function send_cmd ( $cmd, $fp )
    {
        //    Sends a user defined command string to the
        //    POP server and returns the results. Useful for
        //    non-compliant or custom POP servers.
        //    Do NOT include the \r\n as part of your command
        //    string - it will be appended automatically.

        //    The return value is a standard fgets() call, which
        //    will read up to $buffer bytes of data, until it
        //    encounters a new line, or EOF, whichever happens first.

        //    This method works best if $cmd responds with only
        //    one line of data.
                global $buffer;
        if(!isset($fp))
        {
            $error = "POP3 send_cmd: No connection to server";
            return false;
        }

        if(empty($cmd))
        {
            $error = "POP3 send_cmd: Empty command string";
            return "";
        }

        $buffer = $buffer;
        update_timer();
        fwrite($fp,"$cmd\r\n");
        $reply = fgets($fp,$buffer);
        $reply = strip_clf($reply);
        return $reply;
    }// end function

function quit($fp)
    {
        //    Closes the connection to the POP3 server, deleting
        //    any msgs marked as deleted.
        global $buffer;

        $cmd = "QUIT";
        fwrite($fp,"$cmd\r\n");
        $reply = fgets($fp,$buffer);
        $reply = strip_clf($reply);
        fclose($fp);
        return true;
    }// end function


function is_ok ($cmd = "")
    {
        //    Return true or false on +OK or -ERR

        if(empty($cmd))                 { return false; }
        if ( ereg ("^\+OK", $cmd ) )    { return true; }
        return false;
    }// end function

function strip_clf ($text = "")
    {
        // Strips \r\n from server responses

        if(empty($text)) { return $text; }
        $stripped = ereg_replace("\r","",$text);
        $stripped = ereg_replace("\n","",$stripped);
        return $stripped;
    }// end function

function parse_banner ( $server_text )
    {
        $outside = true;
        $banner = "";
        $length = strlen($server_text);
        for($count =0; $count < $length; $count++)
        {
            $digit = substr($server_text,$count,1);
            if(!empty($digit))
            {
                if( (!$outside) and ($digit != '<') and ($digit != '>') )
                {
                    $banner .= $digit;
                }
                if ($digit == '<')
                {
                    $outside = false;
                }
                if($digit == '>')
                {
                    $outside = true;
                }
            }
        }
        $banner = strip_clf($banner);    // Just in case
        return "<$banner>";
    }// end function

function popstat ()
    {
        //    Returns an array of 2 elements. The number of undeleted
        //    msgs in the mailbox, and the size of the mbox in octets.

        $PopArray = last("array");

        if($PopArray == -1) { return false; }

        if( (!$PopArray) or (empty($PopArray)) )
        {
            return false;
        }
        return $PopArray;
    }// end function

function uidl ($msgNum = "", $fp)
    {
        //    Returns the UIDL of the msg specified. If called with
        //    no arguments, returns an associative array where each
        //    undeleted msg num is a key, and the msg's uidl is the element
        //    Array element 0 will contain the total number of msgs

        global $buffer, $Count;

        if(!empty($msgNum))
        {
            $cmd = "UIDL $msgNum";
            $reply = send_cmd($cmd);
            if(!is_ok($reply))
            {
                $error = "POP3 uidl: Error [$reply]";
                return false;
            }
            list ($ok,$num,$myUidl) = explode(" ",$reply);
            return $myUidl;
        }
        else
        {
            //update_timer();

            $UIDLArray = array();
            $Total = $Count;
            $UIDLArray[0] = $Total;

            if ($Total < 1)
            {
                return $UIDLArray;
            }
            $cmd = "UIDL";
            fwrite($fp, "UIDL\r\n");
            $reply = fgets($fp, $buffer);
            $reply = strip_clf($reply);

            if(!is_ok($reply))
            {
                $error = "POP3 uidl: Error [$reply]";
                return false;
            }

            $line = "";
            $count = 1;
            $line = fgets($fp,$buffer);
            while ( !ereg("^\.\r\n",$line))
            {
                if(ereg("^\.\r\n",$line))
                {
                    break;
                }
                list ($msg,$msgUidl) = explode(" ",$line);
                $msgUidl = strip_clf($msgUidl);
                if($count == $msg)
                {
                    $UIDLArray[$msg] = $msgUidl;
                }
                else
                {
                    $UIDLArray[$count] = "deleted";
                }
                $count++;
                $line = fgets($fp,$buffer);
            }
        }
        return $UIDLArray;
    }// end function

function delete ($msgNum = "", $fp)
    {
        //    Flags a specified msg as deleted. The msg will not
        //    be deleted until a quit() method is called.

        if(empty($msgNum))
        {
            $error = "POP3 delete: No msg number submitted";
            return false;
        }
        $reply = send_cmd("DELE $msgNum", $fp);
        if(!is_ok($reply))
        {
            $error = "POP3 delete: Command failed [$reply]";
            return false;
        }
        return true;
    }// end function

function conn($sql, $db_account='')
        {

    /*

        add code to decide what server/db to tag when inserting the data

        include("../includes/portal.php");

    */

        $host  = $db_account['host'];
        $user  = $db_account['login'];
        $pass  = $db_account['pwd'];
        $db    = $db_account['db'];

            //echo "commnecing connection to local db<br>";
            //echo "mysql_connect($host, $user, $pass)";

            ob_flush();
            //$conn = mysql_connect($host, $user, $pass) or die("Can't connect because ". mysql_error());
            if (!($conn=mysql_connect($host, $user, $pass)))  {
                printf("error connecting to DB by user = $user and pwd=$pass");
                exit;
            }

            $db3 = mysql_select_db($db, $conn);// or die("Unable to connect to local database");

            $result = mysql_query($sql);// or die ("Can't connect because ".
mysql_error()."<br>$sql");

            return $result;

        }//end function


function update_timer()
    {
     global $timeout;
     set_time_limit($timeout);

    }
?>
 楼主| 发表于 2015-6-11 10:38:41 | 显示全部楼层

RE: Using PHP to read email in a POP3 mailbox (3)

本帖最后由 demo 于 2015-6-12 02:43 编辑

logging.php
<?
//<!-- Version=2.30 Date=11/08/04 Name=logging.php -->
/*

-----------------------------------------------------------------------------

    goes to db  
    if db not available, goes to text file
*/

function do_log($client, $activity, $sql='', $success)
        {
        //logs the client, activity, sql and success or failure of the action
        //
        /*
        $host = "192.168.100.10";
        $user = "root";
        $pass = "3JN4xM9Jvgj2VwHe";
         
        */
        $host  = '192.168.160.31';   
        $user  = 'rume';
        $pass  = 'RumE2#$w';
        $db     = "loggingdb";
         
        $err = 0;
            //echo "commnecing connection to local db<br>";
              
            if (!($conn=mysql_connect($host, $user, $pass)))  {
                $err = mysql_errno();
            }
            if (!$db3=mysql_select_db($db, $conn)){ //or die("Unable to connect to local database");
                $err = mysql_errno();
            }
              
            if ($err != 0){
              
              //database is not available or can't be connected to at the moment
              write_log($client, $activity, $sql, $success);
              
            }else{
               $time = time();
              //enter the data into the log table   
              $sql = "insert into logg (client, sql, activity, success, unix_timestamp) values ('$client','$sql','$activity','$success',$time)";  
               //echo $sql;
              $result = mysql_query($sql) or die ("Can't connect because ". mysql_error()."<br>$sql");
              $err = mysql_errno();
        //if ($err != 0){
            write_log($client, $activity, $sql, $success);      
        //}// end if
      
      }// end if
              
        }//end function      
         
         
function write_log($client, $activity, $sql, $success)
        {
            //write the text log
            $time = time();
            $filename = "C:\\apisonline.com\\html\\scripts\\logs\\test.log";
              
            $somecontent = "Client\t$client.\nActivity\t$activity\nSQL\tsql\nSuccess:\t$success($time)\n\n";
                  
                // Let's make sure the file exists and is writable first.
                if (is_writable($filename)) {
                  
                   if (!$handle = fopen($filename, 'a')) {
                         //echo "Cannot open file ($filename)";
                         //exit;
                   }
                  
                   // Write $somecontent to our opened file.
                   if (fwrite($handle, $somecontent) === FALSE) {
                       //echo "Cannot write to file ($filename)";
                       //exit;
                   }
                    
                   //echo "Success, wrote ($somecontent) to file ($filename)";
                    
                    fclose($handle);
      
            }// end if         
         
        }// end function

?>

Reference: http://www.shangxueba.com/jingyan/1919005.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|小黑屋|BC Morning Website ( Best Deal Inc. 001 )  

GMT-8, 2025-8-26 13:51 , Processed in 0.017568 second(s), 17 queries .

Supported by Best Deal Online X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表