2011-09-08 106 views
0

我有一個控制檯應用程序,發佈到一個PHP頁面(使用Gmail和PHPMailer類)向用戶發送電子郵件。帶Gmail的PHPMailer類,每次發送兩封電子郵件

問題是,用戶總是收到郵件兩次!

下面是從C#我的文章(我在流體傳遞的日誌記錄。)

public static void PostUpdate(string uid) 
{ 
    WebRequest request = WebRequest.Create("http://127.0.0.1/bin/server/check_table.php"); 
    request.Method = "POST"; 
    string postData = "check_table"; 
    byte[] byteArray = Encoding.UTF8.GetBytes(postData); 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.ContentLength = byteArray.Length; 
    Stream dataStream = request.GetRequestStream(); 
    dataStream.Write(byteArray, 0, byteArray.Length); 
    dataStream.Close(); 
    WebResponse response = request.GetResponse(); 
    Console.WriteLine("[" + uid + "]- " + DateTime.Now.ToString() + " : HttpWebResponse(" + ((HttpWebResponse)response).StatusDescription + ")"); 
    dataStream = response.GetResponseStream(); 
    StreamReader reader = new StreamReader(dataStream); 
    string responseFromServer = reader.ReadToEnd(); 
    // Display the content for debugging 
    // Console.WriteLine("[" + uid + "]- " + DateTime.Now.ToString() + " : " + responseFromServer); 
    reader.Close(); 
    dataStream.Close(); 
    response.Close(); 

} 

我的PHP文件由

$sql = "SELECT * FROM users as u JOIN value_store as v ON u.id = v.uid WHERE u.last_notification < DATE_SUB(NOW() , INTERVAL 5 MINUTE) "; 
$results = mysql_query($sql, $db_link); 
while($row = mysql_fetch_array($results)) { 
    $id = $row[0]; 
    $msg = ""; 
    if($row["inlet_moisture"] > $row["inlet_moisture_high_critical"]) { 
     $msg = "Critical Inlet Moisture"; 
    } else if($row["inlet_moisture"] > $row["inlet_moisture_high_warning"]) { 
     $msg = "Inlet Moisture Warning"; 
    } 
    if($msg != "") { 
     if($row["mobile_notification"] == 1) { 
      if(sendMessage(($row["mobile_number"] . "@" . $row["mobile_carrier"]), $row["first_name"], $msg)) { 
       $res1 = mysql_query("UPDATE users SET last_notification = NOW() WHERE id = $id",$db_link); 
       echo "SMS Sent for [$id]"; 
      } 
     } 
     if($row["email_notification"] == 1) { 
      if(sendMessage($row["email"], $row["first_name"], $msg)) { 
       $res2 = mysql_query("UPDATE users SET last_notification = NOW() WHERE id = $id",$db_link); 
       echo "Email Sent for [$id]"; 
      } 
     } 
    } 
    echo "Update For [$id] Complete!"; 
} 

我已經考慮到了一些調試選項發佈。

我已經設置了我的控制檯應用程序來讀取WebRequest的輸出... 所以我可以看到我打開張貼頁面,POST是確定的。我認爲可能有一個關閉問題,因爲數據庫中有兩行,如果我回顯每行的ID,我只能得到最後一行(兩次)。我試圖更新我的PHP while循環輸出爲我使用的id(行)。

我仍然收到

Update For [2] Complete! 
Update For [2] Complete! 

,而不是

Update For [1] Complete! 
Update For [2] Complete! 

見上文修訂。

+0

你調用SendMessage()的兩倍。一個用於真實的電子郵件地址,一個用於SMS。不知道你的用戶,但我的手機拿起我的工作電子郵件,以及短信,所以我傾向於得到雙重通知 –

+0

是的,但這是一種非常不同的發送方式。通過電子郵件短信我發送到[phoneNumber] @ [mobilecarrier]和電子郵件它是用戶的電子郵件地址。我可以驗證這些呼叫是否不明確。一個發送一封電子郵件,一個發送短信。如果你認爲我只是瘋了,看着他們一樣;一個是我的手機短信,電子郵件綁定到我通過Outlook閱讀的Gmail帳戶。 – rlemon

+0

檢查服務器的訪問日誌 - 被稱爲兩次的PHP腳本?如果是這樣,那麼它是你的C#代碼的東西。 –

回答

1

你有這樣的代碼:

if($msg != "") { 
    if($row["mobile_notification"] == 1) { 
     // stuff 
    } 
    if($row["email_notification"] == 1) { 
     // stuff 
    } 

這是一次發送電子郵件,如果mobile_notification設置爲1,如果email_notification設置爲1還發送電子郵件;這可能是原因。您可能想要使用

else if($row["email_notification"] == 1) { 

只發送電子郵件,如果移動尚未發送。

不知道更多的代碼或數據,這很難說。有些事情可以做,以追查進一步

把一個回波在PHP SendMessage函數:

function sendMessage($to, $toName, $body) { 
    echo 'Sending mail...'; 
    // rest of the function here 
} 

,看看它肯定射擊的兩倍(應該是)。

現在看看,看看是怎麼從數據庫中每一次回來

while($row = mysql_fetch_array($results)) { 
    print_r($row); 
    // script continues 
} 

它可能會得到2排回對於每個查詢,在這種情況下,你可以看你的SQL查詢,看看是否是正確。

假設它,也許PHP文件被調用了兩次,所以把一個調試在C#文件(我不知道C#,所以我會離開的語法給你)

public static void PostUpdate(string uid) 
{ 
    // echo uid here 
    // script continues 
    WebRequest request = WebRequest.Create("http://127.0.0.1/bin/server/check_table.php"); 
    request.Method = "POST"; 

通過只是打印一些輸出,你可以跟蹤它出錯的地方,然後看看爲什麼一旦你知道錯誤。


我剛看到你正在做這個...

while($row = mysql_fetch_array($results)) { 

再後來就在這個循環,他說

$results = mysql_query("UPDATE users... 

,並重新定義結果集已經循環。您可以運行一個查詢而不需要返回值;

mysql_query("UPDATE users 

或只是給它一個不同的名稱,第二次

$results2 = mysql_query("UPDATE users... 

,它可能會工作:)

+0

感謝您的回覆Joe,C#調用只進行一次。我已經寫到控制檯了。 sendMessage的php調用每次觸發兩次。請參閱我的更新以獲取更多信息 – rlemon

+0

至於兩個if語句;我希望用戶通過電子郵件和短信收到通知,如果他們願意的話。所以這應該是如何工作。 – rlemon

+0

你可以發佈你的SQL嗎?獲得最後一行兩次可能是爲什麼你會收到兩次電子郵件,所以任何你可以告訴我們關於你的數據庫表的東西都會派上用場。 – Joe

相關問題