2012-08-15 9 views
6

में लागू किया गया है क्या PHP में पीओपी 3/आईएमएपी सर्वर का कोई भी कार्यान्वयन है?आईएमएपी या पीओपी 3 सर्वर PHP

मैं sendgrid का उपयोग कर अपनी ई-मेल सेवा को संभालने में कामयाब रहा हूं। मैं फाइलों/डीबी/जो कुछ भी कर रहा हूं, अब मैं अपने सर्वर पर संदेशों को स्टोर करने जा रहा हूं और अब मैं अपने उपयोगकर्ताओं के लिए अपने मेलबॉक्स में पूर्ण पीओपी 3 या आईएमएपी (बेहतर) पहुंच प्रदान करना चाहता हूं। क्या PHP में ऐसा कार्यान्वयन है? या क्या Windows Azure के वितरित वातावरण में POP3/IMAP चलाने की कोई अन्य संभावना है (मान लीजिए कि मेरे पास साझा ब्लॉब्स/टेबल/डीबी में संग्रहीत मेलबॉक्स हैं)?

+2

PHP में इसका कार्यान्वयन हो सकता है, लेकिन अगर भगवान के प्यार के लिए इसका उपयोग नहीं किया जाता है! शैल स्क्रिप्ट के अलावा, PHP सबसे खराब भाषा है जो मैं ऐसा करने के बारे में सोच सकता हूं। यदि आप ऐसी भाषा में कुछ चाहते हैं जो वेब डेवलपर समझते हैं, तो नोड.जे.एस. देखें। – DaveRandom

+0

@ डेव रैंडम, आप सही हैं ... हालांकि, मेरा ऐप PHP का उपयोग करता है और मैं विंडोज़ एज़ूर मंच द्वारा प्रदान किए गए विकल्पों से भी सीमित हूं। –

+3

अच्छी तरह से पीओपी 3 और आईएमएपी विशेष रूप से जटिल प्रोटोकॉल नहीं हैं (आप जो समर्थन करना चाहते हैं उसके आधार पर) और PHP में काफी आसानी से कार्यान्वित किया जा सकता है, लेकिन समेकन PHP में एक बड़ी समस्या है क्योंकि यह थ्रेडिंग का समर्थन नहीं करता है और यहां तक ​​कि फोर्किंग की प्रक्रिया भी नहीं है .. गलती ... अच्छा, चलो दयालु रहें और विंडोज़ पर लागू करने के लिए * चुनौतीपूर्ण * कहें। इसके अलावा, दक्षता के अनुसार यह चौंकाने वाला होगा। क्या Node.js इंस्टॉल करने का कोई तरीका नहीं है? Google के चारों ओर घूमते हुए मुझे पहले से ही 2 पीओपी 3 और 1 आईएमएपी सर्वर मिल गया है, जो कि एपीआई का उपयोग करने में आसान है। – DaveRandom

उत्तर

10

ठीक है, यह दिखाने के लिए कि वास्तव में PHP में एक पीओपी 3 सर्वर लिखना संभव है, यहां यह है। सर्वर कोई प्रमाणीकरण नहीं करता है - या बहुत कुछ और भी। यह सिर्फ एक ही संदेश भेजना जारी रखता है। लेकिन यह काम करता है। थंडरबर्ड इससे संदेश पुनर्प्राप्त करने में सक्षम था। पूरी तरह से बेकार, लेकिन शांत तरह का।

मेरा सेटअप PHP 5.2 के साथ विंडोज पर अपाचे 2 है।

<?php 

// echo something so fopen() would return 
header("Content-type: text/plain"); 
echo "OK\n"; 
flush(); 

// listen for incoming connection 
$listen_socket = socket_create_listen(110, 1); 
$r = $w = $e = array($listen_socket); 
$n = socket_select($r, $w, $e, 120); 
$client_socket = ($n == 1) ? socket_accept($listen_socket) : null; 
socket_close($listen_socket); 

// spawn copy of myself 
$internal_url = "http://{$_SERVER['HTTP_HOST']}:{$_SERVER['SERVER_PORT']}{$_SERVER['SCRIPT_NAME']}"; 
$stream_context_options = array (
    'http' => array (
     'method' => 'GET', 
     'timeout' => 1 
    ) 
); 
$context = stream_context_create($stream_context_options); 
if($f = fopen($internal_url, "rb", 0, $context)) { 
    fclose($f); 
} 

