Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jak ugryźć newsletter...
Forum PHP.pl > Forum > PHP
marcz
Witam!

Planuję stworzenie newslettera, w związku z tym zastanawiam się nad metodą samego wysyłania maili. Przeglądałem wątki na forum, w których ten temat był już poruszany, jednak nie znalazłem jednoznacznego, właściwego rozwiązania problemu. Informuję z góry, że interesuje mnie newsletter na powiedzmy kilkanaście tysięcy adresów. Adresy będą przechowywane w bazie MySQL. Co więcej, ma to być robione nie z maszyny stojącej u mnie, a z wykupionego konta hostingowego.

Z tego co czytałem, w grę wchodzą następujące rozwiązania:
- skrypt pobierający kolejno adresy z bazy i wysyłający maile - problemem jest max. czas wykonywania skryptu - wątpię, że zdąży mi się wysłać te kilkanaście tys. maili
- Cron - jednak czy admin serwera się nie "podirytuje" faktem, że raptem jakiś proces obciąża mu na maxa maszynę i łącze i go nie wyrzuci?

Kolejna sprawa to możliwość wykorzystania pola BCC. Nie wiem jednak na ile jest to skuteczne, ile adresów maksymalnie da się wpisać, itp.

Zwracam się z uprzejmą prośbą do bardziej doświadczonych o pomoc w wyżej opisanej kwestii, na pewno nie jeden (jedna winksmiley.jpg) z Was spotkała się już z tym problemem. Będę wdzięczny za wszelkie rady i wskazówki.
Cysiaczek
Jednorazowo możesz mieć problem z wysłanie kilku tysięcy. Można to jednak obejść.
Po prostu podziel wysyłanie maili z bazy danych np. po 100 jednorazowo. Wtedy powinno być ok. Nie musisz sam odświeżać strony. Mogą to za ciebie robić odwiedzający i każdorazowo wysyłać kilka/kilkaset przy wejściu. Oczywiście tazkie rozwiązanie jest maksymalnie chamskie, więc nie polecam. Cron? No można, o ile serwer na to pozwoli i ten newsletter będzie miał kilka informacji dziennie. Do takich działań polecam stworzenie sobie własnego serwera, ewentualnie zakup jakiegoś drogiego, gdzie możesz sobie poszaleć.
W BCC masz to samo, co z wysłaniem pojedyńczo (oszczędzasz tylko na wywoływaniu funkcji wysyłającej).
marcz
Jedyne sensowne rozwiązanie, które mi przychodzi go głowy to oszacować liczbę maili, która na pewno zostanie wysłana w ciągu jednego wywołania skryptu (np. 50) i zastosować taki algorytm:
- w panelu administracyjnym klikamy "Wyślij newsletter" smile.gif
- skrypt wysyła do pierwszych 50 osób (powiedzmy, że wykorzystuję BCC, więc powiedzmy 50x5=250 osób) odznaczając w bazie, że do tych osób już newsletter poszedł
- sprawdza czy newsletter został wysłany do wszystkich - jeżeli nie to JSem przekierowuję przeglądarkę pod odpowiednio spreparowany adres, który znów zainicjalizuje wysyłanie do kolejnych 250 osób; jeżeli tak to sobie gdzieś odznaczam, że newsletter został wysłany

Jeżeli macie jakieś inne pomysły to serdecznie zapraszam do dyskusji smile.gif

A może pójść po najmniejszej linii oporu i wykorzystać np. CcMail. Akurat ten system wydał mi się najrozsądniejszy sposród wszystkich, które przejrzałem. Przy okazji polską nakładkę może by się zrobiło... winksmiley.jpg
Balon
ustalamy limit wiadomosci wysylanych za jednym razem i refresh ( header + location ) w ktorym podany jest id od ktorego ma zostac zaczeta nowa kolejka wysylania maili i po sprawie winksmiley.jpg
nasty
najpierw w zmiennej powiedzmy $exec_time spradzaj makszymalny czas wykonania, i zmienna $executed w kturej bedzie time(),
potem zrob FOR loop co bedzie wysylac majla po jednym, w po kazdym wyslaniu maila sprawdzaj roznice time() z $executed, jak ta wartosc dojdzie do okolo 2 secundy mniej niz $exec time, przerwij wysylanie za pomoza die(),

i zachowaj wartosc $i z FOR loop, i za nastepnym wywolaniem strony wysylaj od maila number $i az skonczysz wszytko.


aha i jeszcze jedno, ta metoda jest lepsza od wysylania 50 maili za jednym zamachem bo filtry spam-u nie wychwyca to
marcz
Cytat(nasty_psycho @ 15.06.2006, 10:21 ) *
aha i jeszcze jedno, ta metoda jest lepsza od wysylania 50 maili za jednym zamachem bo filtry spam-u nie wychwyca to


