電子メールの取得は簡単でシンプルな手順ですが、取得されるのは電子メールの元のコンテンツであり、コンテンツの形式は通常MIMEプロトコル(Multipurpose Internet Mail Extension)に準拠しています。
メールは通常、ヘッダーと本文に分かれており、ヘッダーにはメールの基本情報が含まれ、本文にはメールの内容が含まれます。
import poplib
from email.parser import Parser
from email.header import decode_header
#连接邮箱服务器
def connect_email():
user = 'xxx' #邮箱地址
password = 'xxx' #开启服务密码,上一篇博客介绍过
pop3_server = 'pop.126.com'
#开始连接到服务器
server = poplib.POP3(pop3_server)
#打开或关闭调试信息
server.set_debuglevel(1)
#打印POP3服务器的欢迎文字
print(server.getwelcome().decode('utf-8'))
#开始进行身份验证
server.user(user=user)
server.pass_(password)
return server
#获取邮件内容
def get_email_content(server):
email_num, email_size = server.stat()
rsp, msglines, msgsize = server.retr(email_num)
msg_content = b'\r\n'.join(msglines).decode('gbk')
msg = Parser().parsestr(msg_content)
server.close()
return msg
#邮件头解析
def parser_subject(msg):
subject = msg['Subject']
value, charset = decode_header(subject)[0]
if charset:
value = value.decode(charset)
return value
def guess_charset(msg):
charset = msg.get_charset()
if not charset:
content_type = msg.get('Content-Type', '').lower()
pos = content_type.find('charset=')
if pos >= 0:
charset = content_type[pos + 8: ].strip()
return charset
#邮件体解析
def parser_content(msg, indent=0):
if msg.is_multipart():
parts = msg.get_payload()
for n, part in enumerate(parts):
print(f"{' ' * indent * 4} 第{n+1}部分")
print(f"{' ' * indent * 4} {'-'*50}")
parser_content(part, indent+1)
else:
content_type = msg.get_content_type()
if content_type == 'text/plain' or content_type == 'text/html':
content = msg.get_payload(decode=True)
charset = guess_charset(msg)
if charset:
content = content.decode(charset)
print(f"{' ' * indent * 4} 邮件内容:{content}")
else:
print(f"{' ' * indent * 4} 附件内容:{content_type}")
def main():
server = connect_email()
msg = get_email_content(server)
subject = parser_subject(msg)
print(subject)
parser_content(msg)
if __name__ == '__main__':
main()
操作の結果は次のとおりです。このメールには複数レベルのネストが含まれていないため、{n + 1部}は印刷されません。