W internecie każdy adres mailowy jest narażony na spam. Zabezpieczenie maili przed spamem w Smarty jest możliwe i w dodatku bardzo proste.
Trochę teorii
Do tej pory zabezpieczenie maila przed spamem odbywało się przez wpisanie zaszyfrowanego maila w postaci kodu hexadecymalnego lub odpowiednio spreparowanego kodu JavaScript.
Zajmowało to pewną ilość czasu oraz zachodu. Wpierw trzeba było odpowiednio zaszyfrować adres mailowy wraz z frazą „mailto:”, a później wstawić to do parametru HREF. Przyznam, że sam tak kiedyś robiłem.
Kolejną sprawą godną rozpatrzenia są skórki, które użytkownicy mogą sobie tworzyć. W tych skórkach może być potrzeba wpisania linka z mailem. Dobrze by było pomóc piszącym i oszczędzić im trudu szyfrowania maila.
Poza tym za robienie skórek nie raz będą się brać ludzie, którzy tylko trochę liznęli HTML i mogą nawet nie wiedzieć o potrzebie zabezpieczania maili, a o wykonaniu tego już nawet nie wspominam.
Zabezpieczenie maili przed spamem w Smarty
Podczas pisania poprzedniego artykułu „Własne funkcje w Smarty„, niektóre informacje czerpałem z gotowych funkcji i modyfikatorów zaimplementowanych w Smarty.
Kiedy przeglądałem funkcje w poszukiwaniu zwracania błędu, to natknąłem się na funkcję „mailto”. Już sama nazwa funkcji mówi, do czego ona służy.
Funkcja ta jest odpowiedzialna za wypisywaniu linka z mailem oraz odpowiednimi parametrami w postaci hexadecymalnej lub w JavasScript. A oto prosty przykład:
{mailto address="adres@domena.pl" text="Napisz do mnie"}
Ten krótki kawałek kodu jest odpowiedzialny na wypisanie linku z mailem. Anchor tekstem będzie fraza „Napisz do mnie”. A oto lista parametrów, które przyjmuje ta funkcja:
- address – adres mailowy
- text – anchor tekst
- encode – parametr odpowiadający za sposób kodowania – przyjmuje poniższe parametry
– none – brak kodowania
– hex – kodowanie hexadecymalne
– javascript
– javascript_charcode – kodowanie javascript za pomocą wartości ASCII - cc – wyślij kopię do …
- bcc – lista ukrytych odbiorców
- subject – temat wiadomości
- newsgroups – grupa do której chcemy napisać
- followupto – tu chyba nie muszę nic pisać
- extra
Z tych wszystkich parametrów, jedynie parametr „address” jest wymagany.
Ostatni parametr odpowiada za dodatkowe parametry, które chcemy by się znalazły w znaczniku A. Może to być np nazwa klasy, atrybut name, id lub to co sobie wymyślimy.
Parametr encode jest parametrem opcjonalnym. Jeśli opuścimy ten parametr, to zostanie do niego przypisana domyślna wartość, czyli „none”, a co za tym idzie, kodowanie zostanie wyłączone, a adres mailowy nie będzie zabezpieczony przed spamem.
Musimy też pamiętać o tym, że jeśli jest ustawione kodowanie heksadecymalne, to nie będzie można przekazać żadnego parametru dotyczącego samego maila czyli np tematu, kopii (CC), ukrytej kopii (BCC) itp.
Jeśli będziemy próbować takich kombinacji, to otrzymamy błąd Smarty oraz informację, że w takim przypadku kodowanie musi być ustawione na JavaScript.
Zabezpieczenie przed spamem jako modyfikator
Pamiętanie tych wszystkich danych i pisanie tego wszystkiego za każdym razem trochę mija się z celem i dobrze by było to sobie ułatwić. Aby to osiągnąć, napiszę modyfikator, który będzie oparty na funkcji Smarty „mailto”.
Modyfikator ten domyślnie nie będzie potrzebować żadnych informacji. Oczywiście bardzo często wykorzystuje się anchor tekst, temat wiadomości oraz różnego rodzaju dodatki. Dlatego przyjmiemy, że modyfikator będzie przyjmować parametry:
- anchor tekst
- temat wiadomości
- dodatki
Oczywiście wszystkie te parametry będą opcjonalne, a w miejsce brakującego anchor tekstu zostanie wpisany adres mailowy. Modyfikator nazwę po prostu mail i zapiszę w pliku modifier.mail.php. Przyjmuję, że kodowanie domyślnie będzie ustawione na heksadecymalne.
Kodowanie automatycznie się zmieni na JavaScript, jeśli będzie podany temat wiadomości. Oczywiście nic nie stoi na przeszkodzie, by domyślnie kodowanie było ustawione na JavaScript. A oto kod modyfikatora:
function smarty_modifier_mail($mail, $tekst='', $temat='', $dodatki=''){ if(!$tekst) $tekst=$mail; if($temat){ // JAVASCRIPT $mail='document.write(\'<a href="mailto:'.$mail.'?subject='.$temat.'" '.($tekst!=$mail?'title="'.$tekst.'"':'').' '.$dodatki.'>'.$tekst.'</a>\');'; $j=strlen($mail); $wynik='<script type="text/javascript">eval(unescape(\''; for($i=0; $i<$j; $i++) $wynik.='%'.bin2hex($mail[$i]); return$wynik.'\'))</script>'; } // HEX $wynik='<a href="mailto:'; $j=strlen($mail); for($i=0; $i<$j; $i++) $wynik.=preg_match('!\w!',$mail[$i])? '%'.bin2hex($mail[$i]) : $mail[$i]; $wynik.='" '.($tekst!=$mail?'title="'.$tekst.'"':'').' '.$dodatki.'>'; $j=strlen($tekst); for($i=0; $i<$j; $i++) $wynik.=''.bin2hex($tekst[$i]).';'; return$wynik.'</a>'; }
Wywołanie tego modyfikatora wygląda tak samo jak wywołanie wszystkich modyfikatorów:
{$adresMailowy|mail} {$drugiAdresMailowy|mail:"Napisz do mnie"} {$trzeciAdresMailowy|mail:"Napisz do mnie":"Wiadomość ze strony":"class='jakasKlasa' target='_blank'"}
Mam nadzieję, że w miarę prosto to wszystko opisałem i nie będziecie mieć z tym żadnych problemów. Miłego kodowania.
21 marca 2013 o 11:34
Słuszne sugestie. Pozdrawiam