如何用Python获取163邮箱邮件信息?

摘要:此案例是是获取的一个亚马逊的验证码 import time from imaplib import IMAP4_SSL import imaplib,email,datetime from lxml import etree from da
此案例是是获取的一个亚马逊的验证码 import time from imaplib import IMAP4_SSL import imaplib,email,datetime from lxml import etree from dateutil.parser import parse def str_to_unicode(s, encoding=None): return str(s, encoding) if encoding else str(s) def get_xpath(xpath, content): # xpath 工具 out = [] tree = etree.HTML(content) results = tree.xpath(xpath) for result in results: if 'ElementStringResult' in str(type(result)) or 'ElementUnicodeResult' in str(type(result)): out.append(result) else: out.append(etree.tostring(result)) return out def send_mail(now_time): max_retries = 5 # 最大重试次数 retry_delay = 2 # 每次重试的间隔时间(秒) while True: status = 0 sender = 'XXX' # 邮箱 password = 'XXX' # 开启163邮箱的IMAP,获取授权码 # 尝试连接 IMAP 服务器 for attempt in range(max_retries): try: email_server = IMAP4_SSL(host='imap.163.com') break except Exception as e: if attempt < max_retries - 1: print(f"连接失败,正在重试... (尝试 {attempt + 1}/{max_retries})") time.sleep(retry_delay) else: print("连接失败,已达到最大重试次数。") return None email_server.login(user=sender, password=password) imaplib.Commands["ID"] = ('AUTH',) args = ("name", sender, "contact", sender, "version", "1.0.0", "vendor", "myclient") email_server._simple_command("ID", str(args).replace(",", "").replace("\'", "\"")) email_server.select('INBOX', readonly=True) emaillist = email_server.search(None, 'UnSeen') emailist = emaillist[1][0].split() for unseen in reversed(emailist): status, emaildata = email_server.fetch(unseen, '(RFC822)') messages = email.message_from_string(emaildata[0][1].decode('utf-8')) date = datetime.datetime.strftime(parse(messages['Date']) + datetime.timedelta(hours=8), '%Y-%m-%d %H:%M:%S') print(date, now_time) if date >= now_time: status = 1 pass else: time.sleep(3) print('暂未收到验证码!等待3秒后重试') email_server.close() email_server.logout() break message_subject = email.header.decode_header(messages["Subject"]) subject = str_to_unicode(message_subject[0][0], message_subject[0][1]) if 'amazon.com' in subject or 'Account data access attempt' in subject: for data in messages.walk(): if data.get_content_type() == 'text/html': charset = data.get_content_charset() data = data.get_payload(decode=True).decode(charset) code = str( get_xpath('/html/body/table/tbody/tr/td/table/tbody/tr[6]/td/p/text()', data)[0]).strip() email_server.close() email_server.logout() print(code) return code else: continue if status == 1: break time.sleep(3) if __name__ == '__main__': now_time = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S') code = send_mail(now_time) print(code) now_time = datetime.datetime.strftime(datetime.datetime.now(), '%Y-%m-%d %H:%M:%S') code = send_mail(now_time)