python POP读取邮箱内容
import poplib import re from email.parser import Parser from email.header import decode_header from email.utils import parseaddr #解析消息头中的字符串 def decode_str(s): value, charset = decode_header(s)[0] if charset: value = value.decode(charset) return value #获取邮件的字符编码,首先在message中寻找编码,如果没有,就在header的Content-Type中寻找 def guess_charset(msg): charset = msg.get_charset() if charset is None: content_type = msg.get('Content-Type', '').lower() pos = content_type.find('charset=') if pos >= 0: charset = content_type[pos+8:].strip() return charset #解析邮件的函数,首先打印收件人、发件人、标题 #然后调用message的walk循环处理邮件中的每一个子对象(包括文本、html、附件一次或多次) #邮件头属性中的filename存在则该子对象是附件,对附件名称进行编码并将附件下载到指定目录 #由于网络上传输的邮件都是编码以后的格式,需要在get_payload的时候指定decode=True来转换成可输出的编码 #如果邮件是text或者html格式,打印格式并输出转码以后的子对象内容 def print_info(msg): for part in msg.walk(): filename = part.get_filename() content_type = part.get_content_type() charset = guess_charset(part) if filename: print('有附件内容') else: # email_content_type = '' # content = '' # if content_type == 'text/plain': # email_content_type = 'text' # elif content_type == 'text/html': # email_content_type = 'html' if charset: # content = part.get_payload().decode(charset) content = part.get_payload(decode=True).decode(charset) verify_code = re.findall(r'您本次导出的验证码为:([\d]+)', content) print(verify_code) return verify_code def get_sender(msg): """ 获取发件人 :param msg: :return: """ # for header in ['From', 'To', 'Subject']: # value = msg.get(header, '') # if value: # if header == 'Subject': # value = decode_str(value) # else: # hdr, addr = parseaddr(value) # name = decode_str(addr) # value = name + ' < ' + addr + ' > ' # print(header + ':' + value) value = msg.get('From', '') hdr, addr = parseaddr(value) name = decode_str(addr) return name def run(): popserver = 'imap.yeah.net' emailuser = 邮箱号 emailpasswd = 授权码 conn = poplib.POP3_SSL(popserver) conn.user(emailuser) conn.pass_(emailpasswd) resp, mails, octets = conn.list() print(mails) index = len(mails) print(index) #取出某一个邮件的全部信息 postgre for i in range(index): resp, lines, octets = conn.retr(index) #邮件取出的信息是bytes,转换成Parser支持的str lists = [] for e in lines: lists.append(e.decode()) msg_content = '\r\n'.join(lists) msg = Parser().parsestr(msg_content) name = get_sender(msg) if name == 'xiaoshuxiong@mama.cn': print(type(msg)) verify_code = print_info(msg) if verify_code: print(verify_code) return verify_code[0] else: print("获取验证码失败") break else: continue #提交操作信息并退出 conn.quit() print(run())