Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ajax] Wysyłanie powiadomień e-mail
Forum PHP.pl > Forum > XML, AJAX > AJAX
szczypior
Witam

Dodaję do mojego serwisu opcję powiadomień wiadomościami e-mail, w momencie gdy pojawi się nowy post w pytaniu ktore obserwuje jeden lub więcej userów. W tym celu wykorzystuje phpMailer'a oraz wysyłanie przez SMTP co umożliwia ta biblioteka. Wysyłanie odbywa się w momencie dodania nowego postu i niestety trwa kilka sekund, a ja nie chciałbym przez te kilka sekund "zanudzać" użytkownika czekaniem na zakończenie tego procesu. Dlatego wymyśliłem, żeby do wysyłania poczty zaangażować AJAX, licząc post użytkownika pojawi się na stronie zanim zakończy się wysyłanie.

Samo dodawanie posta do bazy odbywa się w innym pliku php, niż w którym została jego treść wpisana do formularza, dlatego korzystam z headera aby powrócić na tamtą stronę oraz aby zapobiedz kilkukrotnemu przesłaniu danych. I tu chyba właśnie tu jest problem, bo gdy zakomentuję header to poczta jest rozsyłana poprawnie.

Jak mogę obejść ten problem? A może macie pomysł na inne rozwiązanie problemu wysyłki maili?

Poniżej wklejam kod pliku który jest odpowiedzialny za wrzucanie danych do bazy i wywołanie pliku zajmującego się rozsyłaniem wiadomości.

  1. <?php
  2. // różne funkcje wrzucające treść posta do bazy itp
  3.  
  4.  
  5. echo '<html><body onload="process()"><script language="JavaScript">
  6.    var xmlHttp = createXmlHttpRequestObject();
  7.  
  8.    // tworzymy obiekt XMLHttpRequest
  9.    function createXmlHttpRequestObject()
  10.    {
  11.        var xmlHttp;
  12.        // dla przeglądarek poza IE 6 i starszych
  13.        try
  14.        {
  15.            // próba stworzenia obiektu XMLHttpRequest
  16.            xmlHttp = new XMLHttpRequest();
  17.        }
  18.        catch(e)
  19.        {
  20.            // zakładamy że IE6 lub starsza
  21.            var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP");
  22.            // sprawdzamy każdy identyfikator aż trafimy na działający
  23.            for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++)
  24.            {
  25.                try
  26.                {
  27.                    // próba stworzenia obiektu XMLHttpRequest
  28.                    xmlHttp = new ActiveXObject(XmlHttpVersions[i]);
  29.                }
  30.                catch(e) {}
  31.            }
  32.        }
  33.        // zwraca stworzony obiekt albo komunikat o błędzie
  34.        if (!xmlHttp)
  35.        {
  36.            alert("Błąd podczas tworzenia wiadomości (XMLHttpRequest)");
  37.        }
  38.        else
  39.        {
  40.            return xmlHttp;
  41.        }
  42.    }
  43.  
  44.    //asynchroniczne wywołanie serwera
  45.    function process()
  46.    {
  47.        // kontynuuje gdy xmlHttp nie jest pusty
  48.        if (xmlHttp)
  49.        {
  50.            // próba połączenia z serwerem
  51.            try
  52.            {
  53.                var params = "question_id='.$id_pyt.'";
  54.                xmlHttp.open("POST", "mailer.php", true);
  55.                xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
  56.                xmlHttp.setRequestHeader("Content-length", params.length);
  57.                xmlHttp.setRequestHeader("Connection", "close");
  58.                xmlHttp.send(params);
  59.            }
  60.            catch(e)
  61.            {
  62.                alert("Nie można nawiązać połącznia z serwerem:\n" + e.toString());
  63.            }
  64.        }
  65.    }
  66.    </script>
  67.    </body></html>';
  68. $referer  = $_SERVER['HTTP_REFERER'];
  69. header("Location: $referer");
  70. ?>


Pozdrawiam
Andrzej
erix
Cytat
Wysyłanie odbywa się w momencie dodania nowego postu i niestety trwa kilka sekund

To nie kombinuj z wysyłaniem bezpośrednim, tylko zrób sobie kolejkę wiadomości. Jeśli trzeba wysłać nową - trafia nowy wpis do kolejki. Wykorzystanie tutaj AJAX tylko obejdzie problem, gdyż przy większym obciążeniu pojawią się problemy.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.