2010-08-28 63 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

相關問題