![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 304 Pomógł: 0 Dołączył: 12.12.2006 Skąd: Pszów Ostrzeżenie: (0%) ![]() ![]() |
Witam
Potrzebuje napisać newslettera do swojego CMSu, mam tylko pewne pytania związane z pewnymi rozwiązaniami. Zakładając że CMs będzie skupiał dużą ilość użytkowników nie mogę wysłać mailem tego newslettera za jednym zamachem bo: 1) pewnie mi zbanują maila za spam 2) pewnie się zwiesi strona. Nie chce rozsyłać spamu itp, newsletter jest dla ludzi którzy zgadzają się go otrzymywać. No ale do rzeczy Jak rozwiązalibyście ten problem? Nie chodzi mi o próbki kodu itp, tylko czysto algorytmiczne posunięcia. Z góry dziękuje Pozdrawiam P.S Wesołych świąt ![]() -------------------- |
|
|
![]()
Post
#2
|
|
![]() Admin Techniczny Grupa: Administratorzy Postów: 2 071 Pomógł: 93 Dołączył: 5.07.2005 Skąd: Olsztyn ![]() |
jest kilka wersji, mozesz dodawac zadanie do crona zeby np co minute wysyłal iles maili, mozesz do głownej strony dolaczac wywołanie funkcji mailujacej ktora przy kazdym wejsciu uzytkownika wysle iles maili
![]() |
|
|
![]()
Post
#3
|
|
![]() Grupa: Moderatorzy Postów: 6 072 Pomógł: 861 Dołączył: 10.12.2003 Skąd: Dąbrowa Górnicza ![]() |
Ja to rozwiązałem w ten sposób, iż wysyłka realizowana jest Ajaxem w tle. Maile wysyłane są w paczkach po 10 sztuk. Rozwiązanie to sprawdza się znakomicie w serwisie mającym 40 000 użytkowników przy średnio 120 użytkownikach online (nie odczuwa się żadnego przycinania). Działa? Działa! I to całkiem sprawnie
![]() |
|
|
![]()
Post
#4
|
|
![]() Grupa: Przyjaciele php.pl Postów: 5 724 Pomógł: 259 Dołączył: 13.04.2004 Skąd: N/A Ostrzeżenie: (0%) ![]() ![]() |
Jak dla mnie cron jest najstabilniejszym rozwiazaniem - zapisujesz maile w bazie czy gdzie tam i cron sobie je spokojnie wysyla, user nie musi sie pilnowac zeby nie zamknal przegladarki.
-------------------- Nie lubię jednorożców.
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 217 Pomógł: 23 Dołączył: 2.12.2007 Skąd: Warszawa Ostrzeżenie: (0%) ![]() ![]() |
Witaj,
do wysyłania maili świetnie nadaje się PHPmailer -> http://phpmailer.codeworxtech.com/ wysyłanie maili (kolejkowanie) najlepiej zrobić cronem. Co 5 minut np. odpalasz skrypt który wysyła po 100 maili. Takie rozwiązanie zastosowałem w serwisie gdzie w bazie było ok 600 000 maili, i działało dosyć sprawnie i bezproblemowo działa dalej. -------------------- Masz swoje mieszkanie i chcesz je wynająć? Sprawdź ofertę Zarzadządzanie Najmem
WRONA.IT - pozycjonowanie stron www.ecyklopedia.pl |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 304 Pomógł: 0 Dołączył: 12.12.2006 Skąd: Pszów Ostrzeżenie: (0%) ![]() ![]() |
widze że jest kilka ciekawych propozycji. Co do crona to nie jestem pewiem czy mogę go używać na moim serwerze.
Dlatego chyba najbardziej podoba mi się pomysł z Ajaxem -------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 102 Pomógł: 22 Dołączył: 3.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
wysyłanie maili (kolejkowanie) najlepiej zrobić cronem. Co 5 minut np. odpalasz skrypt który wysyła po 100 maili. Takie rozwiązanie zastosowałem w serwisie gdzie w bazie było ok 600 000 maili, i działało dosyć sprawnie i bezproblemowo działa dalej. To tak tylko zapytam - czyli jeden newsletter wysyłał Ci się przez 20 dni? Biedni Ci którzy byli na końcu, bo najświeższych newsów chyba nie dostali... ;-) |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 55 Pomógł: 0 Dołączył: 26.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
A gdzie on napisał, że akurat dawał po 100maili ?
![]() ![]() |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 304 Pomógł: 0 Dołączył: 12.12.2006 Skąd: Pszów Ostrzeżenie: (0%) ![]() ![]() |
napisał napisał
![]() Chciałbym zrobić to uniwersalnie, więc cron odpada. Ajax albo przeładowanie strony w tym wypadku chyba najlepsze, nie sądzicie? -------------------- |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 1 873 Pomógł: 152 Dołączył: 9.04.2006 Skąd: Berlin Ostrzeżenie: (0%) ![]() ![]() |
Ajax
![]() ![]() W bazie zapisz sobie emaile, i oznaczaj który wysłano, a który nie. Pobieraj (LIMIT 100) te niewysłane, wyślij i oznacz jako wysłane. Jak już wszystkie będą oznaczone jako wysłane, oznacz wszystkie jako niewysłane, zatrzymaj skrypt (oraz ajaxowi prześlij, że to już koniec). Tyle ![]() -------------------- |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Odkopuję temat ponieważ nad nim właśnie siedzę a widzę że nie doszedł do końca.
1. Rozwiązanie AJAX czyli właściwie javascript wymusza aby użytkownik miał cały czas włączoną przeglądarkę. Jeżeli baza użytkowników jest duża to wysyłka może trwać np 3 godziny. To raczej nie jest dobre rozwiązanie polegać na użytkowniku. Pójdzie oglądać TV, komputer przejdzie w stan zatrzymania czy hibernacji albo dziecko podejdzie i włączy jakąś stronę - i po wysyłce. 2. Rozwiązanie CRON też rozważałem ale pytanie brzmi: ile razy wywołać tego crona? Jeżeli mam 1000 adresów to trzeba wywołać go 10 razy licząc po 100 e-maili co 5 minut. Ale ilość zapisanych do newslettera się zmienia i po pół roku może to być dwa razy tyle czyli 2000 co daje 20 wywołań. Z poziomu skryptów php z tego co wiem nie można ustawiać zadań CRONa. Na hostingach z którymi mam do czynienia albo pisze się do admina albo w jakimś panelu się ustawia. 3. Rozwiązanie sleep() w PHP czyli wstrzymanie wysyłki po 100 mailach na starcie odpada bo ograniczenie pt. czas wykonywania skryptu i tak wszystko przerwie. Jak to jest rozwiązane w skryptach typu phpmailer czy innych? Ten post edytował Brick 21.08.2010, 15:15:28 -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
![]()
Post
#12
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Nie stosuję rozwiązania 1 więc pominę je.
Rozwiązanie 2: Ustalasz w Cronie przedział godzinowy od której do której wysyła co ile i zapominasz o wszystkim ![]() ![]() Rozwiązanie 3: Skrypt pisze się w sposób rekurencyjny. Uruchamiamy skrypt który, sprawdza czy ma komuś coś do wysłania. Jeśli nie - killuje się. Jeśli tak to wywołuje sam siebie i daje sleep na 20 sekund. Po wyjściu ze sleep robi wysyłkę, oznacza wysłane i kończy się. Widzisz trick? W danej chwili może działać kilka skryptów tychże, choć większość jest uśpiona. Działają do padłego i jeśli dobrze napiszesz to odpalasz i możesz iść. Jak zapewne widzisz rozwiązanie 3 ma pewną wadę. Skrypt paść może tylko jeśli padnie serwer, bo nic nie może go wznowić samo z siebie. Źle napisany będzie chodził cały czas i nie da się go zatrzymać bez ingerencji w konsoli, bo każde wywołanie skryptu jest niejako osobnym procesem użytkownika. -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Czyli CRON wywołuje twój skrypt cały czas co 6 minut, bez przerwy. Trochę to denerwujące że coś tam cały czas w tle chodzi a wysyłka newslettera jest raz na miesiąc. Ale chyba nie ma innego rozwiązania.
W sposobie 3 jest za mała przerwa (20 sekund). Tu właśnie chodzi o to żeby wysłać 100, poczekać 10 minut i znowu wysłać 100. Chyba CRON jedynym wyjściem. Ciekawe czy można go ustawić na działanie od 23 do 6 rano co 10 minut? -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
![]()
Post
#14
|
|
![]() Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Ale dla mnie wywołać jeden skrypt który na starcie sprawdza jedno zapytanie to po prostu jakby wcale nic nie obciążało
![]() ![]() Sposób 3 można modyfikować jak się chce co do czasu. Ja ustawiam sobie na 20 sekund i sam skrypt odpalam w nocy Cronem. Obciążenie niemal zerowe serwera wtedy więc szybko przeleci po userach newslettera. I tak. reguły CRONa pozwalają na definiowanie zakresu godzin nie pamiętam czy dobrze teraz piszę ale wszędzie miałbyś gwiazdki oprócz 2 ostatnich pozycji odpowiedzialnych za godziny i minuty, które wyglądały by: 23-6 */10 -------------------- Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Dzięki za pomoc i sensowną rozmowę
![]() Nie ma innego sposobu jak CRON więc moje dylematy "chodzi coś a nie musi" można pominąć. Po prostu będzie odpalał skrypt który zrobi exit() i tyle. BTW powinni coś jednak zrobić żeby PHP mogło na CRON'a wpływać. Przynajmniej "uruchom/zatrzymaj proces" wcześniej zdefiniowany i zatwierdzony przez admina. Przydało by się nie jeden raz. -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 1 748 Pomógł: 388 Dołączył: 21.08.2009 Skąd: Gdynia Ostrzeżenie: (0%) ![]() ![]() |
na home.pl bez problemu możesz wpływać na cron'a ponieważ tam nie musisz go ustawiać w panelu, tylko wystarczy, że masz odpowiednio nazwany plik w głównym katalogu, więc z panelu admina po zatwierdzeniu skrypt zmieniałby tylko nazwę, no ale z drugiej strony jak dobrze napiszesz skrypt to nawet taki odpalany co 5min nie będzie stanowił żadnego obciążenia
|
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
A ja pisząc system do mailingu dodałem mu opcję on/off, dzięki temu na początku cron sprawdza czy mailing jest włączony, jeśli nie to nic nie robi. Jak dział marketingu doda mailing to włączamy system i cron już wie, że ma pobrać maile, wysłać, nieudane wysyłanie ponowić, niepoprawne adresy e-mail oznaczyć do weryfikacji. Wysyła, aż cały mailing się wyśle. Jak mailing się wyśle (i nie ma już nic do wysłania) to system się sam wyłącza.
Co prawda wywołanie crona pozostaje, ale pierwszy if go wyłącza, więc raczej nie obciąża to serwera. Idąc dalej tym tropem, można w ogóle dodać opcję usuwania wpisu z crontaba i dodawania nowego po dodaniu mailingu. Dzięki temu, jak nie ma nic do wysłania, to cron nie będzie się uruchamiał żeby sprawdzić czy coś jest czy nie. Na home.pl crona uruchamia się dodając plik cron_interwal.php, zatem usuwanie zadania z crona to po prostu usunięcie pliku -------------------- |
|
|
![]()
Post
#18
|
|
![]() Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat niepoprawne adresy e-mail oznaczyć do weryfikacji Skąd wiesz które są niepoprawne? Cytat nieudane wysyłanie ponowić Skąd mogą się wziąć nieudane? Timeout skryptu? Jeżeli ustawię na 100 e-maili w jednej paczce to może nie zmieścić się w 1 minucie? Czy UPDATE (info o poprawnym wysłaniu) robisz w pętli podczas wysyłania czy dopiero na końcu pętli w jednym zapytaniu? Cytat Na home.pl crona uruchamia się dodając plik cron_interwal.php, zatem usuwanie zadania z crona to po prostu usunięcie pliku No tak, na home.pl jest to dobrze pomyślane. Niestety na innych serwerach tego nie spotkałem tak więc nic uniwersalnego w tej kwestii nie napiszę. Najlepiej będzie zrobić jakiś on/off tak jak piszesz. Np plik w którym się zapisuje 1 lub 0 -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
Skąd wiesz które są niepoprawne? Robię prostą weryfikację wyrażeniami regularnymi +sprawdzanie checkdnsrr Skąd mogą się wziąć nieudane? Timeout skryptu? Jeżeli ustawię na 100 e-maili w jednej paczce to może nie zmieścić się w 1 minucie? Wysyłam maile przy pomocy PHPMailer, i jest tam funkcja IsError(), dzięki której można sprawdzić co się stało, że się nie wysłało. Jest np błąd: "Błąd SMTP: Następujący odbiorcy są nieprawidłowi:" i tu lista nieprawidłowych adresów. W zależności od rodzaju błędu - albo oznaczam maila jako niepoprawny albo dodaję mu +1 do prób wysłania, i później przy następnej pętli ponawiam próbę wysłania. Czy UPDATE (info o poprawnym wysłaniu) robisz w pętli podczas wysyłania czy dopiero na końcu pętli w jednym zapytaniu? Na koniec pętli, te adresy, na które wysyłanie nie zwróciło błędu uznaję za wysłane. Miałem jeszcze pomysł dodać logowanie na pocztę i sprawdzanie zwrotów (czasem mail się wyśle, a nie dotrze - serwer odbije). Tylko nie chciało mi się już w to bawić. -------------------- |
|
|
![]()
Post
#20
|
|
![]() Grupa: Zarejestrowani Postów: 107 Pomógł: 9 Dołączył: 16.02.2004 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Ok, dzięki za odpowiedzi.
Ja robię weryfikację poprawności adresu przy zapisywaniu do newslettera. Ciekawe jak PhpMailer sprawdza odpowiedź serwera pocztowego? W manualu PHP piszą: Cytat Informacja: Nie warto używać funkcji mail() do wysyłania dużej ilości e-maili stosując pętle. Ta funkcja otwiera i zamyka gniazdo SMTP dla każdego wysyłanego e-maila, a to jest mało wydajne. Do wysyłania dużej ilości e-maili można stosować pakiety » PEAR::Mail, i » PEAR::Mail_Queue. Czy ktoś używał tych pakietów i może podzielić się doświadczeniami? Na ile faktycznie jest to wydajniejsze od zwykłej funkcji mail()? Jak tego używać (najlepiej prosty przykład) -------------------- Wszystko należy robić najprościej jak się da, ale nie prościej
Albert Einstein |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 26.04.2025 - 04:20 |