Проблема с захватом кодов возврата сервера электронной почты smtp через сокет - PullRequest
0 голосов
/ 31 января 2011

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

Однако сервер электронной почты возвращает несколько сообщений при отправке почты.
Кажется, что ProgressEvent.SOCKET_DATA (функция handleNewData) не захватывает все сообщения возврата электронной почты
(в частностихотите перехватить
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:<user1@gmail.com>\r\n";
                sendString(dataStr);

                dataStr = "RCPT TO:<user1@example.com>\r\n";
                sendString(dataStr);

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

                dataStr = "To: <user1@example.com>\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>

1 Ответ

0 голосов
/ 31 января 2011

Извините, chaps / chapettes,

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

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

О, хорошо, надеюсь, код был кому-то полезен.

...