Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [sposób] masowy mailing
Forum PHP.pl > Forum > PHP
smut
Witam,

mam portal, planuję zrobienie drugiego. Z czasem znacznie zwiększyła mi się liczba zarejstrowanych osób dlatego zastanawiam się nad zrobieniem massowego-mailingu.

Problem w tym, że nie wiem jak to zrobić. Zakładając, że mam 10 tyś ludzi - i chcę wysłać do każdego z nich takiego samego maila. Odpalenie jednego skryptu często kończy się jego timeoutem. Nie moge forkować, uruchamiać programów.

Jak wykonać czynność, która długo trwa i mieć pewność, że się wykonała? Wysłanie tych maili trochę trwa. Btw. używać mail() czy SMTP. Może moglibyście odesłać mnie do jakiegoś poradnika na ten temat?
LonelyKnight
Podziel to na paczki np. po 25 adresów i uruchamiaj cyklicznie cron'em w czasie mniejszego obciążenia serwera np. co minutę od 00 do 6 rano.
kwiateusz
albo jak masz shell to odpalasz skrypcik z jego poziomu gdzie ustalasz że ma wysyłać po 25 maili 10sek przerwy i następna porcja
smut
Dzięki za odpowiedź. Myślałem, że może jest jakiś inny sposób. Ale w takim razie zostanę przy cronie i paczkach po 25 maili.
kwiateusz
crone bądź jak masz shell to z poziomu shella... skrypty wtedy nie maja żadnych ograniczeń co do czasu
smut
No tak, wiem. Niestety nie mam dostępu do shella.
Glarden
A cron nie jest przypadkiem tylko na Linuxa? Bo już się pogubiłem w tym wszystkim.
Poza tym, wydaje mi się że jest sposób na zrobienie tego. Możesz sobie dodać te maile do tablicy (hłehłe, tablica z 10tys indeksów) i wysłać pętlą foreach.
phpion
Cytat(Glarden @ 13.06.2007, 16:57:49 ) *
A cron nie jest przypadkiem tylko na Linuxa? Bo już się pogubiłem w tym wszystkim.
Poza tym, wydaje mi się że jest sposób na zrobienie tego. Możesz sobie dodać te maile do tablicy (hłehłe, tablica z 10tys indeksów) i wysłać pętlą foreach.

Wow, genialne, gratuluje pomysłu.
Ja napisałem sobie fajny newsletterek i działa dość ładnie. Użyłem do tego PHP, MySQL oraz Ajax. Działa to tak: uruchamiam stronę, na której wpisuję treść maila itd. klikam na "Wyślij". Następuje zapis maila do sesji po czym uruchamiana jest Ajaxowa funkcja, która wywołuje skrypt PHP do wysyłania maili. Dodatkowo na tej nowej stronie tworzona jesy dynamicznie tablica adresów e-mailowych (w JS). Tworzona jest ona w JS dlatego, iż po serii testów zauważyłem, iż większość czasu potrzebnego na wysyłkę zabiera właśnie pobranie adresów z bazy (testowałem dla 100 000 maili smile.gif ). No i ok. Ta Ajaxowa funckja przekazuje do skryptu PHP adres lub adresy, a skrypt PHP pobiera sobie dane maila z sesji i wysyła pod przekazane adresy. Potem robię setTimeout np. na 15 sekund i ponownie wywołuje funkcję Ajaxową. I tak do momentu rozesłania maili pod wszystkie adresy. Dodatkowo, co wg mnie jest przydatne, mam pasek postępu wysyłki mailingu oraz przybliżony czas do jego zakończenia.
Co sądzicie o takim rozwiązaniu?
Glarden
Niezłe. Trochę skomplikowane, ale sposób fajny.
A "genialne, gratuluję pomysłu" - to było ironicznie?smile.gif
phpion
Dzięki.
Tak, to było ironiczne. Wyobrażasz sobie ile taki skrypt by się wykonywał? Jakby to obciążyło serwer? Twoje rozwiązanie jest najprostsze ale i, bez urazy, najgorsze smile.gif Sprawdzi się jedynie przy niewielkiej liczbie adresów (do 100?).
Glarden
Masz rację. To był głupi pomysłsmile.gif
A więc, podsumowując: nie da się tego zrobić samym PHP, trzeba użyć crona, shella albo AJAXA, tak?
Black-Berry
A gdyby tak wysyłać po 10 meili przy każdym odświerzeniu strony przez odwiedzającego ? Zmienne licznika zapisywałoby się w bazie danych. Oczywiście istnieje możliwość, że moga się nie wysłać bo danego dnia nikt nie odwiedzi strony ale zawsze mógłbyś sprawdzić ile się do tej pory wysłało i np jeśli wysyłasz 1 meil raz na tydzien to po tygodniu dosłałbyś resztę ręcznie. To załatwia sprawę ajaxa, nie jest trudne do napisania. Może być za to kłopotliwe dla administratora. :/ No ale albo rybki albo akwarium.

