Keresés
Hírlevél
 
Kiemelt témák
»10 éves a prog.hu
»Párhuzamos programozás
»Párhuzamos végrehajtás == szemléletváltás!
Állás/munka
»Tanárt keresek
»Port.hu film tartalmának kinyerése
»PHP programozó kerestetik
»Fejlesztői megbízásokat/munkát keresek
»Senior .Net fejlesztő szabad kapacitással
» több téma
Tudástár
?PHP:keresés szó szerint...
*PHP if-nél megakadtam
? torrent file helyett txt-t
Mobilinternet használata robotokban
?Delphi Form méretezési probléma
?HelpProvider alkalmazás .HLP fájlban
2 oldalas form
SetFocus hatástalan
?XP-n megy Win7-en megakad (Delphi)
?Hiányos mp3 hallgatás telefonról! C#
A legalsó scrollTop értéket nem veszi figyelembe
3 dív pozicionálása (2 egymás mellé, 1 ezek alá)
?Curl login Joomla-ba (PHP)
*Java Axis webservice file küldés és fogadás
?C# scrollozható form
» több téma
Társalgó
»Az általános műveltség része kellene, hogy legyen a programozni tudás?
»Get flood elleni védekezés
»Újra programozni fog a Facebook alapítója és multimilliárdos elnöke
»Firebird - Több adatbázis vagy egy?
»Clipper kontra XP
»Webshop ár kb...
»Hogy működik egy apróhirdető oldal (MySQL)?
»Körlevél script PHP + MySQL
»New project probléma VS 2010 C#
»Kezdőknek:grafikus felület választás
» több téma
ASPC#C++CSSDelphiFlashJavaJavaScriptPascalPerlPHPPythonuniPaaSVisual BasicVisual C++  »    

Tudástár

»

Automatikus email küldés (cron jobs)

»

Automatikus email küldés (cron jobs)

nyitotta: qpassa, idő: 2012.02.02., moderátor: moderator, megoldás elfogadva: 2012.02.08. 09:18
  Értesítés változás esetén Felvétel kedvencekhez Küldés emailben Nyomtatható verzió

Kategóriák:Adatbázisok » MySQL
Programozási nyelvek » PHP
Egyéb » Programozás-elmélet

Kulcsszavak:
Sorrend:
Időzóna:
Blokkméret:
Oszd meg másokkal is!
Sziasztok!
ez működhet ha "időzített futtatás" (cron job)
beteszem és futtatom minden nap 23:00 órakor?

[ code ]

<?php
include'mysql.php';

$targy = "Szolgálati Közlemény";
$uzenet = "Tisztelt Ügyfelünk!

valami valami

üdvözlette:
sa bácsi


$fejlecek .= 'Cc: iroda@ss.hu' . "\r\n";
// Levélküldés és a sikeresség ellenőrzése
$success = mail($targy, $uzenet, $fejresz);
// Visszajelzés a küldésről
if ($success) {
echo "OK";
} else {
echo "NO";
};



$fejresz = "From: sa bácsi <iroda@ss.hu>
Reply-To: ss Kft. - Az Ön cége <iroda@ss.hu>
MIME-Version: 1.0
Content-type: text/plain; charset=iso-8859-2";

mail($targy, $uzenet, $fejresz);

$ellenorzes = "SELECT *
FROM ugyfelek
WHERE datum = DATE_SUB(CURDATE(), INTERVAL 60 DAY)
;";
$eredmeny = mysql_query($ellenorzes);
while ($sor = mysql_fetch_array($eredmeny)){
$email = $sor['email'];
mail($email, $targy, $uzenet, $fejresz);
}
?>

[ /code ]

ez lenne ami az egyik level 60 nappal elöbbi email küldést kéne végeznie

Köszönöm
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 a kód nagyon káosz...

Nem is értem, mit szeretnél...

/tökfilkó/ előzmény
Ez így tényleg elég kesze-kusza...

<?php
include('mysql.php');

$targy = "Szolgálati Közlemény";
$reply = "iroda@ss.hu";
$uzenet = "Tisztelt Ügyfelünk!
valami valami
üdvözlettel:
sa bácsi";
$header = "From: sa bácsi <iroda@ss.hu>\r\n";
$header .= "Reply-To: $reply\r\nReturn-Path: $reply\r\n";
$header .= "MIME-Version: 1.0\r\nContent-type: text/html; charset=iso-8859-1\r\n";
$header .= "X-Mailer: PHP/" . phpversion() . "\r\n";

