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())