我是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。以上所有人都会收到一封电子邮件
我希望自己清楚明白。如果没有,我道歉。提前致谢。记住,我还是初学者:)
答案 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兼容的脚本,可以作为守护进程启动,但我没有尝试这样做的冲动。无限循环是一件危险的事情,但至少对我有用。