zoukankan      html  css  js  c++  java
  • 批量下载邮箱中指定日期范围的附件

    最近想到可以用python来批量下载邮箱中的附件,这样就不用一个一个地去下载了,于是就去网上搜了一下,小小地修改一下就能满足自己的需要了。主要参考
    这篇博客
    代码如下:

    import poplib
    import email
    import time
    from email.parser import Parser
    from email.header import decode_header
    import traceback
    import sys
    import telnetlib
     
     
    class c_step4_get_email:
        # 字符编码转换
        @staticmethod
        def decode_str(str_in):
            value, charset = decode_header(str_in)[0]
            if charset:
                value = value.decode(charset)
            return value
     
        # 解析邮件,获取附件
        @staticmethod
        def get_att(msg_in):
            # import email
            attachment_files = []
            for part in msg_in.walk():
                # 获取附件名称类型
                file_name = part.get_filename()
                if file_name:
                    h = email.header.Header(file_name)
                    # 对附件名称进行解码
                    dh = email.header.decode_header(h)
                    filename = dh[0][0]
                    if dh[0][1]:
                        # 将附件名称可读化
                        filename = c_step4_get_email.decode_str(str(filename, dh[0][1]))
                    # 下载附件
                    data = part.get_payload(decode=True)
                    # 在指定目录下创建文件,注意二进制文件需要用wb模式打开
                    att_file = open('./homework/' + filename, 'wb')
                    attachment_files.append(filename)
                    att_file.write(data)  # 保存附件
                    att_file.close()
            return attachment_files
     
        @staticmethod
        def run_ing():
            # 输入邮件地址, 口令和POP3服务器地址:
            email_user = 'xxxxxxx@163.com'
            # 此处密码是授权码,用于登录第三方邮件客户端(163邮箱需要授权码)
            password = 'xxxxxxx'
            pop3_server = 'pop.163.com'
            # 连接到POP3服务器,有些邮箱服务器需要ssl加密,可以使用poplib.POP3_SSL
            try:
                telnetlib.Telnet('pop.163.com', 995)
                server = poplib.POP3_SSL(pop3_server, 995, timeout=10)
            except:
                time.sleep(5)
                server = poplib.POP3(pop3_server, 110, timeout=10)
            # 身份认证:
            server.user(email_user)
            server.pass_(password)
            # 返回邮件数量和占用空间:
            print('Messages: %s. Size: %s' % server.stat())
            # list()返回所有邮件的编号:
            resp, mails, octets = server.list()
            # 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
            print(mails)
            index = len(mails)
            # 遍历邮件
            for i in range(1, index+1):
                resp, lines, octets = server.retr(i)
                # lines存储了邮件的原始文本的每一行,
                # 邮件的原始文本:
                msg_content = b'
    '.join(lines).decode('utf-8')
                # 解析邮件:
                msg = Parser().parsestr(msg_content)
                # 获取邮件时间,格式化收件时间
                date1 = time.strptime(msg.get("Date")[0:24], '%a, %d %b %Y %H:%M:%S')
                # 邮件时间格式转换
                date2 = time.strftime("%Y%m%d", date1)
                # 如果收件时间在20200401之后就下载附件
                if date2 > '20200401':
                    # 获取附件
                    c_step4_get_email.get_att(msg)
     
            server.quit()
     
     
    if __name__ == '__main__':
        origin = sys.stdout
        f = open('./log.txt', 'w')
        sys.stdout = f
        try:
            c_step4_get_email.run_ing()
        except Exception as e:
            s = traceback.format_exc()
            print(e)
            tra = traceback.print_exc()
        sys.stdout = origin
        f.close()
    

    运行后就可以批量下载某个日期之后的附件了。

  • 相关阅读:
    LOJ 6089 小Y的背包计数问题 —— 前缀和优化DP
    洛谷 P1969 积木大赛 —— 水题
    洛谷 P1965 转圈游戏 —— 快速幂
    洛谷 P1970 花匠 —— DP
    洛谷 P1966 火柴排队 —— 思路
    51Nod 1450 闯关游戏 —— 期望DP
    洛谷 P2312 & bzoj 3751 解方程 —— 取模
    洛谷 P1351 联合权值 —— 树形DP
    NOIP2007 树网的核
    平面最近点对(加强版)
  • 原文地址:https://www.cnblogs.com/beeblog72/p/12739010.html
Copyright © 2011-2022 走看看