У меня есть (PHP) script, который работает в новой строке в MySQL. Тем не менее, он будет постоянно отправлять электронные письма, даже если они уже были отправлены... вызывая массовые письма в папку "Входящие" пользователей.
script довольно большой, поэтому я не могу вставить его здесь - http://pastebin.com/6v75F4Gv
В любом случае я могу как-то проверить, отправил ли этот script сообщение "xx", но если новая строка, содержащая "zz", и пользователь указал, что они хотят получать контент, содержащий "zz", он отправляет ' zz 'row?
т. Он останавливает повторение /etc. сообщения электронной почты.
Примечание. Таблица MySQL находится в следующем формате:
Таблица: feed
Строки в пейджере: id
, title
, description
, date
Таблица: recipients
Строки в получателях: id
, email
, suburb
Спасибо:)
Ни одна из ваших таблиц не имеет столбец для регистрации, если отправлено письмо, что я бы ожидал увидеть здесь:
if (sendMail($subject, $to, $body, $from, $cc))
{
echo 'Mail for ' . $to . ' has been sent.<br />';
//Update database so only one email is sent...
$sql = "INSERT INTO TRACKING_TABLE
(feed_id, recipient_id, isSent)
VALUES
($feed_id, $recip_id, 'Y')";
$query = mysql_query($sql);
} else
{ ...
... что означало бы обновление:
$feed_sql = "SELECT id, title, description, rssDate
FROM feed
WHERE MATCH (title) AGAINST ('" . $rows['suburb'] . "')
AND NOT EXISTS(SELECT NULL
FROM TRACKING_TABLE tt
WHERE tt.feed_id = feed.id
AND tt.recipient_id = $Recipient_id
AND tt.issent = 'Y')
GROUP BY pubDate
ORDER BY pubDate DESC
LIMIT 1";
... чтобы убедиться, что ваш запрос не собирает те, которые были успешно отправлены.
DROP TABLE IF EXISTS `example`.`tracking_table`;
CREATE TABLE `example`.`tracking_table` (
`feed_id` int(10) unsigned NOT NULL default '0',
`recipient_id` int(10) unsigned NOT NULL default '0',
`issent` char(1) NOT NULL default '',
PRIMARY KEY (`feed_id`,`recipient_id`),
FOREIGN KEY (feed_id) REFERENCES pager(id),
FOREIGN KEY (recipient_id) REFERENCES recipients(id)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Вам нужно отслеживать это в своей базе данных. У вас нет никаких полей в настоящее время в ваших таблицах, чтобы поддерживать это, поэтому вам сначала нужно пересмотреть свою схему.
При быстром сканировании вашей программы создается впечатление, что таблица pager
содержит сообщения, а recipients
содержит те, которые получают сообщения. Сообщения являются "один ко многим", поэтому каждое сообщение МОЖЕТ быть отправлено нескольким получателям. Правильно?
В этом случае вам понадобится 3-я таблица, в которой вы будете отслеживать, что вы отправили. Возможно, с такими полями, как recipient_id, message_id, timestamp и, возможно, поле для успеха или отказа сообщения, которое вы можете заполнить позже, если сообщение отскакивает.
Ну, нет никакого общего способа, а это значит, что вам придется реализовать его самостоятельно.
Создайте столбец флага sent
в таблице получателей, отменив его во всех записях перед запуском процесса отправки и установив его "да" после отправки электронной почты для этого конкретного получателя.
Или, более сложный, но более гибкий, создайте новую таблицу "поставки", содержащую все адреса, которые уже получили определенную рассылку (идентифицированную текущей датой, строкой [например, "Информационный бюллетень Q3" ] или любым другим). Этот метод может быть бит-тяжелый, но отличный способ отслеживать несколько рассылок.
TRACKING
таблица содержит два столбца -feed_id
иrecipient_id
. Эти два столбца должны быть первичным ключом или, по крайней мере, уникальным ограничением, чтобы гарантировать, что пара значений уникальна, но все же допускает привязку receient_id к нескольким каналам и наоборот.