def get_message_iterator(pop3_connection: POP3_SSL, username: str) -> Iterator[Tuple[EmailMessageDto, Callable]]: mails: list _, mails, _ = pop3_connection.list() mailbox_config, _ = MailboxConfig.objects.get_or_create(username=username) # Check only the last 500 emails # Since we don't delete emails from these mailboxes the total number can be very high over a perio # and increases the processing time. # The mails is a list of message number and size - message number is an increasing value so the # latest emails will always be at the end. mail_message_ids = [get_message_id(pop3_connection, m.decode(settings.DEFAULT_ENCODING)) for m in mails[-500:]] # these are mailbox message ids we've seen before read_messages = get_read_messages(mailbox_config) logging.info(f"Number of messages READ/UNPROCESSABLE in {mailbox_config.username} are {len(read_messages)}") for message_id, message_num in mail_message_ids: # only return messages we haven't seen before if message_id is not None and message_id not in read_messages: read_status, _ = MailReadStatus.objects.get_or_create( message_id=message_id, message_num=message_num, mailbox=mailbox_config ) def mark_status(status): """ :param status: A choice from `MailReadStatuses.choices` """ logging.info( f"Marking message_id {message_id} with message_num {message_num} from {read_status.mailbox.username} as {status}" ) read_status.status = status read_status.save() try: m = pop3_connection.retr(message_num) logging.info( f"Retrieved message_id {message_id} with message_num {message_num} from {read_status.mailbox.username}" ) except error_proto as err: logging.error( f"Unable to RETR message num {message_num} with Message-ID {message_id} in {mailbox_config}: {err}", exc_info=True, ) continue try: mail_message = to_mail_message_dto(m) except ValueError as ve: logging.error( f"Unable to convert message num {message_id} with Message-Id {message_id} to DTO in {mailbox_config}: {ve}", exc_info=True, ) mark_status(MailReadStatuses.UNPROCESSABLE) continue yield mail_message, mark_status
def read_last_message(pop3_connection: POP3_SSL) -> EmailMessageDto: _, mails, _ = pop3_connection.list() message_id, message_num = get_message_id(pop3_connection, mails[-1]) try: message = pop3_connection.retr(message_num) except error_proto as err: raise Exception(f"Unable to RETR message num {message_num} with Message-ID {message_id}",) from err return to_mail_message_dto(message)
def connect_to_mailbox(): if __debug__ and socket.gethostname() == 'JEREMCLA-LUBUNTU': mailbox = POP3_SSL("lpul-pop.ad.selinc.com") mailbox.user("emailbot") mailbox.pass_("C0llectit!") else: mailbox = POP3_SSL("my.inbox.com") mailbox.user("emailbot") mailbox.pass_("dvJ-uCphEc") return mailbox
def check(self, account): ssl = account.get_property("ssl", "false") default_port = 995 if ssl else 110 port = self.get_port_or_default(account, default_port) if ssl: pop = POP3_SSL(self.get_hostname(account), port) else: pop = POP3(self.get_hostname(account), port, 7.0) try : username = self.get_username(account) for i in range(0, 3): password = self.get_password(account, default_port, i > 0) if password == None or password == "": raise Exception(_("Authentication cancelled")) try : pop.user(username) pop.pass_(password) self.save_password(account, password, default_port) return pop.stat() except Exception as e: logger.debug("Error while checking", exc_info = e) try : pop.apop(username, password) self.save_password(account, password, default_port) return pop.stat() except Exception as e2: logger.debug("Error while checking", exc_info = e2) finally : pop.quit() return (0, 0)
def pop3(host, user, password): tests = [POP3(host), POP3_SSL(host)] for test in tests: test.set_debuglevel(1) test.user(user) test.pass_(password) test.quit()
def update_attachments_from_email(self, str_email_subject, str_email_tgtdate, dirpath_output_attachment, date_in_fn): # 下载指定邮件中的所有附件到指定文件夹中(文件名、格式均不变),如果文件夹不存在,则新建文件夹 # 从邮件中下载数据 addr_pop3_server = 'pop.exmail.qq.com' server_pop3 = POP3_SSL(addr_pop3_server, 995) server_pop3.user(self.email_from_addr) server_pop3.pass_(self.email_pwd) resp, mails, octets = server_pop3.list() index = len(mails) # 若有30封邮件,第30封邮件为最新的邮件 mark_tgtmail_exist = 0 for i in range(index, 0, -1): # 倒叙遍历邮件 resp, lines, octets = server_pop3.retr(i) msg_content = b'\r\n'.join(lines).decode('utf-8') msg = Parser().parsestr(msg_content) subject = self.decode_str(msg.get('Subject')).strip() str_date_in_msg = self.decode_str(msg.get('date')).strip() list_str_date_in_msg_split = str_date_in_msg.split() str_date_in_msg = ' '.join(list_str_date_in_msg_split[:4]) try: dt_email_recvdate = datetime.strptime(str_date_in_msg, '%a, %d %b %Y') except ValueError: dt_email_recvdate = datetime.strptime(str_date_in_msg.split()[0], '%Y-%m-%d') str_email_recvdate = dt_email_recvdate.strftime('%Y%m%d') if subject == str_email_subject and str_email_recvdate == str_email_tgtdate: self.get_attachment(msg, dirpath_output_attachment, date_in_fn) mark_tgtmail_exist = 1 break if not mark_tgtmail_exist: print(f'Warning: {str_email_subject} not found.') server_pop3.quit() print('The attachment from email download finished.')
def getEmail(self): try: pop_server = POP3_SSL(host=self.pop_host, port=self.pop_port) pop_server.user(self.mail_user) pop_server.pass_(self.mail_pass) resp, items, octets = pop_server.list() self.dbg("Trovate " + str(len(items)) + " emails") for i in items: id, size = i.split(' ') resp, text, octets = pop_server.retr(id) raw_text = "\n".join(text) mail = email.message_from_string(raw_text) rto = mail['Return-Path'] if (self.valuableEmail(mail)): # check the existence of the email digest = hashlib.sha256(raw_text).hexdigest() already_processed = self.mdb.isMailProcessed(digest) if (already_processed == False): self.mdb.addProcessedMail(digest) for part in mail.walk(): if (part.get_content_type() == 'text/csv'): name = part.get_filename() cod, ext = name.split('.') data = part.get_payload(decode=True) csv_file = StringIO.StringIO(data) t = (rto, cod, csv_file) self.appendMail(mail['Subject'], t) if (self.delFlag == True): pop_server.dele(id) pop_server.quit() except Exception as e: print "FAILED :" + str(e) exit(1)
def recevie_mail(): try: # 实例化pop服务器 recevie_server = POP3_SSL( pop_server) # 开启SSL认证的邮箱服务器使用 POP3_SSL, 未开启的使用POP3 recevie_server.set_debuglevel(1) recevie_server.user(user) # user 向服务器传递用户名,同pass_ 方法一样,通过则会导致状态转变 recevie_server.pass_( password) # 通过认证,会返回“+OK ready”, 未通过会引发 poplib.error_proto异常 # recevie_server.stat() # 请求服务器返回关于邮箱的统计资料,二元元祖(邮件总数,总字节数) # recevie_server.list() # 返回邮件信息,三元元组,(返回状态,消息列表,消息的大小),消息列表是二元元组组成的列表(邮件索引,邮件字节数),如果指定参数,会返回指定邮件的信息 # recevie_server.dele(num) # 将指定邮件标记为删除,quit()函数执行时真正删除 # recevie_server.rset() # 重置所有标记为删除的邮件,用于撤销dele命令 # 获取最后一封邮件 # 调用retr函数收取指定的邮件, 返回一个三元元组,(服务器响应,消息的所有行,消息的字节数),该邮件设置为已读 rsp, msg, siz = recevie_server.retr(recevie_server.stat()[0]) sep = msg.index(b'') # RFC 2822 要求消息头和正文之间需要用空行隔开,所以遇到空行,说明后面的是正文 print("rsp: ", rsp) # 服务器返回信息“b'+OK'” print("siz: ", siz) # 消息的字节数 recevie_body = msg[sep + 1:] print(recevie_body) except Exception as err: print(err) finally: recevie_server.quit() # 退出
def connect(self): if self.source_id and self.source_id.id: self.ensure_one() if self.source_id.type == 'imap': if self.source_id.is_ssl: connection = IMAP4_SSL(self.source_id.server, int(self.source_id.port)) else: connection = IMAP4(self.source_id.server, int(self.source_id.port)) connection.login(self.user, self.password) elif self.type == 'pop': if self.source_id.is_ssl: connection = POP3_SSL(self.source_id.server, int(self.source_id.port)) else: connection = POP3(self.source_id.server, int(self.source_id.port)) # TODO: use this to remove only unread messages # connection.user("recent:"+server.user) connection.user(self.user) connection.pass_(self.password) # Add timeout on socket connection.sock.settimeout(MAIL_TIMEOUT) return connection return super(vieterp_fetchmail_server, self).connect()
def _receive_from_ca(self): # pop_host = "pop.gmail.com" # pop_port = 995 # pop_user = "******" # pop_password = "******" pop_host = "pop.gmail.com" pop_port = 995 pop_user = "******" pop_password = "******" signed = {} timeout = time.time() + 60 * 5 pop = None while not signed.has_key(self.e_invoice_file_name): try: pop = POP3_SSL(pop_host, pop_port) pop.user(pop_user) pop.pass_(pop_password) pop.sock.settimeout(MAIL_TIMEOUT) messages = [ pop.retr(i) for i in range(1, len(pop.list()[1]) + 1) ] messages = ["\n".join(mssg[1]) for mssg in messages] messages = [ email.message_from_string(mssg) for mssg in messages ] for message in messages: for part in message.walk(): if part.get_content_maintype() == 'multipart': continue if part.get('Content-Disposition') is None: print("no content dispo") continue filename = part.get_filename() file_data = part.get_payload(decode=1) signed[filename] = file_data except Exception as e: msg = _( "General failure when trying to fetch mail from %s server\n%s: %s" ) % (pop_host, e.__class__.__name__, unicode(e)) _logger.warning(msg) raise UserError(_("Mail Fetch Failed") + msg) finally: if pop is not None: pop.quit() if time.time() > timeout: break time.sleep(5) if not signed.has_key(self.e_invoice_file_name): raise UserError( _("Timeout receiving signed xml for ") + self.e_invoice_file_name) self._process_signed_xml(signed)
def connect(self): if self.pop3_ssl: self.conn = POP3_SSL(self.pop3_host, int(self.pop3_port)) else: self.conn = POP3(self.pop3_host, int(self.pop3_port)) #TODO: use this to remove only unread messages #conn.user("recent:"+server.user) self.conn.user(self.pop3_user) self.conn.pass_(self.pop3_pass) return self.conn
def pop3s(exit): try: p = POP3_SSL(args.hostname) p.user(p_file.get('e_user')) p.pass_(p_file.get('e_pass')) p.quit() print(f'OK: POP3s login successful') return OK except: print(f'WARNING: POP3s service was not authorized') return CRITICAL
def read_last_three_emails(pop3connection: POP3_SSL) -> list: _, mails, _ = pop3connection.list() reversed_mails = list(reversed(mails)) last_three_mails = reversed_mails[:3] message_ids = [get_message_id(pop3connection, line.decode(settings.DEFAULT_ENCODING)) for line in last_three_mails] emails = [] for message_id, message_num in message_ids: try: emails.append(pop3connection.retr(message_num)) except error_proto as err: raise Exception(f"Unable to RETR message num {message_num} with Message-ID {message_id}",) from err email_message_dtos = [] for email in emails: email_message_dtos.append(to_mail_message_dto(email)) return email_message_dtos
def receive(self, index=None): # Body to be returned body = "NO" # Login the admin email server = POP3_SSL('pop.gmail.com') server.user(self.__admin_addr) server.pass_(self.__pass) # Get the latest mail if index is None: latest_mail_index = server.stat()[0] else: latest_mail_index = index #print latest_mail_index latest_mail = server.retr(latest_mail_index)[1] text = join(latest_mail, '\n') # Make email content a string messages = message_from_string(text) # Make text string a Message object #server.quit() # Quit the server # Vertify email addresses from senders if self.to_addr_caroline in messages['From'] or self.to_addr_junli in messages['From'] or self.to_addr_louise in messages['From']: # If messages object is multipart if messages.is_multipart(): for payload in messages.get_payload(): body = payload.get_payload() #print 'multipart' #print body else: # If not a multipart for msg in messages.walk(): if msg.get_content_type(): # if everyting is fine # the body is the pin from emails body = msg.get_payload(decode=True) #print 'Not multipart' #print body body = str(body).strip() re = compile('[0-9]{4}?') if re.match(body): return body else: return 'NO' # Format the body # the email body should be something like # <div xx="xx">...body content...</div> # Format the body content to get the content """re = compile('(<div[\s]{0,1}[^>]*>)([0-9]{4}?)(</div>)') obj = re.match(body) if obj is not None: return obj.group(2) else: return "NO" """ """
def test_pop(username, host, password, msg_id): print("\n POP3 testing") connector = POP3_SSL(host) try: connector.user(username) connector.pass_(password) print("OK - POP3 connectivity (port 995)") except: print("FAILED - Couldn't connect to server") if len(connector.list()[1]) > 0: print("OK - INBOX not empty") else: print("--- - No messages in INBOX")
def pop_recv_mail(self): pop = random.choice(self.pop) print 'POP', pop, self.recipient if self.pop_ssl: pop = POP3_SSL(pop, self.pop_port) else: pop = MyPOP3(pop, self.pop_port) if self.pop_start_tls: pop.starttls() result = pop.user(self.recipient[0]) if not result.startswith('+OK'): raise Exception('POP user login failed: ' + str(result)) result = pop.pass_(self.recipient[1]) if not result.startswith('+OK'): raise Exception('POP pass login failed: ' + str(result)) result = pop.list() if not result[0].startswith('+OK'): raise Exception('POP list failed: ' + str(result)) for msg_nro in result[1]: msg_nro = msg_nro.split()[0] msg = pop.retr(msg_nro) if not result[0].startswith('+OK'): raise Exception('POP retr failed: ' + str(result)) msg = '\r\n'.join(msg[1]) msg = email.message_from_string(msg) if msg['subject'] in self.pop_subjects: self.pop_subjects.remove(msg['subject']) self.received += 1 self.pop_recvd += 1 #XXX: report this. It's a bug of poplib. It should close the #socket in object destruction. pop.quit() if len(self.subjects) == 0: return True return False
def button_confirm_login(self, cr, uid, ids, context=None): if context is None: context = {} for server in self.browse(cr, uid, ids, context=context): logger.notifyChannel( 'imap', netsvc.LOG_INFO, 'fetchmail start checking for new emails on %s' % (server.name)) context.update({ 'server_id': server.id, 'server_type': server.type }) try: if server.type == 'imap': imap_server = None if server.is_ssl: imap_server = IMAP4_SSL(server.server, int(server.port)) else: imap_server = IMAP4(server.server, int(server.port)) imap_server.login(server.user, server.password) ret_server = imap_server elif server.type == 'pop': pop_server = None logger.notifyChannel('imap', netsvc.LOG_INFO, 'pop %s' % (int(server.port))) if server.is_ssl: pop_server = POP3_SSL(server.server, int(server.port)) else: pop_server = POP3(server.server, int(server.port)) #TODO: use this to remove only unread messages #pop_server.user("recent:"+server.user) pop_server.user(server.user) pop_server.pass_(server.password) ret_server = pop_server self.write(cr, uid, [server.id], {'state': 'done'}) if context.get('get_server', False): return ret_server except Exception, e: logger.notifyChannel(server.type, netsvc.LOG_WARNING, '%s' % (e))
def connect(self, cr, uid, server_id, context=None): if isinstance(server_id, (list, tuple)): server_id = server_id[0] server = self.browse(cr, uid, server_id, context) if server.type == 'imap': if server.is_ssl: connection = IMAP4_SSL(server.server, int(server.port)) else: connection = IMAP4(server.server, int(server.port)) connection.login(server.user, server.password) elif server.type == 'pop': if server.is_ssl: connection = POP3_SSL(server.server, int(server.port)) else: connection = POP3(server.server, int(server.port)) #TODO: use this to remove only unread messages #connection.user("recent:"+server.user) connection.user(server.user) connection.pass_(server.password) return connection
def connect(self): self.ensure_one() if self.server_type == 'imap': if self.is_ssl: connection = IMAP4_SSL(self.server, int(self.port)) else: connection = IMAP4(self.server, int(self.port)) self._imap_login(connection) elif self.server_type == 'pop': if self.is_ssl: connection = POP3_SSL(self.server, int(self.port)) else: connection = POP3(self.server, int(self.port)) #TODO: use this to remove only unread messages #connection.user("recent:"+server.user) connection.user(self.user) connection.pass_(self.password) # Add timeout on socket connection.sock.settimeout(MAIL_TIMEOUT) return connection
def connect(self): """ Fonction de connexion au serveur de mail """ if self.type == 'imap': if self.is_ssl: connection = IMAP4_SSL(self.server, int(self.port)) else: connection = IMAP4(self.server, int(self.port)) connection.login(self.user, self.password) elif self.type == 'pop': if self.is_ssl: connection = POP3_SSL(self.server, int(self.port)) else: connection = POP3(self.server, int(self.port)) #TODO: use this to remove only unread messages #connection.user("recent:"+server.user) connection.user(self.user) connection.pass_(self.password) # Add timeout on socket connection.sock.settimeout(MAIL_TIMEOUT) return connection
def check(self, creds): proto, domain, user, password = creds if proto == 'imap': with IMAP4_SSL(domain) as M: try: M.login(user, password) ok, status = M.status('INBOX', '(MESSAGES UNSEEN)') if ok != 'OK': return None return int(status[0].strip().decode('utf-8').split( None, 1)[1][1:-1].split(None)[3]) except: return None elif proto == 'pop3': with POP3_SSL(domain) as M: try: M.user(user) M._pass(password) count, _ = M.stat() return count except: return None return None
def login(login_info=None, test=False, method='pop3'): try: if login_info is None: login_info = ask() mailserver = re.search(r'@(.*?)\.com', login_info['account'], flags=re.IGNORECASE).group(1) if mailserver == '163': login_info['pop_host'] = 'pop.163.com' login_info['smtp_host'] = 'smtp.163.com' login_info['port'] = 25 else: print('unknown mail server: {}'.format(mailserver)) quit() if test: login_info = { 'pop_host': 'pop.163.com', 'smtp_host': 'smtp.163.com', 'port': 25, 'account': '*****@*****.**', 'password': '******' } if method == 'pop3': mail_link = POP3_SSL(login_info['pop_host']) elif method == 'smtp': mail_link = SMTP_SSL(login_info['pop_host']) elif method == 'imap': mail_link == IMAP4_SSL(login_info['pop_host']) mail_link.set_debuglevel(0) mail_link.user(login_info['account']) mail_link.pass_(login_info['password']) # print(mail_link.list()) print('Login successfully!') return mail_link except Exception as e: print('Login fails!' + str(e)) quit()
def get_pop3_mail(self, stop_function=lambda: False, timeout=10): criteria = 'Important subject' # Effective payload is placed from min_line = 18 # to max_line = 24 # in message body. while True: if stop_function(): yield None try: self.pop3_server = POP3_SSL(self.pop3_ssl_host, self.pop3_ssl_port) self.pop3_server.user(self.pop3_username) self.pop3_server.pass_(self.pop3_password) stat = self.pop3_server.stat() for i in range(stat[0]): msgnum = i + 1 # Retrieve headers response, lines, bytes = self.pop3_server.top(msgnum, 10) one_line = ' '.join(lines) if one_line.find(criteria) != -1: (server_msg, body, octets) = \ self.pop3_server.retr(msgnum) text = '\n'.join(body[min_line:max_line]) self.pop3_server.dele(msgnum) yield text self.pop3_server.quit() self.pop3_server = None if stat[0] == 0: time.sleep(timeout) except Exception as err: print(err)
# -*- coding: utf-8 -*- # filename: utf-8 from poplib import POP3_SSL client = POP3_SSL("pop.qq.com") # 填写自己的账号 client.user("*****@*****.**") # 对于 qq 邮箱而言,在第三方客户端登陆时,都需填写授权码,此处更换为自己的授权码,不要填写密码 client.pass_("shiyanlou") all_num, all_sz = client.stat() print "总的邮件数量为:", all_num print "总邮件字节数为:", all_sz print client.list() # 获取编号号为 2 的邮件,如果你的 qq 邮箱中的邮件为空,此处会出错 msg_2 = client.retr(2) # 打印邮件 print "this is a email: \r\n" for i in msg_2[1]: print i # 退出 print "\r\n", client.quit()
if not line: return default # SMTP/SSL print('*** Doing SMTP send via SSL...') if SMTP_SSL: try: s = SMTP_SSL('smtp.mail.yahoo.com', 465) s.login(MAILBOX, PASSWD) s.sendmail(from_, to, msg) s.quit() print(' SSL mail sent!') except SMTPServerDisconnected: print(' error: server unexpectedly disconnected...try again') else: print(' error: SMTP_SSL requires 2.6.3+') # POP print('***Doing POP recv...') try: s = POP3_SSL('pop.mail.yahoo.com', 995) s.user(MAILBOX) s.pass_(PASSWD) rv, msg, sz = s.retr(s.stat()[0]) s.quit() line = getSubject(msg) print(' Received msg via POP: %r' % line) except error_proto: print(' error: POP for Yahoo!Mail Plus subscribers only')
recvSvr.login(who, PASSWD) except imaplib.error as e: print(str(e)[2:-1]) # This may be a stupid thing to do. exit() rsp, msgs = recvSvr.select('INBOX', True) try: rsp, data = recvSvr.fetch(msgs[0], '(RFC822)') except imaplib.error as e: print(e) exit() recvBody = data[0][1].decode('unicode_escape').split('\r\n') else: # POP stuff below. try: recvSvr = POP3_SSL(POPSVR, 995) except gaierror: print("Can't connect to %s." % POPSVR) exit() # No need of the following try-except block. # This error would be already catched in SMTP part. # It's present to signify that invalid credential error has been taken care of. try: recvSvr.user(who) recvSvr.pass_(PASSWD) except error_proto as e: print("For POP:", end=" ") print(str(e)[2:-1]) # This may be a stupid thing to do. exit() rsp, msg, siz = recvSvr.retr(recvSvr.stat()[0]) #strip headers and compare to orig msg
# SMTP/TLS print '*** Doing SMTP send via TLS...' s = SMTP('smtp.gmail.com', 587) if release < '2.6': s.ehlo() # required in older releases s.starttls() if release < '2.5': s.ehlo() # required in older releases s.login(MAILBOX, PASSWD) s.sendmail(from_, to, msg) s.quit() print ' TLS mail sent!' # POP print '*** Doing POP recv...' s = POP3_SSL('pop.gmail.com', 995) s.user(MAILBOX) s.pass_(PASSWD) rv, msg, sz = s.retr(s.stat()[0]) s.quit() line = getSubject(msg) print ' Received msg via POP: %r' % line msg = msg.replace('587/TLS', '465/SSL') # SMTP/SSL if SMTP_SSL: print '*** Doing SMTP send via SSL...' s = SMTP_SSL('smtp.gmail.com', 465) s.login(MAILBOX, PASSWD) s.sendmail(from_, to, msg)
# coding:utf-8 import datetime import time from poplib import POP3_SSL popServerAddress = "mail.163.com" emailAdress = input("请输入邮箱地址:") pwd = input("请输入密码:") lastNumber = 1 while True: #建立连接 server = POP3_SSL(popServerAddress, timeout=3) #不显示与服务器之间的交互信息 server.set_debuglevel(0) #登陆 server.user(emailAdress) server.pass_(pwd) #获取邮箱全部邮件编号 _, mails, _ = server.list() print(mails) #退出 server.quit() #获取最新邮件的ID newestNumber = int(mails[-1].split()[0]) if newestNumber != lastNumber: print('{}--您有{}封未读的邮件'.format( str(datetime.datetime.now())[:19], newestNumber - lastNumber)) lastNumber = newestNumber #一分钟后重新检查 time.sleep(60) 1
from poplib import POP3_SSL user = '******' # 使用授权码第三方登录 pass_ = 'kcpklenqgqxjebfh' # 连接到POP3服务器 p = POP3_SSL('pop.qq.com', 995) p.set_debuglevel(1) # 可选:打印POP3服务器的欢迎文字: print(p.getwelcome().decode('utf-8')) # 身份验证 p.user(user) p.pass_(pass_) # stat()返回邮件数量和占用空间: print('Messages count: %s. Size: %s' % p.stat()) # 返回 (response, ['mesg_num octets', ...], octets) resp, mails, octets = p.list() print(mails) index = len(mails) # 检索邮件 # (response, ['line', ...], octets) resp, lines, octets = p.retr(index) for eachline in lines: print(eachline) p.quit()
def receiveEmail(): r = [] #验证码未超时的数列 t = [] #验证码超时的数列 email = '*****@*****.**' password = '******' pop3_server = 'pop.qq.com' #QQ的POP3服务器地址 server = POP3_SSL(pop3_server) #连接到QQ的pop3服务器 print(server.getwelcome()) #POP3服务器的欢迎文字 #身份认证 server.user(email) server.pass_(password) print('Message: %s Size:%s' % server.stat()) #stat()返回邮件数量和每个邮件所占用的空间 resp, mails, octets = server.list() #list()返回所有邮件的编号和占用空间 # print mails if len(mails) == 0: print '邮箱为空,未收到邮件,请进入邮箱查看' else: index = len(mails) # 获取最新一封邮件, 注意索引号从1开始 for i in range(index): resp, lines, octets = server.retr(i + 1) # lines存储了邮件的原始文本的每一行, msg_content = '\r\n'.join(lines) #获得整个邮件的原始文本: GMT_FORMAT = '%a, %d %b %Y %H:%M:%S +0000 (UTC)' #GMT时间格式的字符串,有时候后面需要加 (GMT),具体看情况,如'%a, %d %b %Y %H:%M:%S +0000 (GMT)' # CST_FORMAT = '%a,%d %b %Y %H:%M:%S +0800' #有些邮件的时间是CST时间格式 # hdr,message,octet=server.retr(1) #读取第一个邮件信息,效果与上面一样 msg = Parser().parsestr(msg_content) date = msg.get("Date") subject = msg.get("subject") #邮件标题 # From = msg.get("From") # To = msg.get("To") if subject != 'SOKA FOOTBALL Verification code': print '该邮件不是SOKA FOOTBALL发送的验证码邮件,正在检查下一封....' else: # print date #邮件发送时间(返回的是GMT时间格式) transform_time = datetime.datetime.strptime( date, GMT_FORMAT) # 将GMT时间格式的字符串转换为datetime类型 now = datetime.datetime.now( ) # 获取现在的时间,类型为datetime,但是该时间的秒数会精确到小数点后6位 current_time1 = now.strftime( "%Y-%m-%d %H:%M:%S") # 将now时间转换成对应的格式,类型为str类型 current_time2 = datetime.datetime.strptime( current_time1, "%Y-%m-%d %H:%M:%S") # 将str类型的时间转换成datetime类型 differ_time1 = current_time2 - transform_time # 两个str类型的时间不能进行加减操作,所以必须先转换成datetime类型 differ_time2 = differ_time1.total_seconds( ) # 获取两个时间相差的总秒数,另外date、time和datetime类都支持与timedelta的加、减运算 differ_time3 = int(differ_time2 - 28800) # 减去8小时的与中国的时间差 content = msg.get_payload(decode=True) # 获取邮件的内容 # print type(content) # print msg # print "subject:", subject # print "From:",From # print "To:",To # print "Content:",content if differ_time3 < 7200: s = re.findall("\d+", content)[0] r.append(s) elif differ_time3 > 7200: s = re.findall("\d+", content)[0] t.append(s) return (r, t)