Как проверить, отправлено ли уже письмо?

0

У меня есть (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

Спасибо:)

Теги:
email

3 ответа

2
Лучший ответ

Ни одна из ваших таблиц не имеет столбец для регистрации, если отправлено письмо, что я бы ожидал увидеть здесь:

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;
  • 0
    Хорошо, но, как предложил Брэд. Я отправляю сообщение нескольким получателям. Это пометит его как отправленный, если он отправляет только 1 адрес, я прав?
  • 0
    @Dean: Нет , если TRACKING таблица содержит два столбца - feed_id и recipient_id . Эти два столбца должны быть первичным ключом или, по крайней мере, уникальным ограничением, чтобы гарантировать, что пара значений уникальна, но все же допускает привязку receient_id к нескольким каналам и наоборот.
Показать ещё 14 комментариев
0

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

При быстром сканировании вашей программы создается впечатление, что таблица pager содержит сообщения, а recipients содержит те, которые получают сообщения. Сообщения являются "один ко многим", поэтому каждое сообщение МОЖЕТ быть отправлено нескольким получателям. Правильно?

В этом случае вам понадобится 3-я таблица, в которой вы будете отслеживать, что вы отправили. Возможно, с такими полями, как recipient_id, message_id, timestamp и, возможно, поле для успеха или отказа сообщения, которое вы можете заполнить позже, если сообщение отскакивает.

  • 0
    Ты на 100% прав, спасибо :)
0

Ну, нет никакого общего способа, а это значит, что вам придется реализовать его самостоятельно.

Создайте столбец флага sent в таблице получателей, отменив его во всех записях перед запуском процесса отправки и установив его "да" после отправки электронной почты для этого конкретного получателя.

Или, более сложный, но более гибкий, создайте новую таблицу "поставки", содержащую все адреса, которые уже получили определенную рассылку (идентифицированную текущей датой, строкой [например, "Информационный бюллетень Q3" ] или любым другим). Этот метод может быть бит-тяжелый, но отличный способ отслеживать несколько рассылок.

  • 0
    Хм, ну у меня сейчас третья таблица, как предложил Брэд. С полями: message_id, receient_id, time, isSent. Я бы предпочел, чтобы это было простое решение, но при необходимости оно может быть слишком тяжелым.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню