zoukankan      html  css  js  c++  java
  • 利用Python批量下载邮件附件

    转自:https://www.cnblogs.com/chouxianyu/p/11270101.html

    python批量下载邮件附件

     

    背景

    由于同学每周要通过邮箱收数学建模作业,100多人给她发附件,她要一个个地点着下载。

    太麻烦了,所以想用程序实现下载附件的功能。

    在网上查资料后,最终实现了稍为简单的下载附件功能,代码有些细节还不是很了解。

    2019.4.16更新

    过几天我也要用邮箱收文件,有了这份代码刚好能用!这再次印证知识不会没用处的,不学才会觉得知识没用呢。

    2021.01.28更新

    我又写了一份新的更详细、简洁的代码:python批量处理邮件:poplib和email快速上手教程

    2021.01.29更新

    和评论中的一样,我也遇到了同样的问题:在163邮箱开启POP3服务后,在登录时仍然遇到poplib.error_proto: b'-ERR login fail'的报错,解决方法为使用开启POP3服务时拿到的授权码作为密码登录。

    代码

    import poplib
    import email
    import time
    from email.parser import Parser
    from email.header import decode_header
    
    
    def decode_str(s):#字符编码转换
        value, charset = decode_header(s)[0]
        if charset:
            value = value.decode(charset)
        return value
    
    
    def get_att(msg):
        attachment_files = []
    
        for part in msg.walk():
            file_name = part.get_filename()  # 获取附件名称类型
            contType = part.get_content_type()
    
            if file_name:
                h = email.header.Header(file_name)
                dh = email.header.decode_header(h)  # 对附件名称进行解码
                filename = dh[0][0]
                if dh[0][1]:
                    filename = decode_str(str(filename, dh[0][1]))  # 将附件名称可读化
                    print(filename)
                    # filename = filename.encode("utf-8")
                data = part.get_payload(decode=True)  # 下载附件
                att_file = open('D:\\数模作业\\' + filename, 'wb')  # 在指定目录下创建文件,注意二进制文件需要用wb模式打开
                attachment_files.append(filename)
                att_file.write(data)  # 保存附件
                att_file.close()
        return attachment_files
    
    
    
    with open('D:\\config.txt', 'r') as f1:
        config = f1.readlines()
    for i in range(0, len(config)):
        config[i] = config[i].rstrip('\n')
    
    # print(config)
    
    # POP3服务器、用户名、密码
    host = config[0]  # pop.163.com
    username = config[1]  # 用户名 
    password = config[2]  # 密码
    
    # 连接到POP3服务器
    server = poplib.POP3(host)
    
    # 身份验证
    server.user(username)
    server.pass_(password) # 参数是你的邮箱密码,如果出现poplib.error_proto: b'-ERR login fail',就用开启POP3服务时拿到的授权码
    
    # stat()返回邮件数量和占用空间:
    # print('Messages: %s. Size: %s' % server.stat())
    
    # 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]
    resp, mails, octets = server.list()
    # print(mails)
    
    # 倒序遍历邮件
    index = len(mails)
    for i in range(index, 0, -1):
        # lines存储了邮件的原始文本的每一行
        resp, lines, octets = server.retr(i)
    
        # 邮件的原始文本:
        msg_content = b'\r\n'.join(lines).decode('utf-8')
    
        # 解析邮件:
        msg = Parser().parsestr(msg_content)
    
        # 获取附件
        f_list = get_att(msg)
    
    print("文件已下载完成,10秒后关闭程序!")
    time.sleep(10)
    

    打包

    使用pyinstaller,将该.py文件打包成.exe文件。

    pyinstaller -F xuer.py
    

    这样她就不需要安装python,方便她使用。

    为了保护她的密码隐私,程序通过她自己的文件获得她的用户名和密码,之后文件会自动下载到D盘中数学建模文件夹下。

    作者:@臭咸鱼

    本文为作者原创,转载请注明出处:https://chouxianyu.github.io

  • 相关阅读:
    es5预览本地文件、es6练习代码演示案例
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 838 推多米诺(暴力模拟)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 837 新21点(DP)
    Java实现 LeetCode 836 矩形重叠(暴力)
    Subversion under Linux [Reprint]
    Subversion how[Reprint]
  • 原文地址:https://www.cnblogs.com/onelikeone/p/15624856.html
Copyright © 2011-2022 走看看