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