Hát ez a kód így nagyon nem jó...
Az elején megnyitott "$uzenet" változó nincs lezárva ("), de már nyitsz egy másik változót "$fejlecek.="
a mail() fv-t hamarabb híod meg paraméterként átadva nekik a "$fejresz" változót, mint hogy annak értéket adnál...
Ráadásul, ha jól is lennének sorban a vátozóid, és le is lennének zárva, akkor is, itt legalább 3X hívod meg a mail() fv-t. Valóban akarsz 3 levelet is küldeni?
Ez így már jó, és ennek működnie kell CRON-ból meghívva is. De azért az érdemes lenne figyelembe venni, hogy a levél kiküldése után kell egy SQL UPDATE a dátumra, vagy valamilyen más módon tárolni kell, hogy "sa bácsi" már kapott mailt, ellenkező esetben, ha eltelt a 60 nap, akkor onnantól minden áldott nap meg fogja kapni az e-mailt... Feltételezem az "ugyfelek" táblában van valami egyedi azonosító mező is. A példában ez a cella az "id" lesz:
$ellenorzes = "SELECT * FROM ugyfelek WHERE datum > DATE_SUB(CURDATE(), INTERVAL 60 DAY);";
Inkább egy mail_status nevű új oszlopot vegyen fel, ha netán a datum mezőben az eredeti regisztrációs dátumot takarja.
Én egyébként úgy oldanám meg, hogy 0,1,2 értékeket tartalmazhatna ez a mező. Alapból 0, ez jelentené azt, hogy még nem kapott levelet. Az 1-essel jelölném, ha valakinek megpróbált levelet küldeni a rendszer, de a mail fv hívás false-al tért vissza, 2-es pedig az, ahol a mail visszatérési értéke true volt. Így ha valami gubanc van és tele van 1-essel a tábla, nem azon fog agyalni, hogy miért nem fut le a cron, hanem, hogy a paraméterezése rossz-e a mailnek vagy beállításokbeli gond van.
Mailt meg mindenkinek küldenék, aki 60 napon belül és 2es mail_status alatt szerepel.
@djjjozsi:
Frankó volt a vidi a másik topicban!
Azt meg épp tegnap taglaltam egy másik topicban, hogy Jankó27 válaszai miért is félválaszok csak.
Ezt a mondatot a topic elején nem igazán tudom értelmezni:
"ez lenne ami az egyik level 60 nappal elöbbi email küldést kéne végeznie"
De gondolom a 60 napnál régebbi dátummal rendelkező user-eknek akarsz mailt küldeni...
Mert akkor a relációs jelet fordítva kell írni a SELECT-ben.
$ellenorzes = "SELECT *
FROM ugyfelek
WHERE datum < DATE_SUB(CURDATE(), INTERVAL 60 DAY);";
Ezen kívül a while ciklusban kicsit elírtad:
if($sent){
mysql_query("UPDATE ugyfelek SET datum=CURDATE() WHERE id=".$sor["id"].");
}
Ezáltal a \datum\ a jelenlegi dátum lesz és előröl kezdődik a 60 nap.
Bár attól függ mi a dátum. Mert ha mást takar az az oszlop, akkor erre csinálj egy külön oszlopot, mondjuk "maildate" néven és azt update-eld.
szerk.: Bár akkor ebben az esetben:
SELECT *
FROM ugyfelek
WHERE maildate < DATE_SUB(CURDATE(), INTERVAL 60 DAY);
Ebben igazad van, de mivel a táblaszerkezet nem volt ismert, nem konkrét megoldásnak írtam, amit írtam, hanem csak javaslatnak, amolyan útmutatónak... azt sem tudtam, van-e azonosító cella (id). Természetesen csak ő tudhatja, mire van az a dátum mező, és hogy update-elhető vagy sem. Ha nem, akkor mást kell update-elni.
Ez a javaslat életre való szerintem:
Én egyébként úgy oldanám meg, hogy 0,1,2 értékeket tartalmazhatna ez a mező. Alapból 0, ez jelentené azt, hogy még nem kapott levelet. Az 1-essel jelölném, ha valakinek megpróbált levelet küldeni a rendszer, de a mail fv hívás false-al tért vissza, 2-es pedig az, ahol a mail visszatérési értéke true volt
Igazából azt akrtam hogy vannak megrendelők akiknek érvényes egy évig a regisztrációjuk és mielött lejárna 60nappal elöbb küldjön egy emailt mindenkinek akinek lejár (sql-ből)
mielőtt bármit is csinálsz(cikluson belüli limit nélküli email küldés), előtte játssz el a lekérésekkel, ami lekéri a 60 napos esedékes ügyfeleket.
ezután tehetsz bele állapotokat is, hogy kinek lett kiküldve és kinek nem a(z) (a többszöri) értesítés.
a lekérésbe meg limitálj mindig. LIMIT 1
És hogy csak élő példánál maradjunk, egy elolvasási státuszt is tegyél be, minden levélbe egyedi kódsort amivel visszatud majd jelezni a levélbe tett linkkel. Így az ügyfelek , email-értesítések táblára bontanám fel a feladatot.
Csinálj még egy oszlopot pl.: "domain_valid" néven, ami azt a dátumot tartalmazza, ameddig érvényes (Rendezett) a domain használata.
Így a SELECT a következő lenne:
$ellenorzes = "SELECT *
FROM ugyfelek
WHERE domain_valid < DATE_SUB(domain_reg_date, INTERVAL 60 DAY) LIMIT 1;";
INSERT INTO `ugyfelek` (`id`, `domain_name`, `domain_reg_date`, `renew`, `ceg`, `szarmazasi_nev`, `mail`, `allapot`)
VALUES
(1, 'sss.hu', '2009.01.01. 0:18:00', '2012.01.01.', 'Informatikai Kft', 'Informatikai Kft ', 'domain@ss.hu', 'RENDEZVE');
megjegyzés: Ha a tábládban auto_increment az "id", akkor INSERT-kor nem kell értéket bevinned.
ezzel olyan végtelen ciklust csinálsz hogy csak úgy na.
az jó hogy vissza updateled a datum mezőt, amikor kiküldted, de egy státusz mezőt is vezess hogy tudd neki már küldtél ki értesítő levelet.
Ekkor a lekérésbe tedd bele, hogy az a státusz mező ne legyen olyan állapotú mint ami jelzi hogy már küldtél neki levelet :)
while ciklussal, vagy máshogy csak akkor járj be egy eredményt, ha van találat.
mysql_num_rows() <---------- manual
LIMIT 1; esetén nem kell while ciklust tenned. Nem tudom hány ügyfélre kell működnie, de egy 5 perces frissítésű CRONNAL lazán megoldhatod.
Érdemes megfogadni, amit djjjozsi írt...
Csinálj még egy oszlopot az ugyfelek táblába. Pl.: sentmail
Típusa: int(1) legyen.
Ha az érték 1, akkor már ment ki neki mail, ha 0, akkor még nem.
mysql_query("UPDATE ugyfelek SET datum=CURDATE(), sentmail=1 WHERE id=".$rows['id']);
Lekérés:
SELECT *
FROM ugyfelek
WHERE sentmail = '0' domain_valid < DATE_SUB(domain_reg_date, INTERVAL 60 DAY);
3700?
Nem tudom, hogy mennyire hivatalos az az egész, illetve a kérdésed alapján kicsit nem értem azt, hogy mind a 3700-nak megfelelő lenne a mai dátum a domain lejáratának?
Mert ha nem, arra ezek után kell írni egy külön szkriptet, ami a
`domain_reg_date`-hez automata hozzáad 1 évet.
Persze csak ahhoz 1 évet, aki 1 évre rendezte. Aki 2 évre, annak 2-őt és így tovább...
az kellene hogy pl:
mindennap este 8kor fut a cron
2010.05.05én regisztrált
mikor 2012.05.05e lesz akkor este 8kor kapna egy mailt.
hogy 60nap mulva lejár neki
ezért mindig az aktuális dátumot kéne hogy figyelje