@phpion.com mówisz że czekasz np 15 sekund na ponowienie. Ile zatem czekasz na wysłanie 100.000 meili ?
NoiseMc
Ja sobie wrzucam maile do kolejki potem cronem wyciagam z kolejki i wysylam po pare dopoki sie skrypt nie zerwie po wyslaniu kazdego zapisuje na ktorym mailu sie skonczylo wysylanie. Jak skrypt zostanie przez crona ubity to odpala sie jeszcze raz powiedzmy za 5 minut i sprawdza w ktorym momencie przestal i wznawia wysylanie.
Innej opcji niz cron czy proces pracujacy w tle w windows nie widze.
phpion
Cytat(Black-Berry @ 13.06.2007, 20:02:11 ) *
@phpion.com mówisz że czekasz np 15 sekund na ponowienie. Ile zatem czekasz na wysłanie 100.000 meili ?

Czas oczekiwania był przykładowy, natomiast wysyłka jest organizowana w paczkach po X maili. Fakt, wysyłka takiej ilości przy paczce 1-elementowej trwałoby ponad dobę biggrin.gif (wedle szacowanego czasu podanego przez skrypt).
smut
@phpion.com : pomysł z PHP i Ajaxem jest fajny, ale radzę Ci zastosowanie crona. Po pierwsze, podczas wysyłania tych 100k maili, użytkownik musi mieć ciągle otwartą przeglądarkę - przy takiej ilości maili to z pewnością będzie trochę trwało. Druga sprawa, to co gdy zerwie mu się połączenie, albo zawiesi komputer? Po trzecie, osobiście nie lubię takiego rozbijania zadań - w Twoim przypadku klient (użytkownik wysyłający mail) przejmuje cześć zadań serwera - zabiera trochę z logiki wysyłania maili. Po piąte, a co gdy ktoś nie obsługuje JS i/lub ActiveX. Po szóste to bardzo skomplikowana metoda winksmiley.jpg


Oczywiście nie obrażaj się, bo samo w sobie to bardzo fajne zastosowanie Ajaxa smile.gif Jednak moim zdaniem to jak strzelać z bazooki do komara i to bazzoki z celownikiem laserowym winksmiley.jpg No, ale widać, że masz JS w jednym palcu smile.gif

Ja zostane przy cronie - bo jest prosty w obsłudze i nie trzeba się praktycznie niczym martwić.

Dzięki za pomoc wszystkim
phpion
Ha! Nie opisałem w poście kilku bajerków, tj.:
- należy mieć włączoną przeglądarkę - to fakt. Ale można mieć ją zminimalizowaną, a w pasku tytułu widoczny jest pozostały czas do zakończenia wysyłki - w każdej chwili można spojrzeć
- mam również przycisk 'Wstrzymaj', który wstrzymuje wysyłanie wysyłki w dowolnym momencie. Równocześnie do tabeli 'sent' są zapisywane dane jaki mail poszedł pod jaki adres. Można więc w banalny sposób (poprzez zapytanie SQL) wybrać te numery, do który mail nie został jeszcze wysłany i dokończyć wysyłkę w dowolnym momencie smile.gif Cron takiej opcji nie daje - wysyła w tle i tyle.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.