Ejemplo n.º 1
0
class SMTP(smtplib.SMTP):
    """ This is a subclass derived from SMTP that connects over a Concurrence socket """
    def _get_socket(self, host, port, timeout):
        new_socket = Socket.connect((host, port))
        self._reader = BufferedReader(new_socket, Buffer(1024))
        self._writer = BufferedWriter(new_socket, Buffer(1024))
        self.file = self._reader.file()
        return new_socket

    def send(self, str):
        if self.debuglevel > 0: print>>sys.stderr, 'send:', repr(str)
        if hasattr(self, 'sock') and self.sock:
            try:
                self._writer.write_bytes(str)
                self._writer.flush()
            except IOError:
                self.close()
                raise SMTPServerDisconnected('Server not connected')
        else:
            raise SMTPServerDisconnected('please run connect() first')

    def close(self):
        if self.sock:
            self.sock.close()
            self.sock = None
            self._reader = None
            self._writer = None
            self.file = None
Ejemplo n.º 2
0
class SMTP(smtplib.SMTP):
    """ This is a subclass derived from SMTP that connects over a Concurrence socket """
    def _get_socket(self, host, port, timeout):
        new_socket = Socket.connect((host, port))
        self._reader = BufferedReader(new_socket, Buffer(1024))
        self._writer = BufferedWriter(new_socket, Buffer(1024))
        self.file = self._reader.file()
        return new_socket

    def send(self, str):
        if self.debuglevel > 0: print >> sys.stderr, 'send:', repr(str)
        if hasattr(self, 'sock') and self.sock:
            try:
                self._writer.write_bytes(str)
                self._writer.flush()
            except IOError:
                self.close()
                raise SMTPServerDisconnected('Server not connected')
        else:
            raise SMTPServerDisconnected('please run connect() first')

    def close(self):
        if self.sock:
            self.sock.close()
            self.sock = None
            self._reader = None
            self._writer = None
            self.file = None
Ejemplo n.º 3
0
 def _send(self, identifier, body, timeout=30):
     try:
         conn = Socket.connect((self.host, self.port), timeout)
         try:
             req = u"POST / HTTP/1.1\r\nHost: %s\r\nContent-length: %d\r\nX-Realplexor: %s=%s%s\r\n\r\n%s" % (self.host, len(body), (self.identifier or ""), ("%s:%s@" % (self.login, self.password) if self.login else ""), identifier or "", body)
             if type(req) == unicode:
                 req = req.encode("utf-8")
             reader = BufferedReader(conn, Buffer(1024))
             writer = BufferedWriter(conn, Buffer(1024))
             writer.write_bytes(req)
             writer.flush()
             conn.socket.shutdown(socket.SHUT_WR)
             response = ""
             while True:
                 try:
                     chunk = reader.read_bytes_available()
                 except EOFError:
                     chunk = None
                 if not chunk:
                     break
                 response += chunk
             if response:
                 m = re_split_headers.split(response, 1)
                 if not m:
                     raise RealplexorError("Non-HTTP response received:\n%s" % response)
                 headers = m[0]
                 body = m[1]
                 m = re_http_status_line.match(headers)
                 if not m:
                     raise RealplexorError("Non-HTTP response received:\n%s" % response)
                 status, code = m.group(1, 2)
                 if code != "200":
                     raise RealplexorError("Request failed: %s\n%s" % (status, body))
                 m = re_content_length.search(headers)
                 if not m:
                     raise RealplexorError("No Content-Length header in response headers:\n%s" % headers)
                 expected_len = int(m.group(1))
                 if len(body) != expected_len:
                     raise RealplexorError("Response length (%d) is different from one specified in the Content-Length header (%d): possibly broken response" % (len(body), expected_len))
                 return body
             return response
         finally:
             conn.close()
     except socket.error as e:
         raise RealplexorSocketError("Socket error: %s" % e)
     except socket.gaierror as e:
         raise RealplexorError("DNS error: %s" % e)
     except socket.timeout as e:
         raise RealplexorError("Timeout error: %s" % e)
     except IOError as e:
         raise RealplexorSocketError("IOError: %s" % e)
Ejemplo n.º 4
0
 def _get_socket(self, host, port, timeout):
     new_socket = Socket.connect((host, port))
     self._reader = BufferedReader(new_socket, Buffer(1024))
     self._writer = BufferedWriter(new_socket, Buffer(1024))
     self.file = self._reader.file()
     return new_socket
Ejemplo n.º 5
0
 def _get_socket(self, host, port, timeout):
     new_socket = Socket.connect((host, port))
     self._reader = BufferedReader(new_socket, Buffer(1024))
     self._writer = BufferedWriter(new_socket, Buffer(1024))
     self.file = self._reader.file()
     return new_socket
Ejemplo n.º 6
0
 def __init__(self, stream, buffer):
     BufferedWriter.__init__(self, stream, buffer)
     self.ERROR_TEMPLATE = "%s"
Ejemplo n.º 7
0
 def _send(self, identifier, body, timeout=30):
     try:
         conn = Socket.connect((self.host, self.port), timeout)
         try:
             req = u"POST / HTTP/1.1\r\nHost: %s\r\nContent-length: %d\r\nX-Realplexor: %s=%s%s\r\n\r\n%s" % (
                 self.host, len(body), (self.identifier or ""),
                 ("%s:%s@" %
                  (self.login, self.password) if self.login else ""),
                 identifier or "", body)
             if type(req) == unicode:
                 req = req.encode("utf-8")
             reader = BufferedReader(conn, Buffer(1024))
             writer = BufferedWriter(conn, Buffer(1024))
             writer.write_bytes(req)
             writer.flush()
             conn.socket.shutdown(socket.SHUT_WR)
             response = ""
             while True:
                 try:
                     chunk = reader.read_bytes_available()
                 except EOFError:
                     chunk = None
                 if not chunk:
                     break
                 response += chunk
             if response:
                 m = re_split_headers.split(response, 1)
                 if not m:
                     raise RealplexorError(
                         "Non-HTTP response received:\n%s" % response)
                 headers = m[0]
                 body = m[1]
                 m = re_http_status_line.match(headers)
                 if not m:
                     raise RealplexorError(
                         "Non-HTTP response received:\n%s" % response)
                 status, code = m.group(1, 2)
                 if code != "200":
                     raise RealplexorError("Request failed: %s\n%s" %
                                           (status, body))
                 m = re_content_length.search(headers)
                 if not m:
                     raise RealplexorError(
                         "No Content-Length header in response headers:\n%s"
                         % headers)
                 expected_len = int(m.group(1))
                 if len(body) != expected_len:
                     raise RealplexorError(
                         "Response length (%d) is different from one specified in the Content-Length header (%d): possibly broken response"
                         % (len(body), expected_len))
                 return body
             return response
         finally:
             conn.close()
     except socket.error as e:
         raise RealplexorSocketError("Socket error: %s" % e)
     except socket.gaierror as e:
         raise RealplexorError("DNS error: %s" % e)
     except socket.timeout as e:
         raise RealplexorError("Timeout error: %s" % e)
     except IOError as e:
         raise RealplexorSocketError("IOError: %s" % e)