I wrote a short script that tries to check if an email address exists or not.
It takes the domain of the inputted email and looks up the registered mail exchange. It then connects via smtp and attempts the "RCPT TO:<entered email>" command and based on the response decides if the email exists or not. I was trying to be more OOP in my approach but not sure I've been entirely successful. Thanks for your time. Chan Code: import DNS, socket, string, re, sys servers = [] myserver = 'mailgate.xxxxxxxx.com' mymail = 'maywedt...@xxxxxxxx.com' CRLF="\r\n" def mailxch(hname): mxhosts = DNS.mxlookup(hname) return mxhosts def prompt(prompt): return raw_input(prompt).strip() class smtsock(object): response = None def getmsg(self): self.response = self.msock.makefile('rb') while 1: try: line = self.response.readline() return line[:3], line[4:] except socket.error: self.msock.close() return "socket Error" def put(self,cmd,args=""): if args == "": str = '%s%s' % (cmd, CRLF) else: str = '%s %s%s' % (cmd, args, CRLF) try: self.msock.send(str) except socket.error: self.msock.close() return "socket Error" def pr(self,cmd,args=""): self.put(cmd, args) return self.getmsg() def conn(self,server): try: self.msock = socket.create_connection((server,25)) (hand, msg) = self.getmsg() return hand, msg except: err = sys.exc_info()[1] return err def helo(self, server): (hand, msg) = self.pr("HELO",server) return hand, msg def vrfy(self, hname): cstr = "<%s>"% hname (hand, msg) = self.pr("VRFY", cstr) return hand, msg def mailfrm(self, emf): cstr = "<%s>"% emf (hand, msg) = self.pr("MAIL FROM:", cstr) return hand, msg def rcptto(self,hname): cstr = "<%s>"% hname (hand, msg) = self.pr("rcpt to:", cstr) return hand, msg def cls(self): self.msock.close() rcpt_handlers = { "250":" \n#------------------------------------------# \n\tE-mail Exists\n#------------------------------------------# \n", "251":" User not local; will forward to <forward-path>", "550":" \n#------------------------------------------# \n\tNo Such Address\n#------------------------------------------# \n", "551":" User not local; please try <forward-path>", "552":" Requested mail action aborted: exceeded storage allocation", "553":" Requested action not taken: mailbox name not allowed", "450":" Requested mail action not taken: mailbox unavailable", "451":" Requested action aborted: local error in processing", "452":" Requested action not taken: insufficient system storage", "500":" Syntax error, command unrecognised", "501":" Syntax error in parameters or arguments", "503":" Bad sequence of commands", "521":" <domain> does not accept mail [rfc1846]", "socket Error":" Socket Error: Connection closed.", "421":" <domain> Service not available, closing transmission channel" } em = re.compile(r"(?:^|\s)[-a-z0-9_.]+@(?:[-a-z0-9]+\.)+[a-z]{2,6}(?:\s|$)",r e.IGNORECASE) while True: hname = prompt("E-Mail Address(or XX to quit): ") if hname == "XX": break if em.match(hname) == None: print "Email incorrect format" else: s = smtsock() servers = mailxch(hname.split("@")[1]) print servers i = 0 for i in range(len(servers)): print "Trying mailserver: %s"% servers[i][1] (reply, msg)= s.conn(servers[i][1]) if reply != '220': break (reply, msg) = s.helo(myserver) if reply != '250': break (reply, msg) = s.mailfrm(mymail) if reply != '250': break (reply, msg) = s.rcptto(hname) print rcpt_handlers.get(reply) if reply == '250': break s.cls()
_______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor