Kilka kwestii w sprawie newslettera

Zbliżam się właśnie do ukończenia aplikacji do wysyłania newsletterów. Zdawałoby się prosta sprawa ale specyfikacja zawierała kilka niespodzianek.

Zacznę może od założeń jakie wyżej wspomniana aplikacja spełnia.

Założenia

Subskrybentami newslettera są użytkownicy dwóch niezależnych portali, a dokładnie strony branżowej pewnej firmy oraz platformy stanowiącej pomost pomiędzy działem marketingu owej firmy oraz dziennikarzami. Oba z portali stoją na dwóch niezależnych serwerach.

Źródło „pochodzenia” dzieli w naturalny sposób subskrybentów na dwie kategorie. Ponadto system umożliwia ręczne grupowanie użytkowników według najróżniejszych parametrów. Każdy z subskrybentów może należeć do więcej niż jednej grupy.

Newsletter może być rozsyłany do jednej lub więcej grup subskrybentów przy czym zadbano o to aby żaden z użytkowników nie dostał danego biuletynu dwa razy.

Grupy subskrybentów posiadają priorytety decydujące o tym, którzy z subskrybentów otrzymają wiadomość jako pierwsi. Ponieważ pojedynczy newsletter może zostać zaadresowany do ponad 20 tys. adresatów, jego wysyłka może potrwać nawet kilka godzin. Jeśli w trakcie wysyłania jednego z biuletynów zostanie zredagowany i wysłany drugi newsletter to subskrybenci drugiego z priorytetem wyższym od adresatów pierwszego newslettera otrzymają wiadomość w pierwszej kolejności.

Człowiek istotą omylną jest, a co więcej swój błąd może dostrzec w chwili kiedy godzina „0” już minęła. Dlatego zaimplementowana została procedura wstrzymania wysyłki newslettera dająca możliwość dokonania drobnej korekty treści i kontynuowanie przerwanego procesu. Subskrybenci, którzy otrzymali wiadomość zawierającą błąd nie otrzymają poprawionej wiadomości.

Treść newslettera powstaje w kilku krokach – począwszy od zaplanowania, poprzez utworzenie, aż po akceptację. Następnie wraz z nastaniem określonej daty i godziny rozpoczyna się proces rozsyłania biuletynu do wybranych adresatów. Biuletyn wysyłany jest w formacie txt oraz html i może zawierać grafiki. Każdy z subskrybentów otrzymuje wiadomość spersonalizowaną przynajmniej w części zawierającej link z indywidualnym kodem autoryzującym umożliwiający wypisanie z newslettera. Po zakończeniu wysyłki treść wiadomości automatycznie kopiowana jest wraz z grafikami do aktualności w jednym z dwóch lub obu portalach.

Sprawy kluczowe

W trakcie implementacji największym problemem jest skala. Trudno przetestować wysyłanie newslettera do 20 tys. adresatów. Taką sytuację najprościej zasymulować uruchamiając na serwerze pocztowym usługę catch-all. Pozostaje wtedy jedynie wygenerować 20 tys. nieistniejących adresów mailowych, a wszystkie wiadomości trafią do utworzonej przez nas czarnej dziury. Nie jest to idealne rozwiązanie bo wszystko odbywa się w ramach jednej domeny.

Pojedynczą wiadomość trzeba wysłać do bardzo wielu subskrybentów. Intuicyjnie nasuwającym się rozwiązaniem byłoby wysłanie pojedynczego maila do pierwszego z adresatów, a reszta mogłaby teoretycznie otrzymać wiadomość na zasadzie ukrytej kopii. Nie jest to jednak dobry pomysł przynajmniej z kilku powodów. Po pierwsze (nie sprawdzałem tego, ale …) istniej zapewne ograniczenie liczby adresatów Bcc (blind carbon copy). Po drugie filtry antyspamowe nie chętnie przepuszczają tego typu wiadomości z uwagi na to, że tryb ten był kiedyś nagminnie stosowany do rozsyłania niechcianej poczty. Po trzecie nagłówki takich wiadomości zawierają informację o pierwotnym adresacie więc subskrybent jest w stanie łatwo się domyślić, iż dostał kopię, a to nie jest profesjonalne podejście. Po czwarte, ostatnie i rozstrzygające – poszczególne wiadomości pojedynczego newslettera są spersonalizowane (zwroty grzecznościowe, linki umożliwiające rezygnację z subskrypcji itp.). Trzeba wysyłać wiadomości pojedynczo, a jeśli wysyła się je w formacie html z dołączonymi grafikami do kilkudziesięciu adresatów to trzeba to robić partiami. Osobiście proponuję zatrudnić w tym celu crona, choć przychodzą mi do głowy też inne rozwiązania (i inne języki programowania jak Python na ten przykład).