Nie bardzo rozumiem - chodzi Ci tu o wysyłanie w polach BCC?


Wielkie dzięki za porady, przy okazji mam jeszcze jedno pytanie - na ile jest to efektywne w praktyce? Rozumiem, że w dużej mierze wydajność takiego rozwiązania zależy od parametrów serwera i złożoności skryptu, ale mimo wszystko jestem bardzo ciekaw jak to się sprawuje w praktyce - może ktoś z własnego doświadczenia mógłby podać chociażby szacunkową ilość wysyłanych maili na minutę?
nasty
Cytat
Nie bardzo rozumiem - chodzi Ci tu o wysyłanie w polach BCC?

Na wiekszosci majli sa filtry spam, i jak jest wiecej niz jaks liczba adresantow to blokuje (wstawja to folderu z spam,junk itd) a jak wysylasz po jednym to sie system nie zorientuje.

a co do skutecznosci to nie probowalem ale mysle ze bedzie dzialac
php programmer
A oto moja wersja rozwiązania tego problemu,
jak zwykle niekonwencjonalna, ale sam ją zastosowałem
u siebie i zdaje egzamin, teoretycznie można by wysłać w pętli
20000 maili jednak został by przekroczny czas wykonania skryptu
dlatego zamiast petli przekazywana zostaje zmienna poprze GET,
która za każdym wywałoniem zostaje zwiększona, a oto kawałek kodu:

  1. <?php
  2. if (!isset($_GET['id'])) $_GET['id'] = $_GET['start'];
  3.  
  4. FunkcjaWysyłajacaJednegoMaila($_GET['id']);
  5.  
  6. if (++$_GET['id']<=$_GET['stop']){
  7.  echo '<script language="javascript">';
  8.  echo "location = 'self.php?start=".$_GET['start']."&stop=".$_GET['stop']."&id=".$_GET['id']."';";
  9.  echo '</script>';
  10.  }
  11. ?>
marcz
Dzięki php programmer, ale zostanę jednak przy koncepcji nasty_psycho - czyli przy jednym wykonaniu skryptu wysyłam X maili dbając o to, aby nie przekroczyć max. czasu wykonania skryptu.
Napisałeś, że zdaje to u Ciebie egzamin, a możesz powiedzieć jak jest z efektywnością takiego rozwiązania (np. ile orientacyjnie jesteś w stanie wysłać maili w ciągu minuty)?
php programmer
No tak wadą jest szybkość, to jeszcze zależy od różnych rzeczy,
np obciążenia serwera itp, ja mam zazwyczaj koło 1000 razy
to mi zajmuje od 20 do 30 minut, wtedy po prosu zostawiam
kompa lub robie jakieś inne zadanie na kompie, kiedyś przerobiłem
skrypt aby jednorazowo wysylał nie 1 a 10 maili
ale nie zwiększyło to wielce wydajności.
marcz
Zrobiłem test, na serwerze firmy hostingowej, z której usług aktualnie korzystam, składał się z:
- połączenia z bazą
- wykonania zapytania
- pobrania wiersza
- wysłania maila
- zamknięcia połączenia
Czas wykonywania skryptu oscylował od 0.04 do 0.18 sek, przeciętnie w granicach 0.1 sek. Oczywiście połącznie z bazą i zamknięcie połączenia z bazą nie będą wykonywane przy każdym mailu, a raz na wykonanie skryptu, więc można test został zrobiony trochę "na zapas".
Dajmy na to, że pełne wysłanie jednego maila zajmie nawet 0.2 sek, to w ciągu max. czasu wykonania skryptu (na tym serwerze to 50 sek.) mamy 250 maili.

Wydaje mi się więc, że w tym przypadku spokojnie można przyjąć 250 maili/min, więc 1k maili w 4min.

Dziwi mnie więc, że u Ciebie wysyłanie 1k maili trwa 20-30 min, skąd ta różnica?
Oczywiście jeżeli wysyłasz to z serwera, który stoi w domu to nie było pytania smile.gif.

W sumie masz rację, wysyłanie X maili w trakcie wykonania skryptu nie zawsze musi przynieść wymierne rezultaty w postaci zwiększenia efektywności, ale ja osobiście wolę jednak, mimo wszystko, optymalizować co się da (w granicach rozsądku oczywiście winksmiley.jpg).
php programmer
Różnica jest stąd że twoje wyliczenia to teoria o mój skrypt, którego używam to praktyka.
Myśle że dużo czasu zabiera przeładowanie strony, więc możesz np spróbować
żeby przy jednym przeładowaniu wysyłał jednocześnie 100 maili.

