PHPMailer класс с Gmail, отправка двух писем каждый раз - PullRequest
0 голосов
/ 08 сентября 2011

У меня есть консольное приложение, которое отправляет на страницу 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 для вывода, для которого идентификатор (строки) я использую.

Я все еще получаю

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

вместо

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

См. Выше для изменений.

1 Ответ

1 голос
/ 08 сентября 2011

У вас есть этот код:

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

И это, вероятно, будет работать:)

...