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

基于Cronjob的MySQL数据更新及同步邮件发送需求

实现每分钟执行的MySQL更新+邮件通知Cron任务

我来帮你梳理这个需求的具体实现方案,分步骤来落地:

1. 编写核心处理脚本(Python示例)

首先咱们写一个Python脚本,搞定数据库查询更新和邮件发送的逻辑。这里假设你的表有一个create_time字段(记录数据创建时间),用来判断是否达到1分钟时长;目标是把status从1更新为2,同时给对应email发通知。

先安装依赖包:

pip install mysql-connector-python python-dotenv

然后写脚本update_and_notify.py:

import mysql.connector
import smtplib
from email.mime.text import MIMEText
from dotenv import load_dotenv
import os
from datetime import datetime

# 加载环境变量(建议把敏感信息放.env文件里,不要硬编码)
load_dotenv()

def connect_db():
    """连接MySQL数据库"""
    try:
        conn = mysql.connector.connect(
            host=os.getenv('DB_HOST'),
            user=os.getenv('DB_USER'),
            password=os.getenv('DB_PASSWORD'),
            database=os.getenv('DB_NAME')
        )
        return conn
    except mysql.connector.Error as err:
        print(f"数据库连接失败: {err}")
        return None

def send_email(to_email, title):
    """发送通知邮件"""
    smtp_server = os.getenv('SMTP_SERVER')
    smtp_port = int(os.getenv('SMTP_PORT'))
    smtp_user = os.getenv('SMTP_USER')
    smtp_password = os.getenv('SMTP_PASSWORD')

    msg = MIMEText(f"您的记录【{title}】状态已更新!", 'plain', 'utf-8')
    msg['From'] = smtp_user
    msg['To'] = to_email
    msg['Subject'] = "记录状态更新通知"

    try:
        with smtplib.SMTP_SSL(smtp_server, smtp_port) as server:
            server.login(smtp_user, smtp_password)
            server.sendmail(smtp_user, to_email, msg.as_string())
        print(f"邮件已发送至 {to_email}")
    except Exception as e:
        print(f"发送邮件失败: {e}")

def main():
    conn = connect_db()
    if not conn:
        return

    cursor = conn.cursor(dictionary=True)
    try:
        # 1. 查询符合条件的记录(创建时长≥1分钟,且status为1)
        query = """
            SELECT id, title, email 
            FROM your_table_name 
            WHERE TIMESTAMPDIFF(MINUTE, create_time, NOW()) >= 1 
            AND status = 1
            FOR UPDATE; -- 加行锁,防止并发重复处理
        """
        cursor.execute(query)
        records = cursor.fetchall()

        if not records:
            print(f"{datetime.now()}: 没有符合条件的记录")
            return

        # 2. 批量更新状态 + 发送邮件
        for record in records:
            # 更新status为2
            update_query = """
                UPDATE your_table_name 
                SET status = 2 
                WHERE id = %s
            """
            cursor.execute(update_query, (record['id'],))
            conn.commit()

            # 发送邮件
            send_email(record['email'], record['title'])

        print(f"{datetime.now()}: 成功处理 {len(records)} 条记录")
    except mysql.connector.Error as err:
        conn.rollback()
        print(f"数据库操作失败: {err}")
    finally:
        cursor.close()
        conn.close()

if __name__ == "__main__":
    main()

别忘了创建.env文件存放敏感信息:

# 数据库配置
DB_HOST=localhost
DB_USER=your_db_user
DB_PASSWORD=your_db_password
DB_NAME=your_db_name

# 邮件SMTP配置(比如用QQ邮箱的话,SMTP_SERVER是smtp.qq.com,端口465)
SMTP_SERVER=smtp.your-email-provider.com
SMTP_PORT=465
SMTP_USER=your-email@example.com
SMTP_PASSWORD=your-email-auth-code # 注意是授权码不是登录密码

2. 设置Cronjob每分钟执行

接下来配置Cron,让脚本每分钟跑一次:

  1. 打开Cron编辑界面:
crontab -e
  1. 添加以下一行(替换成你的脚本路径和Python路径):
* * * * * /usr/bin/python3 /path/to/update_and_notify.py >> /var/log/cron_update_notify.log 2>&1
  • * * * * * 表示每分钟执行一次
  • /usr/bin/python3 是你的Python解释器路径(可以用which python3查看)
  • 后面的日志路径用来记录脚本运行情况,方便排查问题
  1. 保存退出后,Cron会自动加载新的任务。你可以用crontab -l查看当前的Cron任务列表。

3. 关键注意事项

  • 避免重复处理:脚本里用了FOR UPDATE加行锁,同时更新后把status改成2,这样下次查询就不会再选中这条记录,防止重复处理。
  • 异常处理:脚本里加了数据库连接、操作的异常捕获,还有邮件发送的异常处理,避免因为某一条记录失败导致整个脚本崩溃。
  • 日志监控:定期查看/var/log/cron_update_notify.log,如果有错误及时排查。
  • 资源占用:如果数据量很大,建议优化查询语句,或者限制每次处理的记录数量,避免脚本运行时间超过1分钟导致并发问题。

内容的提问来源于stack exchange,提问作者Fat-Bee

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:29:33