当有新评论时通过电子邮件发送给人们

时间:2012-02-14 04:00:11

标签: php

我是PHP的新手,我的第一个项目是开发评论系统。所以现在它很棒,但我想让评论者选择在有新评论时收到电子邮件。首先,我决定在我的表中创建另一行: '邮件通知'。在评论表单的submit.php中。

给每个人发电子邮件....我不想使用:

$emails = mysql_query("SELECT * FROM email_notifications");
while($row=mysql_fetch_assoc($emails)) {
mail($row['email'],'New Comment on...','There was a new comment o....',"From: no-reply@jdrag.x10.mx");
}

我甚至不确定这会起作用。但我首先担心的是它会不止一次向人们发送电子邮件。 因为,如果人们使用同一封电子邮件不止一次发表评论,那么当它通过所有电子邮件的数据库时,不会多次通过电子邮件发送该电子邮件。这是我最关心的问题。无论如何,每当有新评论时,如果有新评论而没有电子邮件的人,我可以给人们发送电子邮件。

摘要(我想要完成的):

1。有人提交评论 2。以上所有人都会收到一封电子邮件

我希望自己清楚明白。如果没有,我道歉。提前致谢。记住,我还是初学者:)

2 个答案:

答案 0 :(得分:0)

假设您的表包含每个人的电子邮件地址,这应该有效:

$emails = mysql_query("SELECT * FROM email_notifications");

while($row=mysql_fetch_assoc($emails)) {

    $subject = "There was a new comment";
    $message = "no-reply@jdrag.x10.mx";

    mail($row['email'],$subject,$message);
}

但是,我会尝试使用准备好的状态存储过程进行数据库调用。

使用准备好的陈述

,使用相同的示例
$mysqli=new mysqli("server", "username", "password", "database");
$stmt = $mysqli->prepare("SELECT email FROM email_notifications");
$stmt->execute();
$stmt->bind_result($email);
while($stmt->fetch()){

    $subject = "There was a new comment";
    $message = "no-reply@jdrag.x10.mx";

    mail($email,$subject,$message);
}

答案 1 :(得分:0)

我不建议将mail()函数放在任何循环中,有可能在短时间内创建过多邮件,这可能会导致您的域名被视为垃圾邮件发送者。

在创建新评论的代码中,您可以在创建评论之前跟踪所有评论的所有不同标识符:

$query = mysql_query("SELECT DISTINCT `userId` FROM `comments` WHERE `object` = {$yourObject} AND `userId` != {$currentUser}");

这将选择除发布最新评论的用户之外的所有用户标识符。然后,您必须在相应的表格中创建通知,注意重复项,以防止多个相同的通知。

最后一部分是在服务器上创建一个缓慢发送通知的邮件队列脚本。有很多方法,我更喜欢通过crontab启动的CLI脚本(如果尚未启动)。在那里,只有一个无限循环周期,睡眠时间为5秒到一分钟(如果没有找到通知)和一个简单的mail()发送。这是基于现有CLI脚本的简易示例:

#!/usr/bin/php -q
<?php

// acquire a process id file or prevent launching a second instance.
$filename = "/path/to/mailer.pid";
$file = fopen($filename, 'w+');
if (!flock($file, LOCK_EX + LOCK_NB)) exit(0);

// force an uninterruptable script
ignore_user_abort(true);
set_time_limit(0);

// mysql connection routines somewhere here

while (true) {
  $query = mysql_query("SELECT * FROM `mail_notifications` ORDER BY `timestamp` ASC LIMIT 0, 1");
  if (!mysql_num_rows($query)) {
      // Oh, no notifications pending. Take a little break
      sleep(60);
      continue;
  }
  $data = mysql_fetch_assoc($query);
  // your mailing magic here
  sleep(5);
}

?>

严肃的人编写POSIX兼容的脚本,可以作为守护进程启动,但我没有尝试这样做的冲动。无限循环是一件危险的事情,但至少对我有用。