python通过zmail备份腾讯企业邮件

'''
备份你邮箱中的全部邮件
    支持断点续传
    支持重命名
    保存原始信息,不加任何额外信息
'''
import os, re
import zmail


def get_walk(backup_path_walkfile):
    '''
    是否存在备份的步骤记录文件,如果存在则读取其中的步数,如果不存在则返回1。
    :param path_file: 备份步数记录文件
    :return:
    '''
    if os.path.exists(backup_path_walkfile):
        with open(backup_path_walkfile, mode='r') as f:
            walk_num = int(f.read())
        return walk_num
    return 1


def save_walk(backup_path_walkfile, walk_num):
    '''
    将当前步数保存到备份步数记录文件中
    :param path_file: 备份步数记录文件
    :param _walk: 步数
    :return:
    '''
    with open(backup_path_walkfile, mode='w') as f:
        f.write(str(walk_num))


def bak_email(account, passwd, backup_path):
    '''
    备份邮箱功能
    :param account: 邮箱账号
    :param passwd: 邮箱密码
    :param backup_path: 保存路径必须带r 如 r'd:\back'
    :return:
    '''
    # 1.连接到邮件服务器并获取邮件信息
    server = zmail.server(account, passwd, smtp_host='smtp.exmail.qq.com', pop_host='pop.exmail.qq.com')
    ##验证smtp、pop功能是否正常
    # if server.smtp_able():
        print('smtp 正常')
    # if server.pop_able():
        print('pop 正常')
    # (mail_count邮件的数量, mail_size邮箱的大小)
    mail_count, mail_size = server.stat()
    # print(mail_size,mail_count)
    # 3.备份目录&相关设置
    backup_dir = os.path.join(backup_path, f'{account}_bak')
    os.makedirs(backup_dir, exist_ok=True)  # 递归创建
    os.chdir(backup_dir)  # 作为根目录输出
    # print(os.getcwd())      # d:\back\XXXX@XXXX_bak
    persist_walk = True  # 用于确定是否要记录备份步数。
    walk_steps = 10  # 定义了每次备份的邮件数量。
    backup_path_walkfile = os.path.join(backup_dir, 'walk.txt')  # 存储了备份步数的记录文件。
    # 如果 persist_walk 为真(即 True),则将 get_walk() 的返回值赋给 walk;否则,将值 1 赋给 walk。
    walk = get_walk(backup_path_walkfile) if persist_walk else 1
    # 步数 walk 还没有达到或超过邮件总数 mail_count,循环就会继续执行
    while walk <= mail_count:
        mails = server.get_mails(start_index=walk, end_index=walk + walk_steps)
        for mail in mails:
            # print(zmail.show(mail))
            # # 移除文件名中不允许的字符
            emailname_subject = re.sub(r'[\\/*?:"<>|]', '', str(mail['subject']).strip())
            emailname_date = re.sub(r'[\\/*?:"<>|]', '', str(mail['date']).strip())
            emailname = emailname_subject + emailname_date + '.eml'
            # print(emailname)
            zmail.save(mail
                       , name=emailname
                       , target_path=backup_dir
                       , overwrite=True
                       )
            print(f"{emailname} 第{walk}/{mail_count}封邮件")
            walk += 1
            if persist_walk:
                save_walk(backup_path_walkfile, walk)

# bak_email('XXXX@XXXX.cn', 'XXXXXXXXXXXX', r'd:\back')
THE END
分享
二维码
打赏
海报
python通过zmail备份腾讯企业邮件
''' 备份你邮箱中的全部邮件 支持断点续传 支持重命名 保存原始信息,不加任何额外信息 ''' import os, re import zmail def get_wal……
<<上一篇
下一篇>>