Acha no i jeszcze jedno, skrypt był wykonywany na localhost na moim kompie.
piotrekkr
takie dzialania jak wykonywanie polaczenia z baza danych zamykanie zapytanie etc nie sa liczone do czasu wykonania skryptu tak przynajmniej wyczytalem przy okazji czytania o set_time_limit()
Cytat
The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running.
Nostress
Działanie mojego mailingu:

1. Wysyla maila do pierwszych X maili, zaznaczam, ze do nich juz poszlo.
2. Przekierowuje, jesli są maila do ktorych jeszcze nie poszlo to powtarzam krok 1.

I tak do wyczerpania maili. Teraz jest tylko jeden problem, komunikat: "Firefox wykrył, że serwer przekierowuje żądanie tego zasobu w sposób uniemożliwiający jego ukończenie." I oczywiscie maila nie idą do wszystkich, bo skrypt kończy działanie.

Jak to rozwiązaliscie wy, jak to poprawić?
Babu
Mój sposób jest następujący:

skrypt pobiera z bazy paczke maili 25 z około 15000
następnie wysyła w pętli 25 maili whilem mail()
po wykonaniu tego refresh ze zmienna ktora przy nastepnym
wyznaczy od ktorego miejsca pobierac nowe 25 maili i tak wkolko.

2500 Maili około 30 minut ale działa
prolam
sorry, ze odswiezam, ale mam ten sam problem lecz:

- opcja z set_time_limit() nie wchodzi u mnie w gre

- zostala opcja @php programmer, jednak dziala ona tylkow IE, w firefoxie (nie wiem jak w innych) wyskakuje "Nieprawidłowe przekierowanie. Firefox wykrył, że serwer przekierowuje żądanie tego zasobu w sposób uniemożliwiający jego ukończenie." i konczy dzialanie scryptu...

moje ktos wie jak to obejsc?questionmark.gif? (2 punkt, aby nie konczyl dzilania scryptu)
Denver
Może by tak po prostu poinformować czytelników o czymś takim jak RSS? smile.gif
legorek
Cytat(Denver @ 6.09.2006, 00:09:59 ) *
Może by tak po prostu poinformować czytelników o czymś takim jak RSS? smile.gif


No wybacz, ale to strona ma być dostosowana do użytkownika, a nie vice versa. Jeśli uzytkownik chce dostawać maile to trzeba mu stworzyć taką możliwość. Im więcej kanałów informacyjnych tym lepiej. Ale wbrew pozorom nie zawsze. Osobiście jestem przeciwnikiem RSS dla małych portali i stron. Użytkownik zamiast wchodzić na moją stronę, sprawdzać czy jest coś nowego i oglądać reklamy, czeka aż pojawi się to w RSSie, przez co trace odsłony.

A teman mailingu był wałkowany tysiąc razy, za każdym podobne wniski: porcjowanie na małe paczki, których wielkość trzeba sobie dostosować to mocy serwera i przepustowości łącza.
prolam
Cytat(legorek @ 6.09.2006, 11:04:03 ) *
A teman mailingu był wałkowany tysiąc razy, za każdym podobne wniski: porcjowanie na małe paczki, których wielkość trzeba sobie dostosować to mocy serwera i przepustowości łącza.


to chyba nie przeczytales mojego posta...
Denver
Cytat(legorek @ 6.09.2006, 11:04:03 ) *
Osobiście jestem przeciwnikiem RSS dla małych portali i stron. Użytkownik zamiast wchodzić na moją stronę, sprawdzać czy jest coś nowego i oglądać reklamy, czeka aż pojawi się to w RSSie, przez co trace odsłony.

W takim razie lepiej zabijać serwer mailami? RSSy możesz pogodzić z wysoką odwiedzalnością, umieszczając w feedach np. pierwsze dwa akapity wiadomości. Użytkownik wejdzie na stronę, aby przeczytać resztę i obejrzeć ewentualne komentarze, natomiast nie będzie musiał odwiedzać Twojej strony codziennie aby sprawdzać, czy coś nowego się przypadkiem od wczoraj nie pojawiło.

Zresztą sam sobie odpowiedz na pytanie: Czy potrafiłbyś obecnie żyć bez RSS-ów? Ja nie.
legorek
prolam, faktycznie, przeczytałem cały temat nie patrząc na daty. Moja odpowiedź: zrób przekierowanie w meta, a nie w JS.


