ugrás a tartalomhoz

Hírlevél küldés sok címre egyszerre

felyx · 2008. Júl. 19. (Szo), 15.46
Problémám igazából az lenne, hogy sok (2-3 ezer) e-mail címre kellene elküldenem hírlevelet havonta egyszer. Ott kezdődnek a nehézségek hogy se cron se semmi ilyesmi nem áll rendelkezésemre így nem tudom több adagban küldeni a leveleket de egyszerre sem szeretném tekintve hogy egyenként mail függvénnyel nem a legjobb küldözgetni. Az e-mail címek MySQL adatbázisban vannak tárolva, ezen kívül PHP, Javascript, Ajax amivel dolgozhatok igazából mással nem. A lényeg az lenne hogy kisebb adagokban tudjam küldeni a levelet de ne kelljen manuálisan küldözgetni. Előre megírt dolgot sem akarok tehát inkább a módszer érdekel amit én megvalósítanék. Örömmel veszek bármilyen tanácsot segítséget!
 
1

Távoli cron

Poetro · 2008. Júl. 19. (Szo), 15.52
És mi lenne, ha egy másik oldal, vagy a saját számítógéped hívna meg egy PHPt automatizálva, ami küldené ki a leveleket. Persze biztonságosra kell megépíteni az egészet, de nem olyan nagy ördöngősség.
4

Ne haragudj...

felyx · 2008. Júl. 19. (Szo), 17.03
Ne haragudj de ezt még a legrosszabb rémálmomban sem szeretném látni...
6

Miért?

janoszen · 2008. Júl. 20. (V), 09.53
Ezt kifejtenéd? Nagyon érdekelne, hogy miért nem. Gyakorlatilag a neten forgalomban levő mailküldők nagy százaléka Cron+PHP kombóval mennek, amennyiben az oldal is PHP-ban íródott. És eddig nem volt panasz rá.
13

Távoli elérés?

felyx · 2008. Júl. 20. (V), 12.11
Persze cron + php a legegyszerűbb megoldás, de ha nem férek a szerveren hozzá a cron-hoz akkor nincs mit tenni. Szerinted távoli eléréssel, tehát másik oldalról vagy saját gépről jó megoldás ezt kezelni? Szerintem egyáltalán nem. Igaz maximum csak saját gépről tudnám megoldani.
2

Egyszerre

vbence · 2008. Júl. 19. (Szo), 16.01
A milszerverek manapság elég fenőttek ahhoz, hogy kezeljenek egy ilyen esetet (belső queue-k, sok fázis). A küldés nem egyszerre fog történni. Amikor a szerver megkapja tőled a 2-3 ezer levelet, ő dönt arról, hogy milyen üteben küldje őket tovább. Általában megpróbálnak "jó szomszédként" viselkedni a kiszolgálók, tehát, ha mondjuk 800 cím freemailes is a listáról a szervered nem fogja elárasztani a freemailt, hanem szépen lassan fogja küldeni őket, eközben persze más szerverekre is mennek ki a cuccok.
3

Tehát..

felyx · 2008. Júl. 19. (Szo), 17.02
Tehát akkor nyugodtan küldjem el phpvel egyszerre az egészet?
5

Én így csinálom

vbence · 2008. Júl. 19. (Szo), 23.05
Bár 3-400 fős a legnygyobb lista amit kezelek, de egyszerűen lepasszoloma leveleket, és apostfix nem papanszkodik, szépen megcsinája amit kell neki. Ami itt felmerül, hogy a küldés több ideig is tarthat, mint 30 másodperc, és (főleg safe módban) a php könyörtelenül killelni fogja a levélküldést 30 mp után. A rendszergazdával mindenképpen beszéld meg, hogy mit fogsz csinálni és hogyan, hogy később ne legyen probléma...
8

Postfix

janoszen · 2008. Júl. 20. (V), 09.55
Én láttam a Postfixben mostanában egy olyan opciót, hogy max mails per connection és azt hiszem, by default talán 100-ra volt betekerve, de majd megnézem, ha ráérek.
10

Connection

vbence · 2008. Júl. 20. (V), 10.58
A php mail()- je ha jól tudom a sendmail parancsot fogja meghívni, ahol sztem más elbírálás alá esik a dolog. Így vagy úgy kizártnak tartom, hogy x darab egymásutáni mail-hívás ugyanazt a connection-t használná.
7

Tutimegoldás

janoszen · 2008. Júl. 20. (V), 09.55
Nyugodtan küldheted, bár az MTA-knak általában van egy max mails per connection limitjük, ami viszont remekül kikerülhető azzal, hogy fölhúzol a küldő gépen egy erre szakosított MTA-t (ha Windows, akkor akár egy virtuális gépben) és annak benyomod az egész történetet, aztán az majd smarthost működéssel a rendes SMTP-n keresztül deliverálja az egészet ráérő idejében.
9

