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.
<?php // różne funkcje wrzucające treść posta do bazy itp echo '<html><body onload="process()"><script language="JavaScript"> var xmlHttp = createXmlHttpRequestObject(); // tworzymy obiekt XMLHttpRequest function createXmlHttpRequestObject() { var xmlHttp; // dla przeglądarek poza IE 6 i starszych try { // próba stworzenia obiektu XMLHttpRequest xmlHttp = new XMLHttpRequest(); } catch(e) { // zakładamy że IE6 lub starsza var XmlHttpVersions = new Array("MSXML2.XMLHTTP.6.0","MSXML2.XMLHTTP.5.0","MSXML2.XMLHTTP.4.0","MSXML2.XMLHTTP.3.0","MSXML2.XMLHTTP","Microsoft.XMLHTTP"); // sprawdzamy każdy identyfikator aż trafimy na działający for (var i=0; i<XmlHttpVersions.length && !xmlHttp; i++) { try { // próba stworzenia obiektu XMLHttpRequest xmlHttp = new ActiveXObject(XmlHttpVersions[i]); } catch(e) {} } } // zwraca stworzony obiekt albo komunikat o błędzie if (!xmlHttp) { alert("Błąd podczas tworzenia wiadomości (XMLHttpRequest)"); } else { return xmlHttp; } } //asynchroniczne wywołanie serwera function process() { // kontynuuje gdy xmlHttp nie jest pusty if (xmlHttp) { // próba połączenia z serwerem try { var params = "question_id='.$id_pyt.'"; xmlHttp.open("POST", "mailer.php", true); xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); xmlHttp.setRequestHeader("Content-length", params.length); xmlHttp.setRequestHeader("Connection", "close"); xmlHttp.send(params); } catch(e) { alert("Nie można nawiązać połącznia z serwerem:\n" + e.toString()); } } } </script> </body></html>'; $referer = $_SERVER['HTTP_REFERER']; ?>
Pozdrawiam
Andrzej