使用Python发送邮件附件以定时备份MySQL的教程

  • Post category:Linux

下面是使用Python发送邮件附件以定时备份MySQL的完整攻略:

步骤一:安装必要的库

在使用Python发送邮件附件以定时备份MySQL之前,我们需要安装Python的smtplib、email以及pymysql等库,可以使用pip命令安装,命令如下:

pip install smtplib
pip install email
pip install pymysql

步骤二:连接MySQL数据库并进行备份

在Python中,我们可以使用pymysql库连接MySQL数据库并进行备份,代码示例如下:

import pymysql
import os
import time

# MySQL数据库连接信息
MYSQL_HOST = 'localhost'
MYSQL_PORT = 3306
MYSQL_USER = 'root'
MYSQL_PASS = 'password'
MYSQL_DB = 'testdb'

# 备份MySQL数据库
def backup_mysql():
    # 与MySQL数据库建立连接
    conn = pymysql.Connect(host=MYSQL_HOST, port=MYSQL_PORT, user=MYSQL_USER, password=MYSQL_PASS, db=MYSQL_DB, charset='utf8')
    # 创建游标
    cursor = conn.cursor()
    # 执行SQL查询语句
    cursor.execute('show tables;')
    # 获取所有表名
    tables = cursor.fetchall()
    # 备份文件存储的目录
    backup_dir = 'backup'
    if not os.path.exists(backup_dir):
        os.makedirs(backup_dir)
    # 获取当前时间
    backup_time = time.strftime('%Y%m%d%H%M%S', time.localtime())
    # 遍历所有表
    for table in tables:
        table_name = table[0]
        # 拼接备份SQL语句
        backup_sql = f"mysqldump -h{MYSQL_HOST} -P{MYSQL_PORT} -u{MYSQL_USER} -p{MYSQL_PASS} {MYSQL_DB} {table_name} > {backup_dir}/{table_name}_{backup_time}.sql"
        # 执行备份SQL语句
        os.system(backup_sql)
    # 关闭游标和连接
    cursor.close()
    conn.close()

# 备份MySQL数据库
backup_mysql()

这段代码可以建立与MySQL数据库的连接,并备份所有表到backup文件夹下,备份的文件名格式为“表名_备份时间.sql”,比如“users_20211118125130.sql”。

步骤三:发送邮件附件

我们可以使用Python的smtplib和email库实现发送带有附件的邮件,代码示例如下:

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

# 发送邮件
def send_email():
    # 邮件基本信息
    sender = 'sender@example.com'       # 发件人邮箱
    password = 'password'               # 发件人邮箱密码
    receivers = ['receiver@example.com'] # 收件人邮箱列表
    subject = 'MySQL备份'                # 邮件主题
    content = '附件为MySQL备份文件'        # 邮件文本内容

    # 创建邮件对象
    message = MIMEMultipart()
    message['From'] = sender
    message['To'] = ','.join(receivers)
    message['Subject'] = subject

    # 添加邮件正文
    message.attach(MIMEText(content))

    # 添加邮件附件
    backup_dir = 'backup'
    files = os.listdir(backup_dir)
    for file in files:
        file_path = os.path.join(backup_dir, file)
        with open(file_path, 'rb') as f:
            attachment = MIMEApplication(f.read(), _subtype='octet-stream')
            attachment.add_header('Content-Disposition', 'attachment', filename=file)
            message.attach(attachment)

   # 发送邮件
    try:
        smtp = smtplib.SMTP('smtp.example.com')
        smtp.login(sender, password)
        smtp.sendmail(sender, receivers, message.as_string())
        smtp.quit()
        print("邮件发送成功!")
    except Exception as e:
        print("邮件发送失败:", e)

# 发送邮件
send_email()

这段代码可以实现将backup文件夹下的所有备份文件作为附件发送到指定邮箱,可以在邮件正文中添加自己想要的内容,发送成功后会在控制台上打印“邮件发送成功!”。

示例1:将备份文件每天定时发送邮件

我们可以使用Python的time库打定时器,定时发送邮件,代码示例如下:

import time

# 每天定时发送邮件
while True:
    # 获取当前时间
    now = time.strftime('%H:%M:%S')
    # 如果是定时发送时间,则备份MySQL并发送邮件
    if now == '10:00:00':
        backup_mysql()  # 备份MySQL
        send_email()    # 发送邮件
        time.sleep(86400)   # 休眠24小时
    else:
        time.sleep(1)

这段代码会在每天的10:00:00将MySQL备份并发送邮件,之后休眠24小时。

示例2:将备份文件每周定时发送邮件

我们可以使用Python的datetime库来判断今天是否为指定的周几,代码示例如下:

import datetime

# 每周三和周六定时发送邮件
while True:
    # 获取今天的星期几
    today = datetime.date.today()
    weekday = today.weekday()    # 0-6分别代表周一到周日
    # 如果是指定的周几则备份MySQL并发送邮件
    if weekday == 2 or weekday == 5:    # 周三和周六
        backup_mysql()  # 备份MySQL
        send_email()    # 发送邮件
        time.sleep(604800)  # 休眠一周
    else:
        time.sleep(1)

这段代码会在每周三和周六将MySQL备份并发送邮件,之后休眠一周。