【问题标题】:How can I receive an e-mail when my MySQL table is updated?我的 MySQL 表更新后如何接收电子邮件?
【发布时间】:2013-09-13 10:43:57
【问题描述】:

您好,我想知道 MySQL 中是否有一种方法可以在 MySQL 表中添加一行时自动向自己发送电子邮件?

【问题讨论】:

  • 我不确定 MYSQL 服务器是否有这种能力,如果有的话,我也很想知道。但是,如果您使用的是 CGI,那么您可以随时告诉它在每次插入操作后向您发送更新。
  • @hallaji,MySQL 一种服务器端语言。

标签: mysql insert sql-update


【解决方案1】:

实现这一点的最佳方法是使用触发器和 cron。创建一个“通知队列”表,并在所需表中插入一行时使用触发器填充该表。

例如。

CREATE TABLE `notification_queue` (
  `notification_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `sent` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`notification_id`)
);

然后定义一个简单的触发器:

DELIMITER $$
CREATE TRIGGER t_notification_insert 
AFTER INSERT ON [table_being_inserted]
FOR EACH ROW 
BEGIN 
    INSERT INTO `notification_queue` (`sent`) VALUES (0);
END$$
DELIMITER ;

从那时起,您需要做的就是在服务器上运行一个 crontab(比如每分钟),它从notification 表中选择sent = 0,发送通知并设置sent = 1

据我所知,这是在不读取 bin 日志的情况下从数据库中获取该信息的最佳方式。

如果您需要使用 cron 运行的脚本示例:

#!/bin/bash

DB_USER=''
DB_PASS=''
DB_NAME=''

ID=`mysql -u$DB_USER -p$DB_PASS $DB_NAME -Bse "SELECT notification_id FROM notification_queue WHERE sent=0 LIMIT 1;"`

if [[ ! -z $ID ]] 
then
    # SEND MAIL HERE
    RESULT=`mysql -u$DB_USER -p$DB_PASS $DB_NAME -Bse "UPDATE notification_queue SET sent=1 WHERE notification_id = $ID;"`
    echo "Sent"
fi

【讨论】:

  • 如果您需要对此进行任何澄清,请告诉我。我知道答案有很多!
  • 我现在正在处理这个问题。我已经创建了表格。但是,当我创建 TRIGGER 时,我收到以下错误...
    #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 5 行的 '' 附近使用正确的语法
    ...这是我的 Line 5'... <br/> **INSERT INTO notification_queue VALUES ();` **
    这是截图 - Print Screen
    对此有什么想法吗?
  • 抱歉换行了...我现在正在处理这个问题。我已经创建了表格。但是,当我创建 TRIGGER 时,我收到以下错误... #1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 5 行的 '' 附近使用正确的语法 ...这是我的 Line 5'... **INSERT INTO notification_queueVALUES ();`** 这是一个截图 - Print Screen对此有什么想法吗?
  • @webfrogs 我不知道几个月前您是否曾经得到过您的问题的答案,但为了其他阅读本文的人的利益,您的错误是因为您没有将分隔符定义为一开始是 $$,这意味着默认分隔符(分号)在起作用,你的 CREATE TRIGGER 在第 5 行突然结束。
  • @Sam_Butler - 很好地发现了这一点,不知道为什么我之前没有注意到这一点,但我已经更新了示例以反映分隔符的变化。
【解决方案2】:

您可以获得lastInsertedId,如果不是零,请发送电子邮件。

$db = new PDO('mysql:host=localhost;dbname=data','root','');

function insertData(){
    global $db;
    $db->exec("INSERT INTO `albums`(`Artist`, `Album`, `Year`, `Cover`, `Tracks`) VALUES ('Cosmic Gate','Start to feel','2014','cover.jpg',13)");
    $id = $db->lastInsertId();
    //returns last inserted ID
    return $id;
}

function selectData($id){
    global $db;
    $results = $db->query("SELECT * FROM albums WHERE ID = $id");
    $results = $results->fetchAll(PDO::FETCH_ASSOC);
    $message = "Artist: ".$results[0]['Artist']."\n"."Album: ".$results[0]['Album'];
    return $message;
}
$email = insertData(); //get last inserted id
$EmailTo = "tentenpeter48@gmail.com";
$subject = 'mysql update';
$message = "New data inserted: \n".selectData($email);

if($email != 0){

    if(mail($EmailTo, $subject, $message)){
        echo 'success'; // for testing
    }
} 

【讨论】:

  • 应用程序不是数据库服务器。有人可以直接与数据库服务器对话,而无需与应用程序对话。
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2023-02-21
  • 1970-01-01
相关资源
最近更新 更多