2010-08-28 191 views
0

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

剧本是相当大的,所以我不能在这里贴 - http://pastebin.com/6v75F4Gv

反正我能以某种方式检查此脚本是否已经发送“XX”的电子邮件,但如果含有“ZZ”新行用户指定他们希望接收包含'zz'的内容,它会发送'zz'行?

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

注:MySQL表是按以下格式:
表:feed
排在寻呼机:idtitledescriptiondate

表:recipients
排在收件人:idemailsuburb

谢谢:)

回答

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

好的,但正如Brad所建议的那样。我正在将邮件发送给几个收件人。这将标记为发送,如果它只发送到1个地址,我说得对吗? – Dean 2010-08-28 23:49:12

+0

@Dean:如果“TRACKING”表包含两列 - feed_id和recipient_id,则不适用。这两列应该是主键,或者至少是一个唯一的约束,以确保这对值是唯一的,但仍允许将recipient_id关联到多个提要,反之亦然。 – 2010-08-28 23:51:48

+0

好的,太好了。我会试试:) – Dean 2010-08-28 23:53:32

0

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

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

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

+0

嗯,以及我目前有布拉德建议的第三张表。使用字段:message_id,recipient_id,time,isSent。 Id更喜欢它是一个简单的解决方案,但如果需要它可能会数据库很重。 – Dean 2010-08-28 23:52:17

0

您需要在数据库中跟踪这一点。您目前没有任何字段支持这个字段,所以您首先需要修改您的模式。

通过快速扫描您的程序,我觉得您的pager表包含消息,而recipients包含那些接收消息的消息。这些消息是一对多的,所以每条消息都可以发送给多个收件人。正确?

既然如此,您将希望有一个第三个表,您可以跟踪您发送的内容。可能带有诸如recipient_id,message_id,时间戳等字段,也可能是消息成功或失败的字段,如果消息弹回,您可以稍后填充该字段。

+0

你100%正确,谢谢:) – Dean 2010-08-28 23:43:32

相关问题