Jak już jesteśmy przy kwestii wysyłania email-i za pośrednictwem PHP to polecam [Swift Mailer](http://swiftmailer.org/). Wersja 4 jest wygodniejsza w użyciu od poprzednich, a do tego napisana w PHP5 zatem obsługuje wyjątki co w przededniu 6 nie powinno już raczej dziwić 😉

Kolejnym wyzwaniem jest integracja dwóch niezależnych portali. Fizyczne rozdzielenie uniemożliwia współdzielenie zasobów tj. bazy danych czy katalogu z grafikami. W tej kwesti naturalnym rozwiązaniem wydaje się być SOAP. PHP5 ma już domyślnie dołączony dodatek napisany w C do obsługi SOAP-a, który bardzo ułatwia całą sprawę. Jedno czego nienawidzę w pracy z SOAP-em (i AJAX-em zresztą też choć w mniejszym stopniu) to debugowanie. Chwilę wahania miałem na etapie kopiowania grafik. Wystarczającym rozwiązaniem było by przesłanie SOAP-em linka do grafiki i zaciągnięcie jej np. CURL-em, tym bardziej że oficjalna specyfikacja traktująca o przesyłaniu danych binarnych SOAP-em nie wygląda zachęcająco. Chętnych zapraszam na stronę [SOAP Messages with Attachments](http://www.w3.org/TR/SOAP-attachments). Na szczęście da się to zrobić w dość prosty sposób przy pomocy Base64 i przesłać obrazki wraz z danymi tekstowymi. Prostą podpowiedź jak to zrobić znajdziemy na stronie [Being Binary in SOAP](http://blog.phpdeveloper.org/?p=88).

Posted in Priv byZbigniew Heintze

Jak szybko przetestować PHP 5.3

***Nowinki zabierają czas …***

Pracuję na Linuksie już jakiś czas ale nie lubię własnoręcznie kompilować źródeł. Wolę gotowe binarki. Obecnie uzywając Ubunu wystarczy klika magicznych komend aby postawic Apache z Mysql i PHP i szybko przystąpić do pracy. Tymczasem zachciało mi się wypróbować PHP 5.3.0. Na gotowe pakiety z PHP w tejże wersji w repozytoriach Ubuntu przyjdzie jeszcze trochę poczekać więc zatrudniłem google do poszukiwań jakiegoś poradnika opisującego jak szybko i bezproblemowo zkąpilować PHP-a. Okazało się, że jest tego masa w necie. Ponieważ bawię się ostatnio w wirtualki, przymierzyłem się do zainstalowania „developerskiej” wersji linuksa. Zastanawiając się nad wyborem dystrybucji brałem pod uwagę jakąś debiano – pochodną (z uwagi na moje dotychczasowe przyzwyczajenia) lub też arch linuxa tym bardziej, że we wpisie [Arch PHP Webdevelopment Platform](http://www.zyxist.com/pokaz.php/arch_php_webdevelopment_platform) na blogu Zyxa przeczytałem, iż zabrał się on za tworzenie specjalnie dydykowanych dla programistów PHP pakietów.

***… wcale nie :)***

Tymczasem znajomy używający Windowsa przesłał mi linka do strony [WampServer-a](http://www.wampserver.com/), gdzie zobaczyłem, że najnowsza wersja WampServer 2.0i z 11 lipca br. zawiera już wersję PHP 5.3.0. Kurcze – o mało nie uległem pokusie i przelogowania się na windowsa lub też zainstalowania wampa na moim wirtualnym Windowsie. Na szczęście przypomniałem sobie o ApacheFriends. Ku mojej radości oni równierz przygotowali [XAMPP-a z PHP 5.3](http://www.apachefriends.org/en/xampp-beta.html) na pokładzie. Na razie ma on status wersji beta, ale do wypróbowania wystarczy :D. No i można go uruchomić na linuksie w dosłownie chwilę. Wystarczy ściągnąć, rozpakować do opt-a, wyłączyć działające w tle serwery apacha i mysql-a oraz serwer ftp i uruchomić XAMPP-a. Najfajniejsze w tym jest to, że kiedy znudzi nam się zabawa wystarczy wyłączyć XAMPP-a i ponownie uruchomić wyłączone wcześniej usługi by powrócić do pracy. Ponieważ XAMPP ładowany jest do opt-a pozbycie się go w razie potrzeby też nie stanowi problemu. Polecam.

Posted in PHP | Tagged byZbigniew Heintze

MoonWalker

W związku ze śmiercią Michaela Jacksona powstała masa różnego rodzaju inicjatyw. Większość z nich ma na celu zarobienie jak największych pieniędzy, ale powstają też takie jak [eternal moonwalk](http://www.eternalmoonwalk.com/). Każdy na świecie może nagrać 10 sekundowy film i w ten sposób dołączyć do księżycowych spacerowiczów.

Nam również spodobała się ta idea, więc Filip przyniósł kamerę i po pracy poszliśmy na spacer.

**Pierwsze kroki były niepewne.**

**Z czasem nabraliśmy luzu.**

**Potem dostałem telefon.**

**Przyjąłem zamówienie na dostarczenie kilku akcesoriów.**

**Była zabawa.**

**Występ sceniczny znanego artysty.**

**Później przez scenę przepełzła jakaś glizda.**

Ostatecznie nie udało nam się umieścić naszego filmiku na [eternalmoonwalk.com](http://www.eternalmoonwalk.com/) z uwagi na zastrzeżone znaki towarowe, ale i tak było fajnie 😀

Posted in Priv byZbigniew Heintze

PHP 5.3

Jak większość programistów PHP od dłuższego czasu śledzę postęp prac nad PHP 6. Tymczasem wydano PHP 5.3 stanowiącą preludium przed wersją szóstą, a umożliwiającą zapozanie się z mającymi nadejść nowościami.

O tym co nowego w PHP 5.3 można się w skrócie dowiedzieć z newsa na webinside.pl [„Nowa wersja PHP – 5.3!”](http://www.webinside.pl/news/6090) lub dzienników zyx-owych [PHP 5.3.0 wydane](http://www.zyxist.com/pokaz.php/php_53_wydane). Z kolei zaglądając na stronę [PHP 5.3.0 Release Announcement](http://php.net/releases/5_3_0.php) poznamy szczegóły. Chcąc zapoznać się z przewidywalnymi problemami jakie mogą nas spotkać w procesie migracji do nowszej wersji warto też przeczytać [Migrating from PHP 5.2.x to PHP 5.3.x](http://pl.php.net/migration53). Warto też zajrzeć do artykułów na wortalu php.pl [Co nowego w php 5.3 – część 1](http://wortal.php.pl/wortal/artykuly/php/podstawy/co_nowego_w_php_5_3_czesc_1) i [Co nowego w php 5.3 – część 2](http://wortal.php.pl/wortal/artykuly/php/podstawy/co_nowego_w_php_5_3_czesc_2), które powstały jeszcze przed premierą.

Oczywiście największym moim zainteresowaniem cieszą się namespaces. Nie wiem w jakim procencie będę ostatecznie wykorzystywał cały potencjał tego nowego mechanizmu jednak już teraz wiem, że szybko zapoznam się z funkcją „class_alias”. Myślę, że podobnie powinni postąpić programiści Kohana PHP, którzy namiętnie nadużywają (a przynajmniej nadużywali) evala w swoim frameworku. Krąży taka anegdota, że funkcja eval w PHP 6 zmieni nazwę na evil 😉

Inną kwestią, która niekiedy mnie irytowała to ograniczenia jakie nałożone były na metody statyczne. [Late Static Bindings](http://pl2.php.net/lsb) ułatwi wykorzystywanie metod statycznych w połączeniu z dziedziczeniem i magicznym wywoływaniem. Natomiast nie bardzo na razie rozumiem dlaczego stworzono funkcję „forward_static_call”.

Kolosalne znaczenie przypisuję z kolei faktowi włączenia domyślnie do dystrubucji PHP rozszerzeń [FileInfo](http://pl.php.net/manual/pl/book.fileinfo.php) oraz [INTL](http://pl.php.net/manual/pl/book.intl.php). Pierwsze z wymienionych umożliwia jakże istotne z punktu widzenia bezpieczeństwa sprawdzenie mimetype pliku. Dotąd też było to możliwe i to na kilka sposobów. Trudność polegała głównie na tym, że funkcje, lub metody umożliwiające detekcję typu pliku dostępne były w dodatkach PECL „FileInfo” lub „Mimetype” (obecnie zdepreconowanego) nie zawsze uwzględnione w konfiguracji PHP zainstalowanej na tym czy tamtym serwerze.

Drugi ze wspomnianych dodatków z kolei stanowi rozbudowane narzędzie do internacjonalizacji, które przynajmniej w założeniu rozwiąże wiele istotnych problemów związanych z tym zagadnieniem.

To mi się podoba

Może to drobiazg, ale parę razy zdarzyło mi się pisanie funkcji „lcfirst”. Może to i banał jednak skoro istnieje funkcja „ucfirst”, powołanie do życia funkcji „lcfirst” wydało mi się jak najbardziej uzasadnione 😀

Posted in PHP | Tagged byZbigniew Heintze