python接收邮件

1、说明

接收和发送刚好是相反的

先简历数据连接,获取到服务器上邮件的内容。再解析出相关的数据

对于文本可以直接读取内容,但html就需要做不同的处理,

2、登陆获取内容


def get_email_content():
    mail_user = '[email protected]'
    mail_pass = 'password'
    # 邮件服务器地址,以下为网易邮箱
    pop3_server = 'pop.163.com'
    # 开始连接到服务器
    server = poplib.POP3(pop3_server)
    # 打开或者关闭调试信息,为打开,会在控制台打印客户端与服务器的交互信息
    server.set_debuglevel(1)
    # 打印POP3服务器的欢迎文字,验证是否正确连接到了邮件服务器
    print(server.getwelcome().decode('utf8'))
    # 开始进行身份验证
    server.user(mail_user)
    server.pass_(mail_pass)
    # 返回邮件总数目和占用服务器的空间大小(字节数), 通过stat()方法即可
    email_num, email_size = server.stat()
    print("消息的数量: {0}, 消息的总大小: {1}".format(email_num, email_size))
    # 使用list()返回所有邮件的编号,默认为字节类型的串
    rsp, msg_list, rsp_siz = server.list()
    print("服务器的响应: {0},\n消息列表: {1},\n返回消息的大小: {2}".format(rsp, msg_list, rsp_siz))
    print('邮件总数: {}'.format(len(msg_list)))
    # 下面单纯获取最新的一封邮件
    total_mail_numbers = len(msg_list)
    print('共{}封邮件'.format(total_mail_numbers))
    all_msg = []
    for r in range(1, total_mail_numbers):
        rsp, msglines, msgsiz = server.retr(r)
        print("服务器的响应: {0},\n原始邮件内容: {1},\n该封邮件所占字节大小: {2}".format(rsp, msglines, msgsiz))
        msg_content = b'\r\n'.join(msglines).decode('utf-8')
        msg = Parser().parsestr(text=msg_content)
        # print('解码后的邮件信息:\n{}'.format(msg))
        # 关闭与服务器的连接,释放资源
        all_msg.append(msg)
    server.close()
    return all_msg

3、解析出主题、来源和内容

# 解析邮件主题
def parser_subject(msg):
    subject = msg['Subject']
    value, charset = decode_header(subject)[0]
    if charset:
        value = value.decode(charset)
    print('邮件主题: {0}'.format(value))
    return value

# 解析邮件来源
def parser_address(msg):
    hdr, addr = parseaddr(msg['From'])
    # name 发送人邮箱名称, addr 发送人邮箱地址
    name, charset = decode_header(hdr)[0]
    if charset:
        name = name.decode(charset)
    print('发送人邮箱名称: {0},发送人邮箱地址: {1}'.format(name, addr))

 # 解析邮件正文
def get_mail_content(msg):
    if msg == None:
        return None
    for part in msg.walk():
        if not part.is_multipart():
            data = part.get_payload(decode=True)
            # print("emailcontent:\r\n"+data.decode())
    return data.decode()

调用

if __name__ == '__main__':
    # 返回解码的邮件详情
    all_msg = get_email_content()
    for msg in all_msg:
        # 解析邮件主题
        parser_subject(msg)
        # 解析发件人详情
        parser_address(msg)
        # 解析内容
        content = get_mail_content(msg)
        print(content)
image-20210412115213031.png

如遇到网易服务器返回错误代码,可以参考错误原因

http://help.163.com/09/1224/17/5RAJ4LMH00753VB8.html

发送邮件可参考
https://www.jianshu.com/p/98c6720756a5

2021/04/16 于成都

你可能感兴趣的:(python接收邮件)