Php 当有新评论时给人们发电子邮件

Php 当有新评论时给人们发电子邮件,php,Php,我对PHP非常陌生,我的第一个项目是开发一个评论系统。因此,现在这是伟大的,但我想给评论者的选择,以获得电子邮件时,有一个新的评论。首先,我决定在表中创建另一行,名为: “电子邮件通知”。在submit.php中查看注释表单 给每个人发电子邮件。。。。我不想使用: $emails = mysql_query("SELECT * FROM email_notifications"); while($row=mysql_fetch_assoc($emails)) { mail($row['email

我对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.上面的每个人都会收到一封电子邮件


我希望我说清楚了。如果没有,我道歉。提前谢谢。请记住,我还是一个初学者:)

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

$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);
}

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

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

$query = mysql_query("SELECT DISTINCT `userId` FROM `comments` WHERE `object` = {$yourObject} AND `userId` != {$currentUser}");
这将选择除发布最新评论的用户之外的所有用户标识符。然后,您必须在相应的表中创建通知,注意重复,以防止多个相同的通知

最后一部分是在服务器上创建一个邮件队列脚本,该脚本将缓慢地发送通知。有很多方法可以实现这一点,我更喜欢通过
crontab
启动的CLI脚本(如果尚未启动)。在那里,只有一个无限循环周期,睡眠时间大约为5秒到1分钟(如果没有找到通知),发送一封简单的
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);
}

?>
#/usr/bin/php-q

认真的人会编写POSIX兼容的脚本,这些脚本可以作为守护进程启动,但我没有尝试的冲动。无限循环是一件危险的事情,但至少对我来说是有效的。

@Shawn31313不,我把它清理干净了。你甚至不必像我以前那样申报$email