zoukankan      html  css  js  c++  java
  • python批量处理邮件:poplib和email快速上手教程

    引言

    • poplib是一个python第三方库,基于它我们可以连接POP3服务器。

    • email是一个python内置的模块,基于它我们可以管理邮箱中的邮件。

    • Some Story

      我现在需要下载很多邮件的附件。我之前有一份相同功能的代码(点击这里),发布出来之后博客访问量也挺高。然而,当时由于时间原因我对那份代码只是一知半解,运行起来后就没具体研究。所以趁这个机会我又写了一份代码,原因有很多:一是于己我要把代码细节给搞懂,二是针对这次的需求进行修改,三是水一篇博客(bushi,这份代码十分简要并且注释十分详细)。

    快速上手代码

    import poplib
    import email
    
    
    """
        需求:消息标题、附件名称(存在header中)都是以字节为单位进行传输的,中文内容需要解码
        功能:对header进行解码
    """
    def decode(header: str):
        value, charset = email.header.decode_header(header)[0]
        if charset:
            return str(value, encoding=charset)
        else:
            return value
    
    
    """
        功能:下载某一个消息的所有附件
    """
    def download_attachment(msg):
        subject = decode(msg.get('Subject'))  # 获取消息标题
        for part in msg.walk():  # 遍历整个msg的内容
            if part.get_content_disposition() == 'attachment':
                attachment_name = decode(part.get_filename())  # 获取附件名称
                attachment_content = part.get_payload(decode=True)  # 下载附件
                attachment_file = open('./' + attachment_name, 'wb') # 在指定目录下创建文件,注意二进制文件需要用wb模式打开
                attachment_file.write(attachment_content)  # 将附件保存到本地
                attachment_file.close()
        print('Done………………', subject)
    
    
    def main():
        """连接到POP3服务器"""
        server = poplib.POP3(host='pop.163.com')  # 创建一个POP3对象,参数host是指定服务器
    
        """身份验证"""
        server.user('xxxx@163.com')  # 参数是你的邮箱地址
        server.pass_('xxxxx')  # 参数是你的邮箱密码,如果出现poplib.error_proto: b'-ERR login fail',就用开启POP3服务时拿到的授权码
    
        """获取邮箱中消息(邮件)数量"""
        msg_count, _ = server.stat()
    
        """遍历消息并保存附件"""
        for i in range(msg_count):
            """获取消息内容:POP3.retr(which)检索index为which的整个消息,并将其设为已读"""
            _, lines, _ = server.retr(
                i+1)  # 3个结果分别是响应结果(1个包含是否请求成功和该消息大小的字符串),消息内容(一个字符串列表,每个元素是消息内容的一行),消息大小(即有多少个octets,octet特指8bit的字节)
    
            """将bytes格式的消息内容拼接"""
            msg_bytes_content = b'
    '.join(lines)
    
            """将字符串格式的消息内容转换为email模块支持的格式(<class 'email.message.Message'>)"""
            msg = email.message_from_bytes(msg_bytes_content)
    
            """下载消息中的附件"""
            download_attachment(msg)
    
    
    if __name__ == "__main__":
        main()
    
    

    参考链接


    Github(github.com):@chouxianyu

    Github Pages(github.io):@臭咸鱼

    知乎(zhihu.com):@臭咸鱼

    博客园(cnblogs.com):@臭咸鱼

    B站(bilibili.com):@绝版臭咸鱼

    微信公众号:@臭咸鱼的快乐生活

    转载请注明出处,欢迎讨论和交流!


  • 相关阅读:
    弹出窗口的几种方法
    FCKeditor2.2+ASP.NET2.0不完全攻略
    如何运用 Form 表单认证 ?
    DataGrid的多种格式化显示方法
    如何显示在线人数,和所在位置?? [转自作者:子扬]
    备份和恢复Active Directory
    如何在vs.net里调试脚本 《一》
    初学ASP.Net时一些备忘的东西
    ASP.NET在线用户列表精确版——解决用户意外退出在线列表无法及时更新问题
    小技巧(一)分离字符串string str="(1,10,100,1000,10000,)";
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/14337089.html
Copyright © 2011-2022 走看看