Tömeges levelezés, avagy az e-mail marketing technikai kérdései Rózsa Ferenc 2005. Kecskemét
Az előadás főbb pontjai Az e-mail marketingről Felmerülő piaci igény PHP megoldások a levélküldésre Python megoldás, mint tömeges levélküldés Skálázási probléma Címlista karbantartása (problémák)
E-mail marketingről E-mail címlista (saját vagy lista tulajdonos) Biztosíték, hogy a címek léteznek és jók E-mail hírlevél formája (design) HTML és text verzióban Tartalom (saját készítésű vagy vásárolt) Kiküldés módja (kiküldő szoftver) Címlista karbantartása (adatok frissítése, feliratkozás, leiratkozás, visszapattanó címek kezelése)
E-mail marketingről Demográfia: nők vagy férfiak? Életkor? Lakhely? Iskolai végzettség? Érdeklődési kör? Médiafogyasztási szokások (hagyományos és online)? Életstílus kérdések? Havi juttatások? Mi a termékkel kapcsolatos hozzáállásuk? Mikor célszerű a célcsoportot megszólítani (napszak, nap, hét, hónap)?
Küldendő levél tulajdonságai Esztétikus megjelenés a célcsoporttól függően HTML levél esetén színek kezelése A levél a lehető legkisebb legyen méretileg Ne lépje át a SPAM küszöbértéket (a fogadó szerver ne kezelje SPAM-nak) A belső tartalom „szabadon” szerkeszthető legyen
Felmerülő piaci igény Minél olcsóbb legyen a megoldás Bármikor kéznél legyen az alkalmazandó vívmány Tartalom szerkesztés területén a lehető legnagyobb szabadság Egyszerű kezelhetőség
PHP megoldások a levélküldésre mail() saját forráskódban /nagy mennyiségű levél kiküldésére nem alkalmas) különböző levelezési osztályok alkalmazása (timeout probléma) levelezési listák alkalmazása (nem alkalmas e-mail marketingre, illetve nem használható a dinamikus tartalom) Akkor mi a megoldás?
PHP levélküldő osztályok htmlMimeMail http://phpguru.org/static/mime.mail.html PHPMailer http://phpmailer.sourceforge.net/ MIME Mail and SMTP Classes http://www.phpclasses.org/browse/package/1984.html …………………
Megoldási lehetőség Küldendő levél előállítása, benne jelezve a dinamikus tartalom Dinamikus tartalmat tartalmazó állomány előállítása A levélküldést elvégző script elkészítése Levelek kiküldését elvégző script elkészítése Levélküldés ütemezése Címlista karbantartása (folyamatos tevékenység)
Küldendő levél elkészítése Sablonok használata javasolt, tartalomtól függően Belső tartalom elkészítésre a lehető legnagyobb szabadság biztosítása (WYSIWYG) Szükséges mentések elkészítése (levél tartalma, dinamikus tartalom, ütemezési feladat, esetlegesen weboldalon található archívum) Linkek kezelése
PinEdit szerkesztő
PinEdit előnyei Felhasználók számára ismerős felület (Microsoft Office, StarOffice, OpenOffice) Könnyen megtanulható Szerkesztési, megtekinthetőségi, forrás közvetlen szerkesztési lehetőség A generált forráskód a szabványoknak tökéletesen megfelel Reguláris kifejezés tökéletesen illeszthető a forrásra Gazdag paraméterezési lehetőség (cél könyvtárak, megnyitandó állomány, megjelenítendő gombok, funkciók) Adatbázis támogatás Viszonylag sok böngésző támogatása Többnyelvűsíthető felület http://pintexx.com
Dinamikus tartalom //cimek.txt valami1@domain.hu valami2@domain.hu //dinamikus_tartalom.txt valaki1@domain.hu;Kis István valaki2@domain.hu;Kis Miska
Maga a levélküldés //levelkuldes.sh for i in `cat cimek.txt` do echo $i > tmp.txt cat mail.txt >> tmp.txt ./korlevel.py < tmp.txt sleep 3 done
Python, mint segítség //körlevel.py import smtplib import string def prompt(prompt): return raw_input(prompt) toaddrs = prompt("To: ") msg = ("From: %s\r\nTo: %s\r\n" % ("Valaki Valaki<valami@domain.hu>",toaddrs))
Python, mint segítség while 1: try: line = raw_input().strip() except EOFError: break msg = msg + line + "\r\n" print msg
Python, mint segítség server = smtplib.SMTP('smtp.kefo.hu') server.set_debuglevel(1) server.sendmail("valami@domain.hu", toaddrs, msg) server.quit()
Levél küldési ütemezés Operációs rendszer használata http://www.kalab.com/freeware/cron/crons.zip Ütemezést végreható állomány szerkesztése Gondoskodni kell a megfelelő állomány megfelelő helyre kerüléséről
Címlista karbantartása Tanítható rendszer kidolgozása Lehető legnagyobb biztonsági szint elérése Különböző kódlapok figyelembevétele (ISO-8859-2, UTF-8, stb.) Nyelvek figyelembevétele SPAM levelek kiszűrése Visszapattanó levelek osztályozása Levelező szerver megkérdezése
Visszapattanó levelek kezelése Figyelembe vehető dolgok: tárgy, tartalom Tárgy és tartalom indexelése (pl.: szavak alapján) A szükséges szavak betanítása a rendszernek Dinamikus reguláris kifejezések létrehozása, tárgy és tartalom mezőre illesztése
Szerver megkérdezése Kommunikációs csatorna megnyitása a levelező szerverhez (220=READY, 250=OK) Levél küldésének eljátszása (ki küldi az üzenetet, kinek küldjük az üzenetet) A válasz elemzése, vizsgálata (250) http://www.faqs.org/rfcs/rfc821.html
Szerver megkérdezése …………… $sock=fsockopen($mailserver_adress,25); if($sock) { //küldőszerver beköszön (azonosítás) $say="HELO DOMAIN.HU"; echo "<br>SAY: ".$say; fputs($sock,$say); //smtp válasz feldolgozása $answer=""; $answer=fgets($sock,4); echo "<br>ANS: ".$answer; //250=OK a 220=READY, ha nem ezeket adja vissza, gondja van
Szerver megkérdezése if($answer!="250" && $answer!="220") { //kapcsolat bezárása $say="QUIT <CRLF>"; fputs($sock,$say); fclose($sock); return false; }
Szerver megkérdezése //levélküldés eljátszása //a küldő: $say="MAIL FROM: <>"; echo "<br>SAY: ".$say; fputs($sock,$say); //itt több válasz is lehet, de lényegében mindegy, mit válaszol $answer=""; $answer=fgets($sock); echo "<br>ANS: ".$answer;
Szerver megkérdezése if($answer!="250" && $answer!="220"&&!strchr($answer,$mailhost)) { $say="QUIT <CRLF>"; fputs($sock,$say); fclose($sock); return false; }
Szerver megkérdezése //a címzett: $say="RCPT TO: <@".$this -> hostName.":".$this->email.">"; echo "<br>SAY: ".$say; fputs($sock,$say); //smtp válasza $answer=""; $answer=fgets($sock); echo "<br>ANS: ".$answer;
Szerver megkérdezése if($answer!="250") { $say="QUIT <CRLF>"; fputs($sock,$say); fclose($sock); return false; } //kapcsolat bezárása return true;
Szerver megkérdezése else { //ha fsock nem tud kapcsolódni echo "Nem tudok kapcsolódni"; return false; } ……………
Skálázás, terheltség Egy levél általában 85-100 Kbyte méretű Pl.: 3 millió levél Összes küldendő méret: ~286 Gbyte Küldési idő: kb.: 35 nap Sok idő, nagy mennyiség 1 db szerver esetén Megoldás: több szerver igénybevétele
Felhasznált eszközök PHP (adatbázis kezelés, PHPMailer, szükséges állományok létrehozása) Python (küldési feladatok elvégzése, végleges marketinglevél előállítása) Cron (ütemezési feladatok) PinEdit (WYSIWYG, belső tartalom szerkesztése)
Köszönöm a figyelmet!