带有Gmail的PHPMailer类,每次发送两封电子邮件

时间:2011-09-08 19:27:39

标签: c# php post phpmailer

我有一个控制台应用程序发布到PHP页面(使用Gmail和PHPMailer类)通过电子邮件发送给用户。

问题是,用户总是收到两次电子邮件!

这是我在C#上的帖子(我传入uid用于记录目的。)

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!

请参阅上文的修订版。

1 个答案:

答案 0 :(得分: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函数中放置一个echo:

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...

它可能会起作用:)。