简单备份文件并发送到指定邮箱

背景

一哥们发了个诉求,总觉得自己的服务器不安全,想搞个定时备份文件并发送到自己的邮箱

1 实现代码如下

# -*- coding: utf-8 -*-

from __future__ import absolute_import, unicode_literals

import os
import datetime
import logging
import logging.config

from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
from email.mime.application import MIMEApplication
import smtplib

name = datetime.datetime.now().strftime("%Y%m%d%H%M%S")
base_path = '/root/xxxx/temp'
zip_path = '/root/xxxx/backup/{}.tar.bz2'.format(name)


def set_logging():
    """"""

    log_dir, log_file = '/root/xxxx/logs', '/root/xxxx/logs/backup.log'

    if not os.path.exists(log_dir):
        os.mkdir(log_dir)

    if not os.path.exists(log_file):
        open(log_file, 'w')

    DEFAULT_LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'formatone': {
                'format': '[%(asctime)s] %(levelname)s : %(message)s',
            }
        },
        'handlers': {
            'file': {
                'level': 'DEBUG',
                'filename': '/root/xxxx/logs/backup.log',
                'formatter': 'formatone',
                'class': 'logging.handlers.RotatingFileHandler',
                'maxBytes': 100 * 1024 * 1024,
                'backupCount': 10,
            },
        },
        'loggers': {
            'backup': {
                'handlers': ['file'],
                'level': 'INFO',
            },
        }
    }

    logging.config.dictConfig(DEFAULT_LOGGING)


def zip_files():
    """zip files"""
    os.system('tar -cjf {} -C {} data'.format(zip_path, base_path))


def sendmail():
    """send mail"""
    set_logging()
    zip_files()

    logger = logging.getLogger('backup')

    mail_from, password = 'xxxxxxx@aliyun.com', 'xxxxxxx'
    mail_to = 'xxxxx@qq.com'
    smtp_server = 'smtp.aliyun.com'

    msgRoot = MIMEMultipart('related')
    msgRoot['Subject'] = 'send backup files {}'.format(name)
    msgRoot['From'] = '{}<{}>'.format(Header('backup', 'utf-8'), mail_from)
    msgRoot['To'] = mail_to

    msgText = MIMEText('backup files', 'plain', 'utf-8')
    msgRoot.attach(msgText)

    zip_con = MIMEApplication(open(zip_path,'rb').read())
    zip_con.add_header('Content-Disposition', 'attachment',
                       filename='{}.tar.bz2'.format(name))
    msgRoot.attach(zip_con)

    try:
        server = smtplib.SMTP_SSL(smtp_server)
        server.login(mail_from, password)
        server.sendmail(mail_from, mail_to, msgRoot.as_string())
        server.quit()
        logger.info('send {} backup files success'.format(name))
    except Exception, e:
        logger.error('send {} failed {}'.format(name, e))
        sendmail()


if __name__ == '__main__':
    sendmail()

2 简单说明

2.1 打包文件

这个实现比较初级,直接用 shell 命令进行打包

def zip_files():
    """zip files"""
    os.system('tar -cjf {} -C {} data'.format(zip_path, base_path))

2.2 发送邮件

这个就不说了,现成的模块直接拿来用

2.3 日志记录

加上日志,可以很清楚的让我知道发送情况如下,示例如下:

[2017-04-14 00:00:03,251] INFO : send 20170414000001 backup files success
[2017-04-14 03:00:02,620] INFO : send 20170414030001 backup files success
[2017-04-14 06:00:02,406] INFO : send 20170414060001 backup files success
[2017-04-14 09:00:02,349] INFO : send 20170414090001 backup files success
[2017-04-14 12:00:02,299] INFO : send 20170414120001 backup files success
[2017-04-14 15:01:04,696] ERROR : send 20170414150001 failed [Errno 110] Connection timed out
[2017-04-14 15:01:05,401] INFO : send 20170414150001 backup files success

2.4 定时处理

定时这个处理,直接使用 crontab 命令,创建个 backup_cron 文件,写入

0 */3 * * *  python /root/xxxxx/backup.py

3 简单小结

业务比较简单,实现也比较简单,没啥可说的


黑月亮
点滴记录,步步成长

现实与完美之间

1.6k 声望
24 粉丝
0 条评论
推荐阅读
centos | 修改静态 IP
设置 Centos 为使用静态 IP1 修改网络配置 {代码...} 修改后的内容如下 {代码...} 2 重启网络服务 {代码...} 3 查看地址 {代码...} 参考来源:[链接]

青阳半雪阅读 1.8k评论 3

数据结构与算法:二分查找
一、常见数据结构简单数据结构(必须理解和掌握)有序数据结构:栈、队列、链表。有序数据结构省空间(储存空间小)无序数据结构:集合、字典、散列表,无序数据结构省时间(读取时间快)复杂数据结构树、 堆图二...

白鲸鱼9阅读 5.3k

滚蛋吧,正则表达式!
你是不是也有这样的操作,比如你需要使用「电子邮箱正则表达式」,首先想到的就是直接百度上搜索一个,然后采用 CV 大法神奇地接入到你的代码中?

良许3阅读 1.5k

搭个ChatGPT算法模型,从哪开始?
最近 ChatGPT 很火,火到了各行各业。记得去年更多的还是码农最新体验后拿它搜代码,现在各行各业都进来体验,问它咋理财、怎么写报告和给小孩起名。😂 也因此让小傅哥在头条的一篇关于 ChatGPT 的文章都有了26万...

小傅哥6阅读 1.2k

封面图
程序员适合创业吗?
大家好,我是良许。从去年 12 月开始,我已经在视频号、抖音等主流视频平台上连续更新视频到现在,并得到了不错的评价。每个视频都花了很多时间精力用心制作,欢迎大家关注哦~考虑到有些小伙伴没有看过我的视频,...

良许3阅读 1.3k

Ubuntu20.04 从源代码编译安装 python3.10
Ubuntu 22.04 Release DateUbuntu 22.04 Jammy Jellyfish is scheduled for release on April 21, 2022If you’re ready to use Ubuntu 22.04 Jammy Jellyfish, you can either upgrade your current Ubuntu syste...

ponponon1阅读 4.5k评论 1

PyCharm 激活破解教程, 2023 年 2 月亲测有用
本文分享一下PyCharm 2022.2.3 版本最新激活破解教程,注意不要使用太新的版本,都是 Jetbrains 产品,本文专门配上了 Pycharm 的图片,跟着下面教程一步一步来即可。

程序员徐公阅读 8.4k评论 1

现实与完美之间

1.6k 声望
24 粉丝
宣传栏