下面是使用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备份并发送邮件,之后休眠一周。