$ellenorzes = "SELECT *
FROM ugyfelek
WHERE datum > DATE_SUB(CURDATE(), INTERVAL 60 DAY)
;";

$eredmeny = mysql_query($ellenorzes);
$rows = mysql_num_rows($eredmeny);
if ( $rows > 0 ) {
while ($sor = mysql_fetch_array($eredmeny)){
$email = $sor["email"];
mail($email, $targy, $uzenet, $header);
}
}
?>
 
előzmény
ezzel csak az a gond, hogy ha utána megnyitja újból, újból kiküldi. kéne egy állapot is bele nem ? előzmény
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);";

$eredmeny = mysql_query($ellenorzes);
$rows = mysql_num_rows($eredmeny);
if($rows > 0){
  while ($sor = mysql_fetch_array($eredmeny)){
    $email = $sor["email"];
    $sent = mail($email, $targy, $uzenet, $header);
    if($sent){
      mysql_query("UPDATE ugyfelek SET datum=CURDATE() WHERE id=".$rows['id']);
    }
  }
}
előzmény
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. előzmény
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); előzmény
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


előzmény
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)

sql igy néz ki

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') előzmény
Frankó volt a vidi a másik topicban!
köszke! előzmény
Ez esetben egészítsd ki a táblát így:

INSERT INTO `ugyfelek` (`id`, `domain_name`, `domain_reg_date`, `renew`, `ceg`, `szarmazasi_nev`, `mail`, `allapot`, `sendmail`)
VALUES
(1, 'sss.hu', '2009.01.01. 0:18:00', '2012.01.01.', 'Informatikai Kft', 'Informatikai Kft ', 'domain@ss.hu', 'RENDEZVE', '0')


A plusz a sendmail cella: alapértelmezett értéken legyen: 0


SalyT ötletével ötvözve egy nyers javaslat:


<?php
include('mysql.php');

$targy = "Szolgálati Közlemény";
$reply = "iroda@ss.hu";
$uzenet = "Tisztelt Ügyfelünk!
valami valami
üdvözlettel:
sa bácsi";
$header = "From: sa bácsi <iroda@ss.hu>\r\n";
$header .= "Reply-To: $reply\r\nReturn-Path: $reply\r\n";
$header .= "MIME-Version: 1.0\r\nContent-type: text/html; charset=iso-8859-1\r\n";
$header .= "X-Mailer: PHP/" . phpversion() . "\r\n";

$ellenorzes = "SELECT * FROM ugyfelek WHERE sendmail < 2 AND domain_reg_date > DATE_SUB(CURDATE(), INTERVAL 60 DAY);";

