如何检查是否已发送电子邮件

时间:2010-08-28 23:24:54

标签: php mysql email

我有一个(PHP)脚本在MySQL的新行上运行。但是,它会不断发送电子邮件,即使它们已经被发送...导致大量电子邮件进入用户收件箱。

脚本非常大,所以我无法将其粘贴到此处 - http://pastebin.com/6v75F4Gv

无论如何,我可以以某种方式检查此脚本是否已发送'xx'电子邮件,但如果包含'zz'的新行和用户已指定他们希望接收包含'zz'的内容,则会发送'zz'行?

即。它会停止重复/等。电子邮件。

注意:MySQL表格格式如下:
表:feed
寻呼机中的行:idtitledescriptiondate


表:recipients
收件人中的行:idemailsuburb

谢谢:)

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

嗯,没有通用的方法,这意味着你必须自己实现它。

在收件人表中创建sent标志列,在发送过程开始之前在所有记录中取消设置,并在发送该特定收件人的电子邮件后将其设置为“是”。

或者,更复杂但更灵活,创建一个新表“交付”,其中包含已收到某个邮件的所有地址(由当前日期标识,字符串[例如“Newsletter Q3”]或其他)。这种方法可能有点数据库,但是跟踪多个邮件的好方法。

答案 2 :(得分:0)

您需要在数据库中跟踪此情况。您的表中当前没有任何字段可以支持此功能,因此您首先需要修改架构。

通过快速扫描您的程序,我会得到您的pager表包含消息的印象,recipients包含接收消息的表。消息是一对多的,因此每条消息可以发送给多个收件人。正确的吗?

在这种情况下,您需要有一个第3个表格,用于跟踪您发送的内容。也许使用诸如recipient_id,message_id,timestamp之类的字段,以及可能是消息成功或失败的字段,如果消息反弹,您可以在以后填充该字段。