Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新表时从MySQL触发器发送电子邮件_Mysql_Sql_Email_Triggers_Sendmail - Fatal编程技术网

更新表时从MySQL触发器发送电子邮件

更新表时从MySQL触发器发送电子邮件,mysql,sql,email,triggers,sendmail,Mysql,Sql,Email,Triggers,Sendmail,将一个表视为table2,我想在此表update上添加一个trigger select Num into num from table1 where ID=new.id; BEGIN DECLARE done int default false; DECLARE cur1 CURSOR FOR select EmailId from users where Num=num; DECLARE continue handler for not found set done = true; OPEN

将一个表视为
table2
,我想在此表
update
上添加一个
trigger

select Num into num from table1 where ID=new.id;
BEGIN
DECLARE done int default false;
DECLARE cur1 CURSOR FOR select EmailId from users where Num=num;
DECLARE continue handler for not found set done = true;
OPEN cur1;
my_loop: loop
    fetch cur1 into email_id;
    if done then
        leave my_loop;
    end if;
    //send mail to all email id.
end loop my_loop;
close cur1;
END;
在评论的地方有什么简单的写作方法吗?向从表
用户
检索到的所有电子邮件id发送电子邮件

我在XAMPP(phpmyadmin)中使用MySQL。

你问我,“有没有一种简单的方法……通过触发器发送电子邮件?”

答案是否定的,不是标准的MySQL

这通常是通过创建某种挂起的_消息表并编写客户端程序定期轮询该表并发送消息来完成的


或者,你可以考虑使用A。但大多数生产应用程序不太喜欢构建网络功能,比如向数据库发送电子邮件,因为性能可能无法预测

我反对那种解决办法。将发送电子邮件的负载放在数据库服务器中可能会导致非常糟糕的结果


在我看来,你应该做的是创建一个表格,对你想发送的电子邮件进行排队,并有一个流程来检查是否有要发送的电子邮件,如果是肯定的,则发送它们。

正如大家所说,让你的数据库处理电子邮件是一个坏主意。让数据库编写外部文件是另一个坏主意,因为与数据库操作相比,IO操作非常耗时

有几种方法可以解决您的问题,其中一种我很喜欢:有一个表格可以让您的通知/电子邮件排队,还有一个客户端程序可以发送电子邮件

在继续之前,你应该确保你有一个可以用来发送电子邮件的电子邮件帐户或服务。它可以是SMTP或任何其他服务

如果你在.NET上,你可以复制它,如果没有,你会知道如何在你的平台上重写它

在数据库中创建一个表

CREATE TABLE `tbl_system_mail_pickup` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `mFrom` varchar(128) NOT NULL DEFAULT 'noreplyccms@YourDomain.co.uk',
  `mTo` varchar(128) NOT NULL,
  `mCC` varchar(128) DEFAULT NULL,
  `mBCC` varchar(128) DEFAULT NULL,
  `mSubject` varchar(254) DEFAULT NULL,
  `mBody` longtext,
  `added_by` varchar(36) DEFAULT NULL,
  `updated_by` varchar(36) DEFAULT NULL,
  `added_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `email_sent` bit(1) DEFAULT b'0',
  `send_tried` int(11) DEFAULT '0',
  `send_result` text,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
此表将保存您的所有通知和电子邮件。尝试发送电子邮件的表触发器或事件将向上表添加记录。然后,您的客户将接收电子邮件并按您指定的间隔发送

下面是.NET上的一个示例控制台应用程序,旨在让您了解客户端的外观。您可以根据需要对其进行修改。(我使用实体框架,因为它更容易、更简单)

  • 在VisualStudio中创建新的控制台项目
  • 在PackageManager控制台中,安装以下包(安装包EntityFramework,安装包MySQL.Data.Entity)
  • 添加对System.Configuration的引用
  • 现在打开“App.Config”文件,将连接字符串添加到MySQL数据库中
  • 在同一App.Config文件中,添加SMTP电子邮件设置。 检查端口和ssl选项

      <system.net>
    <mailSettings>
      <smtp from="Noreplyccms@youractualEmailAccount.co.uk">
        <network host="smtp.office365.com(your host)" port="587" enableSsl="true" password="dingDong" userName="YourUsername@YourDomain" />
      </smtp>
    </mailSettings>
    
    测试:运行上述代码并将记录插入tbl_system_mail_pickup表。大约1分钟后,您将收到一封发送给指定发件人的电子邮件


    希望这对其他人有所帮助。

    pending\u消息表?好主意,那么我可以在另一个表中插入所有这些电子邮件ID和相应的消息。那我该怎么办?你解释为
    的东西有一个检查是否有电子邮件要发送的流程
    ?我需要在哪里写邮件发送代码?困惑。嗯,这可以通过很多方式实现。一些便宜的主机允许您每X分钟或每小时运行一次php脚本。你可以创建一个脚本来检查是否有电子邮件要发送。如果您使用的是VPS或您自己的服务器。这取决于您使用的是基于Unix的操作系统还是Windows。如果您在Windows上使用GNU/Linux或计划任务,请搜索cronjobs。是的,我们可以使用cronjobs实现这一点。但我还没用过。我正在使用windows服务器。在Windows中,有一个等价的任务调度器。如果它对您有帮助,请选择正确的答案。
    using System;
    using System.Linq;
    using System.Timers;
    using System.Data;
    using System.Net.Mail;
    using ccms_email_sender_console.Models;
    
    namespace ccms_email_sender_console
    {
        class Program
        {
    
           static Timer aTimer = new Timer();
            static void Main(string[] args)
            {
    
                aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);// add event to timer
                aTimer.Interval = 60000; // timer interval 
                aTimer.Enabled = true;
    
                Console.WriteLine("Press \'q\' to exit");
                while (Console.Read() != 'q');
    
            }
    
            private static void OnTimedEvent(object source, ElapsedEventArgs e)
            {
                var db_ccms_common = new DB_CCMS_COMMON(); // the database name you entered when creating ADO.NET Entity model
                Console.WriteLine(DateTime.Now+"> Checking server for emails:");
                aTimer.Stop(); /// stop the timer until we process current queue
    
                var query = from T1 in db_ccms_common.tbl_system_mail_pickup where T1.email_sent == false select T1; // select everything that hasn't been sent or marked as sent.
    
                try
                {
                    foreach (var mRow in query)
                    {
                        MailMessage mail = new MailMessage();
                        mail.To.Add(mRow.mTo.ToString());
                        if (mRow.mCC != null && !mRow.mCC.ToString().Equals(""))
                        {
                            mail.CC.Add(mRow.mCC.ToString());
    
                        }
                        if (mRow.mBCC != null && !mRow.mBCC.ToString().Equals(""))
                        {
                            mail.CC.Add(mRow.mBCC.ToString());
    
                        }
                        mail.From = new MailAddress(mRow.mFrom.ToString());
                        mail.Subject = mRow.mSubject.ToString();
                        mail.Body = mRow.mBody.ToString();
                        mail.IsBodyHtml = true;
    
                        SmtpClient smtp = new SmtpClient();
    
                        smtp.Send(mail);
    
                        mRow.email_sent = true;
                        Console.WriteLine(DateTime.Now + "> email sent to: " + mRow.mTo.ToString());
                    }
    
                    db_ccms_common.SaveChanges(); // mark all sent emails as sent. or you can also delete the record.
    
                    aTimer.Start(); // start the timer for next batch
                }
                catch (Exception ex)
                {
    
                    Console.WriteLine(DateTime.Now + "> Error:" + ex.Message.ToString());
                    // you can restart the timer here if you want
    
                }
    
            }
    
        }
    }