$eredmeny = mysql_query($ellenorzes);
$rows = mysql_num_rows($eredmeny);
if($rows > 0){
  while($sor = mysql_fetch_array($eredmeny)){
    $email = $sor["mail"];
    $sent = mail($email, $targy, $uzenet, $header);
    if($sent){
      mysql_query("UPDATE ugyfelek SET sendmail='2' WHERE id=".$sor["id"].");
    } else {
      mysql_query("UPDATE ugyfelek SET sendmail='1' WHERE id=".$sor["id"].");
    }
  }
}
?>
előzmény
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. előzmény
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. előzmény
<?php
include('mysql.php');

$targy = "Szolgálati Közlemény";
$reply = "iroda@ss.hu";
$uzenet = "Tisztelt Ügyfelünk!
valami valami
üdvözlettel:
sa bácsi";
$header = "From: sa bácsi <iroda@ss.hu>\r\n";
$header .= "Reply-To: $reply\r\nReturn-Path: $reply\r\n";
$header .= "MIME-Version: 1.0\r\nContent-type: text/html; charset=iso-8859-1\r\n";
$header .= "X-Mailer: PHP/" . phpversion() . "\r\n";

$ellenorzes = "SELECT *
FROM ugyfelek
WHERE domain_valid < DATE_SUB(domain_reg_date, INTERVAL 60 DAY) LIMIT 1;";

$eredmeny = mysql_query($ellenorzes);
$rows = mysql_num_rows($eredmeny);
if($rows > 0){
  while ($sor = mysql_fetch_array($eredmeny)){
    $email = $sor["email"];
    $sent = mail($email, $targy, $uzenet, $header);
    if($sent){
      mysql_query("UPDATE ugyfelek SET datum=CURDATE() WHERE id=".$rows['id']);
    }
  }
}
?>

és felvettem az sql-be a
domain_valid mezőt is előzmény
Igen, persze!

INSERT-kor:
INSERT INTO `ugyfelek` (`id`, `domain_name`, `domain_reg_date`, `domain_valid`, `renew`, `ceg`, `szarmazasi_nev`, `mail`, `allapot`)
VALUES
(1, 'sss.hu', '2009.01.01. 0:18:00', '2010.01.01 0:18:00', '2012.01.01.', 'Informatikai Kft', 'Informatikai Kft ', 'domain@ss.hu', 'RENDEZVE'); előzmény
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. előzmény
így már jónak kéne lenni-e? előzmény
É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); előzmény
Igen!

előbb elrontottam:

Lekérés:
SELECT *
FROM ugyfelek
WHERE sentmail = '0' AND domain_valid < DATE_SUB(domain_reg_date, INTERVAL 60 DAY); előzmény
kb. 3700 ügyfél

a domain_valid nál nekem kell megadni a mai dátumot?
mert már benne van 3700 ügyfél a mysql-ben előzmény
felvettem a sentmail t sql-be
előzmény
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... előzmény
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 előzmény
így gondolod?

<?php
include('mysql.php');

$targy = "Szolgálati Közlemény";
$reply = "iroda@ss.hu";
$uzenet = "Tisztelt Ügyfelünk!
valami valami
üdvözlettel:
sa bácsi";
$header = "From: sa bácsi <iroda@ss.hu>\r\n";
$header .= "Reply-To: $reply\r\nReturn-Path: $reply\r\n";
$header .= "MIME-Version: 1.0\r\nContent-type: text/html; charset=iso-8859-1\r\n";
$header .= "X-Mailer: PHP/" . phpversion() . "\r\n";

$ellenorzes = "SELECT *
FROM ugyfelek
WHERE sentmail = '0' AND domain_valid < DATE_SUB(domain_reg_date, INTERVAL 60 DAY);;";

$eredmeny = mysql_query($ellenorzes);
$rows = mysql_num_rows($eredmeny);
if($rows > 0){
  while($sor = mysql_fetch_array($eredmeny)){
    $email = $sor["mail"];
    $sent = mail($email, $targy, $uzenet, $header);
    if($sent){
     mysql_query("UPDATE ugyfelek SET datum=CURDATE(), sentmail=1 WHERE id=".$rows['id']);
    }
  }
}
?>
előzmény
Igen egy apró változtatással...

mysql_query("UPDATE ugyfelek SET datum=CURDATE(), sentmail=1 WHERE id=".$rows['id']); javítsd erre -->

mysql_query("UPDATE ugyfelek SET datum=CURDATE(), sentmail=1 WHERE id='".$rows['id']."'");

A végére pedig egy mysql_close($valami);
A $valami a mysql.php-ben lévő változóra mutat, ami a mysql_connect-et tárolja. előzmény
DATE_SUB(domain_reg_date, INTERVAL 60 DAY)

ez a regisztrációs dátum. ezért mondtam, hogy addig tesztelj phpmyadminban amig a megfelelő lekérést nem kísérletezed ki.

éles SQL táblán sose írj while ciklusba mail-t.amig nem tudod biztosan megfelelő-e minden.

ha reg_date amikor beregisztráltad, ahhoz kell egy évet adni, és abból kell 60 napot levonni.
előzmény
ekkor valahogy így néz ki?
ez már a cronra is kész élesben?
persze elötte tesztelném phpmyadminban:)

<?php
include('mysql.php');

$targy = "Szolgálati Közlemény";
$reply = "iroda@ss.hu";
$uzenet = "Tisztelt Ügyfelünk!
valami valami
üdvözlettel:
sa bácsi";
$header = "From: sa bácsi <iroda@ss.hu>\r\n";
$header .= "Reply-To: $reply\r\nReturn-Path: $reply\r\n";
$header .= "MIME-Version: 1.0\r\nContent-type: text/html; charset=iso-8859-1\r\n";
$header .= "X-Mailer: PHP/" . phpversion() . "\r\n";