if(!$client_socket) { 
    // timed out 
    exit; 
} 

// start handling the session 
$read_buffer = ""; 
$write_buffer = "+OK POP3 server ready\r\n"; 
$active = true; 

$messages = array(
    "From: [email protected]\r\nSubject: This is a test\r\n\r\nHello world!\r\n" 
); 


$idle_start = time(); 
while(true) { 
    $r = $w = $e = array($client_socket); 
    $n = socket_select($r, $w, $e, 60); 
    if($n) { 
     if($r) { 
      // read from the socket 
      $read_buffer .= socket_read($client_socket, 128); 
      $idle_start = time(); 
     } 
     if($w) { 
      if($write_buffer) { 
       // write to the socket 
       $written = socket_write($client_socket, $write_buffer); 
       $write_buffer = substr($write_buffer, $written); 
       $idle_start = time(); 
      } else if($active) { 
       $now = time(); 
       $idle_time = $now - $idle_start; 
       if($idle_time > 10) { 
        // exit if nothing happened for 10 seconds 
        break; 
       } else if($idle_time > 2) { 
        // start napping when the client is too slow 
        sleep(1); 
       } 
      } else { 
       break; 
      } 
     } 
     if($e) { 
      break; 
     } 
     if($read_buffer) { 
      if(preg_match('/(.*?)(?:\s+(.*?))?[\r\n]+/', $read_buffer, $matches)) { 
       $read_buffer = substr($read_buffer, strlen($matches[0])); 
       $command = $matches[1]; 
       $argument = $matches[2]; 
       switch($command) { 
        case 'USER': 
         $username = $argument; 
         $write_buffer .= "+OK $username is welcome here\r\n"; 
         break; 
        case 'PASS': 
         $message_count = count($messages); 
         $write_buffer .= "+OK mailbox has $message_count message(s)\r\n"; 
         break; 
        case 'QUIT': 
         $write_buffer .= "+OK POP3 server signing off\r\n"; 
         $active = false; 
         break; 
        case 'STAT': 
         $message_count = count($messages); 
         $mailbox_size = 0; 
         foreach($messages as $message) { 
          $mailbox_size += strlen($message); 
         } 
         $write_buffer .= "+OK $message_count $mailbox_size\r\n"; 
         break; 
        case 'LIST': 
         $start_index = (int) $argument; 
         $message_count = count($messages) - $start_index; 
         $total_size = 0; 
         for($i = $start_index; $i < count($messages); $i++) { 
          $total_size += strlen($messages[$i]); 
         } 
         $write_buffer .= "+OK $message_count messages ($total_size octets)\r\n"; 
         for($i = $start_index; $i < count($messages); $i++) { 
          $message_id = $i + 1; 
          $message_size = strlen($messages[$i]); 
          $write_buffer .= "$message_id $message_size\r\n"; 
         } 
         $write_buffer .= ".\r\n"; 
         break; 
        case 'RETR': 
         $message_id = (int) $argument; 
         $message = $messages[$message_id - 1]; 
         $message_size = strlen($message); 
         $write_buffer .= "+OK $message_size octets\r\n"; 
         $write_buffer .= "$message\r\n"; 
         $write_buffer .= ".\r\n"; 
         break; 
        case 'DELE': 
         $write_buffer .= "+OK\r\n"; 
         break; 
        case 'NOOP': 
         $write_buffer .= "+OK\r\n"; 
         break; 
        case 'LAST': 
         $message_count = count($messages) - $start_index; 
         $write_buffer .= "+OK $message_count\r\n"; 
         break; 
        case 'RSET': 
         $write_buffer .= "+OK\r\n"; 
         break; 
        default: 
         $write_buffer .= "-ERR Unknown command '$command'\r\n"; 
       } 
      } 
     } 
    } else { 
     break; 
    } 
} 

?> 
+0

ये, स्रोत क्या है? क्या आपने इसे अपने आप बनाया है? –

+2

हाँ, मैंने इसे स्वयं लिखा था। – cleong

+1

यदि आप एक गैर-विंडोज होस्ट पर थे तो आप एक नई प्रक्रिया को फोर्क करने के लिए [पीसीएनटीएल] (http://php.net/manual/en/pcntl.example.php) का उपयोग कर सकते हैं। – Xeoncross

संबंधित मुद्दे