MySQL执行INSERT IGNORE后如何通过Python发送唯一条目插入邮件
解决方案
一、优先选择Python处理邮件通知
直接在Python脚本里处理邮件更省心,不用折腾MySQL的邮件服务配置,还能直接拿到插入的条目数据做定制化通知。
二、如何获取成功插入的唯一条目
用INSERT IGNORE执行后,通过游标对象的rowcount属性就能判断是否插入成功:
rowcount == 1:这条是新条目,成功插入rowcount == 0:条目已存在,被忽略了
三、修改后的完整代码
import mysql.connector import sys import smtplib from email.mime.text import MIMEText from email.header import Header def send_notification_email(added_entries): # 替换成你的邮件配置 sender = '你的发件邮箱@xxx.com' receiver = '收件邮箱@xxx.com' smtp_server = 'smtp.xxx.com' # 比如smtp.qq.com、smtp.gmail.com smtp_port = 587 smtp_username = '你的发件邮箱@xxx.com' smtp_password = '邮箱授权码' # 注意不是登录密码,是邮箱的授权码 # 构建邮件内容,匹配需求格式 email_content = "" for entry in added_entries: email_content += f"此唯一条目:{entry[7]},已添加至您的表中\n" email_content += "\n---\n来自MySQL数据同步脚本" # 创建邮件对象 msg = MIMEText(email_content, 'plain', 'utf-8') msg['From'] = Header("数据同步通知", 'utf-8') msg['To'] = Header("管理员", 'utf-8') msg['Subject'] = Header("新唯一条目已添加", 'utf-8') # 发送邮件 try: with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() # 启用加密传输 server.login(smtp_username, smtp_password) server.sendmail(sender, receiver, msg.as_string()) print("通知邮件发送成功") except Exception as e: print(f"邮件发送失败:{e}") def uploadToDb(giant_vm_list): try: mydb = mysql.connector.connect( host="0.0.0.0", user="myuser", password="password", database="my_db" ) mycursor = mydb.cursor() except Exception as e: print(f"数据库连接失败:{e}") sys.exit() added_entries = [] # 存储成功插入的条目 for item in giant_vm_list: sql_query = "INSERT IGNORE INTO my_db (domain, domain_ip, datacenter_name, cluster_name, host_name, host_ip, resource_pool_name, vm_name) VALUES(%s, %s, %s, %s, %s, %s, %s, %s);" record = (item[0], item[1], item[2], item[3], item[4], item[5], item[6], item[7]) mycursor.execute(sql_query, record) mydb.commit() # 判断是否成功插入 if mycursor.rowcount == 1: added_entries.append(item) print(f"新增条目:{item[7]}") print("程序执行无错误") # 有新增条目才发邮件 if added_entries: send_notification_email(added_entries) else: print("无新条目添加,无需发送邮件") # 调用示例(替换成你的数据源) # uploadToDb(giant_vm_list)
关键说明
- 插入状态判断:每次执行
INSERT IGNORE后,用mycursor.rowcount确认是否插入成功,把成功的条目存到列表里。 - 邮件配置:需要替换成你自己的邮箱SMTP信息,注意用邮箱的授权码而不是登录密码(比如QQ邮箱需要在设置里开启SMTP并获取授权码)。
- 通知内容:代码里默认用
vm_name作为ENTRY NAME,完全匹配你要求的通知格式,若需要显示更多字段,可自行修改邮件内容的拼接逻辑。
内容的提问来源于stack exchange,提问作者Rogelio Cordova
相关产品推荐
相关产品推荐