$ellenorzes = "SELECT *
FROM ugyfelek
WHERE sentmail = '0' AND domain_valid < DATE_SUB(domain_reg_date, INTERVAL 60 DAY);;";

$eredmeny = mysql_query($ellenorzes);
$rows = mysql_num_rows($eredmeny);
if($rows > 0){
  while($sor = mysql_fetch_array($eredmeny)){
    $email = $sor["mail"];
    $sent = mail($email, $targy, $uzenet, $header);
    if($sent){
     mysql_query("UPDATE ugyfelek SET datum=CURDATE(), sentmail=1 WHERE id='".$rows['id']."'");
    }
  }
}
mysql_close($dbConn);
?>
előzmény
mysql_query("UPDATE ugyfelek SET datum=CURDATE(), sentmail=1 WHERE id='".$rows['id']."'"); írd át
-->

mysql_query("UPDATE ugyfelek SET datum=CURDATE(), sentmail=1 WHERE id='".$sor['id']."'");

egyszer csak meg leszünk... előzmény
át írtam:)

datum=CURDATE()
ez a regisztrációs dátumra vonatkozik?

mert nálam ez a neve a regisztrációs dátumnak:
domain_reg_date

datum_valid nálam üres oda nekem kell valamit írni?
a sendmail elött vettem fel vagy ide azt írja mikor küldte ki a mailt?

sql-ben így néz ki:

INSERT INTO `ugyfelek` (`id`, `domain_name`, `domain_reg_date`, `renew`, `ceg`, `szarmazasi_nev`, `mail`, `allapot`, `domain_valid`, `sentmail`) VALUES
(1, 'ss.hu', '2009.01.01. 0:18:00', '2012.01.01.', 'Informatikai Kft', 'Informatikai Kft ', 'domain@ss.hu', 'RENDEZVE', '', 0);


mostmár kész? előzmény
A datum-ot hagyd ki...
Én már egy ideje azt hittem, hogy olyan nincs is...

mysql_query("UPDATE ugyfelek SET sentmail=1 WHERE id='".$sor['id']."'"); előzmény
Oszd meg másokkal is!
Belépés
E-mail cím:
Jelszó:

cvonline.hu
»iOS fejlesztő
»Senior web programozó
»Java fejlesztő (Bécs)
»Java fejlesztő (front-end, backend)
»PHP fejlesztő (Ausztria, Németország)
»Solaris rendszermérnök
» még több állás
Kérdésed van?
Problémád, kérdésed van? Segítünk neked is. Csak kattints ide!
RSS források
-Hírek
-Cikkek
-Fórumok
-Állás/munka
Top pontgyűjtők
»Árnyék1.100
»silentworks910
»Robi80910
»szabofe860
»bubori.attila760
»djjjozsi680
»Galovics660
»Riha590
»Frostech0560
»Csaboka2550
A nap kifejezései
»Adatszegmens
»Konstans
»Makró
» ugrás a wikire
Hírek
»Az általános műveltség része kellene, hogy legyen a programozni tudás?
»Újra programozni fog a Facebook alapítója és multimilliárdos elnöke
»Vizuális felülettervezőt adott ki .NET-es Android-alkalmazásfejlesztéshez a Xamarin
» több hír
PC Fórum hírek
»Elvennék és felhasználóinak adnák a Facebook összes pénzét
»Rejtélyes ikont dugdosgat a Microsoft a Windows 8-ban
»Út a Windows 8-ig - a Windows rendszerek három évtizedének története, képekben
»Mától bárki regisztrálhat a so.cl-ra, a Microsoft közösségi oldalára
»Megérkeztek az első képek az Unreal Engine 4 játékmotorról
»Itt az első videó a a Firefox Windows 8-as változatáról
»Nyártól akár 150 megabites nethozzáférést is ad az Invitel
»Kilenc kritikus biztonsági hibát javít az új Google Chrome
Top wikieditorok
»Sting
»Doi
»FlamingClaw
»Argathron
»Csaboka2
»Muki987
»NevemTeve
»Ivn
»Kelemzol
»Joexy
» ugrás a wikire