Azért nem árt vigyázni...

Sulik Szabolcs · 2008. Júl. 20. (V), 10.56
Gondold el a következő szituációt. Egy hírlevél általában tartalmaz képeket. Egyesek ezt sima linkként, mások a levélbe ágyazva küldik ki. Most nézzük a második szituációt. A levél tartalmaz beágyazva pl 10 képet, ami még optimalizáva is van, így egy levél mérete mondjuk 400-500k. Namost ha ebből 5-6000 darabbal megtáplálod az MTA-t, ami majd egyszer kiküldi, akkor gyorsan elfogyhat a memóriád.

Én inkább azt javaslom, hogy:
1. másodpercenként 5-10 levelet küldj ki
2. egyszerre viszonlag keveset (pár százat), és várj néhány percet a küldések között. Ez megoldható akár cron-nal, akár sima meta refresh-sel is (ízlés dolga).

Mindez persze csak akkor érdekes, ha a levél mérete nagyobb 10-20k-nál.

UI. A max mails per connection könnyen kijátszható, ha x levél után bontod a kapcsolatot és újra felépíted, vagy a 2. pontban csak a max mails alatti számú levelet küldesz egyszerre.

UI2. az nem hangzott el a témaindítóban, hogy személyre szabott-e a hírlevél. Mert ha nem, akkor a bcc-be pakolt címek a leggyorsabb megoldás.
11

Uggyan... :)

vbence · 2008. Júl. 20. (V), 11.10
A 6000 * 400k is csak 2,5 giga. Nem hiszem, hogy létezik mta, ami a memóriába queue-olna. Amúgy a 400k-t soknak tartom. Akármilyen képekkel teletölött a dolog, 120k-nál nagyobb méret nem hinném, hogy reális.

Persze ártani nem árthat, ha magunk is alkalmazunk óvintézkedéseket, mint amiket írtál, de nem kell alábecsülni az eszközöket.
12

postfix

Fekete Ferenc GDA · 2008. Júl. 20. (V), 11.47
Mi azt szoktuk csinálni, hogy a postfix kb 10 email-t kap másodpercenként (html hírlevélről van szó) és így elég hamar lepörög a 10.000 email, szépen elmennek a megadott címekre. Simán bírja a postfix.
14

Kicsit konkrétabban?

felyx · 2008. Júl. 20. (V), 12.16
Kicsit konkrétabb példát tudna valamelyikőtök adni? Egyébként nagyon köszönöm a válaszokat. Nem vagyok gyakorlott annyira így nemtudom MTA alatt mit értetek. A meta refresh viszont egész jónak tűnik.
15

Darabolt futás a háttérben

ady · 2008. Júl. 23. (Sze), 22.00
Ha nincs cron, csinálhatod úgy, hogy a felhasználók által leggyakrabban lekért oldal végén elhelyezel egy kis kódot, ami adott dátumkor minden oldalletöltéskor elküld 10-100 levelet, majd eltárolja hogy hol tartott, és a következő alkalommal onnan folytatja. Az esetleges nagyszámú egyidejű oldalletöltés miatti terhelés elkerülése végett lehet még tárolni az utolsó küldés idejét, és csak X perc elteltével engedni újra. Az oldalletöltés nem lassul le nagyon ilyen kis számú levélküldéstől, és nem kell vacakolni az authentikációval sem (mint pl távoli meghívásnál) mert a szkript maga dönti el, hogy küldjön, vagy sem.
16

Ne csináld

janoszen · 2008. Júl. 23. (Sze), 23.08
Egyrészt megbízhatatlan, másrészt pont akkor fogod agyonterhelni a szerveredet, amikor a leglátogatottabb. Ráadásul minden oldal letöltésénél lesz egy STMP connect, levélküldés, disconnect, stb.

Normálisan meg kell írni szerver oldalon a levélküldést egy erre speciálisan berendezett MTA-val (Mail Transfer Agent avagy levélszerver) és kész. Ha nem értesz hozzá, föl lehet bérelni egy szakit, aki megcsinálja. Mindenféle mailes berhelésnek csak az a vége, hogy önmagad szivatod meg, a következmények pedig: spamlistára kerülés, elégedetlen ügyfél, rosszul kézbesített levelek és ettől ideges címzettek, stb.
17

Hát igen..

felyx · 2008. Júl. 23. (Sze), 23.33
Hát igen egyetértek, de mint említettem nekem kell megoldanom és a rendelkezésemre álló eszközök limitáltak ami annyit jelent hogy php és mysql gyakorlatilag amivel dolgozhatok. Ha ezekkel nem tudom megoldani akkor nagyon valószínű hogy nem is fogom tudni. Lehet hogy ez így primitív stb. de abból kell élni ami van.
19

Barkács

