2012-02-14 3 views
0

Я очень новичок в PHP, и мой первый проект разрабатывал систему комментариев. Так что теперь это здорово, но я хотел бы дать комментаторам выбор, чтобы получать электронные письма, когда появляется новый комментарий. Сначала я решил создать еще одну строку в моей таблице: 'email_notifications'. В submit.php для формы комментария.Отправка сообщения по электронной почте людей, когда есть новый комментарий

Написать всем .... Я wan't использовать:

$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: [email protected]"); 
} 

Я даже не уверен, что это будет работать. Но моя первая проблема заключалась в том, что он собирался отправлять письма людям не один раз. Потому что, если люди прокомментируют более одного раза с тем же электронным письмом, обычно он просто посылает по электронной почте это электронное письмо более одного раза, когда он идет через базу данных для всех электронных писем. Это мое большое беспокойство. В любом случае, я мог отправлять сообщения по электронной почте людям, когда есть новый комментарий без людей электронной почты более одного раза каждый раз, когда появляется новый комментарий.

Резюме (то, что я хочу сделать):

1. Кто-то подает комментарий.
2. все выше получает письмо

Я надеюсь, что я ясно. Если нет, прошу прощения. Заранее спасибо. Помните, что им еще новичок :)

ответ

0

Если предположить, что таблица содержит всякие адрес электронной почты, это должно работать:

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

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

    $subject = "There was a new comment"; 
    $message = "[email protected]"; 

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

Однако я хотел бы попробовать использовать Подготовленные Statments или Хранимые Proceedures для вызовов базы данных.

Heres тот же пример с использованием Подготовленные заявления:

$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 = "[email protected]"; 

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

см. Правки, добавлен пример использования подготовленных статусов –

+0

Мне все равно нужна переменная $ email, верно? – Shawn31313

+0

@ Shawn31313 нет, я его очистил. вам даже не нужно объявлять $ e-mail, как я это делал раньше –

0

Я не рекомендую положить функцию mail() внутри любого цикла, есть возможность создавать слишком много писем в короткий timestan, который, вероятно, приведет в вашем домене считается спамером.

В своем коде, где новый комментарий создается вы можете отслеживать все различные идентификаторы для всех замечаний до тварного одного:

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

Это будет выбрать все идентификаторы пользователей для пользователя, разместившего последний комментарий исключением. Затем вам нужно создать уведомления в соответствующей таблице, наблюдая за дубликатами, чтобы предотвратить несколько одинаковых уведомлений.

Последняя часть создает на вашем сервере сценарий очереди почты, который будет медленно отправлять уведомления. Есть много путей для этого, я предпочитаю сценарий CLI, который запускается через crontab (если он еще не запущен). Там есть только цикл с бесконечным циклом со сном вроде 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-совместимые скрипты, которые могут быть запущены как демоны, у меня не было желание попробовать, что, хотя.Бесконечный цикл - опасная вещь, но это работает для меня, по крайней мере.

Смежные вопросы