Cytat(Denver @ 6.09.2006, 10:36:24 ) *
nie będzie musiał odwiedzać Twojej strony codziennie aby sprawdzać, czy coś nowego się przypadkiem od wczoraj nie pojawiło.

Zresztą sam sobie odpowiedz na pytanie: Czy potrafiłbyś obecnie żyć bez RSS-ów? Ja nie.


Ale ja tego właśnie chce. Chce przyzwyczaić moich użytkowników, żeby odiwedzali moją stronę codziennie, a nie tylko wtedy kiedy ich coś w RSSie ich zainteresuje. Nie ważne czy coś się pojawiło czy nie. Mają odwiedzic i oglądnąć reklamy. Sam mówisz, że nie potrafisz żyć bez RSSów, ja chce, żeby nie potrafili zyć bez mojej strony, bo w RSSie nie upcham reklamy.

P.S. Sam nie subskrybuje ani jednego RSSa, za wyjątkiem wykopu i spokojnie poradziłbym sobie bez niego.
Prph
Witam,

Moje pomysl jest nastepujacy:

Akcja Napisz Wiadomosc:
1. Formularz wiadomosci. W bazie zapisuje tytul, tekst, id_subskrypcji. Tabela ta zawiera jeszcze id_ostatniego_subskrybenta (do ktorego wyslano maila).
2. przekierowanie na akcje Wysylanie.

Akcja Wysylanie:

dwa ajaksy
1. progress bar - pyta serwer ile wyslano/ile pozostalo - na tej podstawie wyswietla pasek postepu.
2. czy nalezy odswiezyc akcje wysylajaca

akcja wysylajaca:

1. usun flage TRZEBA_ODSWIEZYC = false
2. pobierz 100 nastepnych subskrybentow
3. wysli im maile

jezeli sa jeszcze jakies maile do wyslania
4. ustaw flage TRZEBA_ODSWIEZYC = true
jezeli nie: wyslij maila do osoby wysylajacej, ze newsletter zostal rozeslany.

akcja Wysylanie jak na pasku dojdzie do 100% to, zamyka okno.

Adrian.
zleek
Ja kwestie newslettera rozwiązuję następująco:

1. W formularzu wpisuję temat i treść maila
2. Po submicie pobieram wszystkie adresy e-mail na które ma być wysłany newsletter i zapisuje w bazie danych w tabeli do wysyłki nastepujące informacje:
adres e-mail | temat | tresc | flaga=0
3. W cronie mam ustawiony skrypt odpowiedzialny za wysyłkę newslettera, który pobiera z powyższej tabeli maksymalnie 100 wierszy w których flaga jest ustawiona na 0. Sprawdza ilość pobranych rekordów i jeżeli jest zerowa to kończy swoje wykonywanie, jeżeli jest większa niż 0 to wysyła pojedynczo maile pod dany adres przy jednoczesnej zmianie flagi na 1.

Skrypt jest wywoływany przez crona raz na 5 minut. Gdy nie ma nic do wysłania nie obciąża on praktycznie w ogóle serwera bo nie pobierze żadnych rekordów i się zakończy.
Natomiast gdy pobierze rekordy wysyła maksymalnie 100 maili po czym się kończy.

Przy większej liczbie wysyłanych maili można zwiększyć częstotliwość wywoływania skryptu, jednak dla mnie jest ona w zupełności wystarczająca.
pawkow
pływająca ramka winksmiley.jpg To właściwie wszystko. Masz w panelu admina umieszczoną takową, która po zakończeniu wysyłania maila (powiedzmy po 100 odświeżeniach w tym każde = 25 maili) i na końcu wyświetla się komunikat - zakończono. Poz tym mamy takie coś jak AJAX. Jedyna wada - jeżeli zamkniesz przeglądarkę może nie być za ciekawie. I tutaj nasuwa się pomysł z wykorzystaniem cookies, w których było by zapisane, ile maili zostało wysłanych. Wszystko można zrobić ładnie i szybko winksmiley.jpg
Prph
Witam,

Kwestia rozsylania maili rozwiazalem, tak jak to wczesniej przedstawilem. Teraz mam do zgryzienia kolejny orzech.

Klient zazyczyl sobie statystyk:

1. ile osob czytalo maila
2. ile kliknelo na link z ich strona
3. ile sie wysubskrybowalo

Te pierwsze 3 sa proste do zaimplementowania, ale jak zrobic nastepujace:

4. do ilu mail nie dotarl (zle adresy e-mail)
5. ile wiadomosci zakwalifikowano jako spam

Do glowy przyszedl mi tylko pomysl polaczenia sie z SMTP imapem, pobranie naglowkow i ich sprawdzenie.

Jakies inne pomysly?

Adrian.
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.