You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 04:24:32