2011-01-31 3 views
0

Я написал (сокращенную) версию простой программы отправки почты smtp.
Все работает отлично (в этой версии вырезания и более сложной версии).Проблема с захватом кода возврата почтового сервера smtp через сокет

Однако почтовый сервер возвращает несколько сообщений по мере отправки почты.
The (функция handleNewData) ProgressEvent.SOCKET_DATA не кажется, чтобы захватить все возвращаемые сообщений электронной почты
(в частности, я хочу, чтобы захватить
250 2.0.0 Ok: очередь, как XYZ
сообщение, чтобы подтвердить, что сообщение было отправлено .

Каждый знает, почему все сообщения, не учитываются в handleNewData и как я могу это исправить?

Спасибо заранее.

Мой код написан на Adobe Air 2,5

Мой вывод трассировки выглядит следующим образом:

Connecting to the mail server, example.com:25 
    Response is: 220 example.com ESMTP Postfix 
    Response is: 250 example.com 
    Response is: 250 2.1.0 Ok 
250 2.1.5 Ok 
354 End data with <CR><LF>.<CR><LF> 
250 2.0.0 Ok: queued as 2C0264F5FF 
221 2.0.0 Bye 

Мой код следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009" 
        xmlns:s="library://ns.adobe.com/flex/spark" 
        xmlns:mx="library://ns.adobe.com/flex/mx" 
        creationComplete="Smtp()"> 
<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<s:Button label="Send Email" x="200" y="200" click="mail()"> </s:Button> 

<fx:Script> 
    <![CDATA[ 

      import flash.net.Socket; 
      import flash.profiler.showRedrawRegions; 
      import flash.utils.ByteArray; 

      import mx.core.mx_internal; 
      import mx.utils.ObjectUtil; 

      private var socket:Socket; 
      private var serverURL:String; 
      private var serverPort:int = 25; 
      private var serverResponse:ByteArray = new ByteArray(); 
      public var sendData:Array = new Array(); 
      public var dataStr:String;     


      public function Smtp():void 
      { 
       this.serverURL = "example.com"; 
       this.serverPort = 25; 
       socket = new Socket(); 
      socket.addEventListener(ProgressEvent.SOCKET_DATA,handleNewData); 
       this.connectToServer(); 
      } 

      public function mail():void 
      { 
       dataStr ="HELO example.com" + "\r\n"; 
       sendString(dataStr);     

       dataStr = "MAIL FROM:<[email protected]>\r\n"; 
       sendString(dataStr); 

       dataStr = "RCPT TO:<[email protected]>\r\n"; 
       sendString(dataStr); 

       dataStr = "DATA\r\n"; 
       sendString(dataStr); 

       dataStr = "To: <[email protected]>\r\n"; 
       sendString(dataStr); 

       dataStr = "Date: Wed Jan 26 2011 07:49:31 PM\r\n" 
       sendString(dataStr); 

       dataStr = "Subject: Test\r\n"; 
       sendString(dataStr); 

       dataStr = "My Text\r\n"; 
       sendString(dataStr); 

       dataStr = ".\r\n"; 
       sendString(dataStr); 

       dataStr = "QUIT\r\n"; 
       sendString(dataStr);  
      } 

      private function connectToServer():void 
      { 
       trace("Connecting to the mail server, " + serverURL + ":" + serverPort); 
       socket.connect(serverURL, serverPort); 
      } 


      private function sendString(dataStr:String):void 
      { 
       var bytes:ByteArray = new ByteArray(); 
       bytes.writeMultiByte(dataStr, "UTF-8"); 
       socket.writeBytes(bytes); 
       socket.flush(); 
      } 

      private function handleNewData(event:ProgressEvent):void 
      { 
       var numBytes:int = socket.bytesAvailable; 
       serverResponse = new ByteArray(); 
       while(--numBytes >= 0) 
       { 
        var byte:int = socket.readUnsignedByte(); 
        serverResponse.writeByte(byte); 
       }  

       var response:String = serverResponse.toString(); 
       trace("\t Response is: " + response);      
      } 


    ]]> 
</fx:Script> 
</s:WindowedApplication> 

ответ

0

К сожалению братва/chapettes,

сокет действительно получать все ответы сервера :-)

Это просто, что около той части, где возвращается сообщение в очереди, сокет получает несколько литов сразу.

О, ну, надеюсь, что код был для кого-то полезен.

Смежные вопросы