1 import sys,os 2 import smtplib, httplib, socket 3 4 class SMTP(smtplib.SMTP, httplib.HTTPConnection): 5 def connect(self, host='localhost', port = 0, proxy=None): 6 if proxy is None: 7 return smtplib.SMTP.connect(self, host, port) 8 else: 9 if not port and (host.find(':') == host.rfind(':')): 10 i = host.rfind(':') 11 if i >= 0: 12 host, port = host[:i], host[i+1:] 13 try: port = int(port) 14 except ValueError: 15 raise socket.error, "nonnumeric port" 16 if not port: 17 port = self.default_port 18 19 if self.debuglevel > 0: 20 print >>sys.stderr, 'connect:', (host, port) 21 22 proxy_host, proxy_port = proxy 23 conn = httplib.HTTPConnection(proxy_host, proxy_port) 24 conn.connect() 25 conn.send("CONNECT %s:%d HTTP/1.0\r\n\r\n" % (host, port)) 26 response = conn.response_class(conn.sock, strict=conn.strict, 27 method=conn._method) 28 (version, code, message) = response._read_status() 29 if code != 200: 30 conn.close() 31 raise socket.error, "Proxy connection failed: %d %s" % 32 (code, message.strip()) 33 while True: 34 line = response.fp.readline() 35 if line == '\r\n': 36 break 37 self.sock = conn.sock 38 (code, msg) = self.getreply() 39 if self.debuglevel > 0: 40 print >>sys.stderr, "connect:", msg 41 return (code, msg) 42 43 if __name__ == '__main__': 44 smtp = SMTP() 45 smtp.debuglevel = 1 46 smtp.connect('smtp.qq.com', 25, proxy=('127.0.0.1', 8123)) 47 smtp.login('1234...@qq.com', '12345678') 48 smtp.close()