ady · 2008. Júl. 24. (Cs), 08.18
Túlterhelés és megbízhatatlanság? Igen.
Épp ezért kell normálisan megírni. Abból indultam ki, amit felyx írt, hogy nincs más csak a kalapács meg a szög! Nyílván elektromos csavarhúzóval neki is egyszerűbb lenne, de ha nincs?
A terhelésre pedig még mindig azt látom megoldásnak, hogy jól kell megválasztani az oldal/levél és az levél/percenként számokat.
18

Téma

nanofish · 2008. Júl. 24. (Cs), 06.28
Szerintem 2-3 ezer levél nem vág agyon semmilyen szervert, úgyhogy mehet a mail() függvénnyel.

Ha az alkalmazásod Linux/Unix-on fut, a korlátozásokkal sincs gond, mert a PHP mail() unixokon a sendmail programot használja a küldésre, ami nem használ SMTP kapcsolatot, hanem közvetlenül berakja az üzeneteket a sorba. Így nem fog zavarni, hogy a mail szerver egyébként hány levelet engedélyez kapcsolatonként. Legalábbis ez a sendmail szabványos működése. A hagyományos sendmail-nél, postfix-nál, qmail-nél biztosan így van. Az meg hogy megfelelően legyenek adagolva a kifelé menő levelek és ne zabálja le a nagy feladat a szerver erőforrásait, már az MTA (a leveleket továbbító szoftver, mailszerver) feladata, úgyhogy ezzel elvileg nem kell törődnöd.

A végrehajtási idő (max_execution_time) így is gond lehet, ezért ha ezt nem tudod nagyobbra állítani a PHP-ban, valószínűleg több adagban kell az üzeneteket elküldeni. 10-szer rákattintani az "Elküld" gombra, elég nyűgös megoldás, de ha csak ez van, akkor ezt kell szeretni.

Amúgy a levelek megfelelő formázása (fejlécek, kódolás, stb.) sem túl egyszerű feladat, legalábbis egy csomó szabályt kell betartani (= sok hibalehetőség: furcsa karakterek, rosszul megjelenő üzenet, a levél megy a SPAM mappába, stb.). Ezeket a szabályokat mail() függvény nem kezeli automatikusan, ezért ha nincs időd / kedved az rfc2822-t olvasgatni, érdemes kipróbálni a PEAR Mail és Mail_Mime csomagját, Sok szívástól kímélhet meg (bár a szívás egyesek szerint erősíti a lelket).
20

perszonalizált?

Hodicska Gergely · 2008. Júl. 25. (P), 00.12
Ha nem perszonalizált a hírlevél, és nem kell bounce mailek detetálásával foglalkoznod, akkor megteheted azt is, hogy közvetlneül az SMTP szerverre csatlakozol, és egy körben több címzettnek küldöd el a levelet. Ha nincs cron, akkor szerintem telejesen jó megoldás lehet, ha az oldal kiszolgálását használod erre a célra.

Fölösleges terheléstől szerintem nem nagyon kell tartani (nyilván nem nyit az ember minden kéréskor SMTP kapcsolatot), illetve lehet ezt okosan is csinálni. Pl. tudod nagyjából a látogatottsági statisztikád, ennek fényében a kérések végén nézel egy random számot, ha ez 1, akkor kigenerálod az oldalba egy kép src-jébe a cron.php-d. Ez ha meghívódik, akkor megnézi, hogy van-e dolga, és ha van, akkor elvégzi (elküldi az adott mennyiségű levelet).


Üdv,
Felhő
21

nekem lenne egy oldalam...

rockybro · 2009. Jan. 19. (H), 16.08
nekem lenne egy oldalam... ezen az oldalon kb 100 embernek, akik fel vannak iratkozva a hírlevélre (egy mysql táblában szépen fel van sorolva a nevük, és az email címük), kéne valahogyan küldeni automatikus levelet, ha írok egy új postot, és ez a levél tartalmazna egy megszólítást, meg h milyen okból jött a hírlevél (szóval h új post van..), és egy bevezetést az új post tartalmába, ami vagy a post első megadott számú karaktere, vagy az általam külön beírt összefoglalószöveg... illetve nem csak automata levelekről lenne szó, hanem pl ha az oldal szünetel, vagy bármi van, akkor manuálisan is tudjak írni hírlevelet...

nem hiszem h lenne olyan program vagy bármi, ami ezeknek az igényeknek megfelel, de szívesen várok ötleteket... az oprendszer egyébként windows ha kell... az lenne a jó, ha egy adott mysql táblából szépen kiszedné a neveket és az email-címeket..

Szerk.: írjak inkább sajátot php-ban a mail() függvénnyel?
22

Nem, nyiss új témát új

tolmi · 2009. Jan. 20. (K), 15.03
Nem, nyiss új témát új kérdésnek és ne támaszd fel a zombikat. ;)