Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Bezpieczny sposób wysyłania poczty przez PHP do wielu użytkowników

Nie ma powodu, dla którego nie mógłbyś napisać tego w PHP, chociaż ja bym nie uczynić go częścią procesu webrequest / HTTP. Z powodzeniem wdrożyłem do wysyłania lub odbierania 500 000 subskrybentów na mailing (w zależności od dostępnych danych lokalnych, ponieważ był to projekt specyficzny dla lokalizacji). To był projekt wewnętrzny, więc niestety nie ma dla ciebie kodu/pakietu, ale kilka wskazówek, na które się natknąłem:

Konfigurowanie dostawy

  • Zacząłem od samego phpmailera, aby zająć się formatowaniem, kodowaniem treści i nagłówków, dodawaniem załączników itp. Ta część działa dobrze i nie chciałbym pisać tego od zera.
  • Samo 'wysyłanie' wiadomości e-mail jest po prostu ustawieniem jakiejś flagi w bazie danych, czy / jak / co powinno zostać wysłane do (części) subskrybentów.
  • Po ustawieniu tej flagi zostanie ona automatycznie odebrana przez zadanie cron, bez udziału serwera WWW.
  • Zacząłem od mocno zanieczyszczonej bazy danych zawierającej miliony adresów e-mail, z których dużo były oczywiście niepoprawne, więc najpierw trzeba było sprawdzić wszystkie adresy e-mail pod kątem formatu, a następnie hosta:
    • filter_var($email, FILTER_VALIDATE_EMAIL); nad subskrybentami (i oczywiście przechowywaniem wyników) pozbyliśmy się pierwszych kilkuset tysięcy nieprawidłowych e-maili.
    • Podział hosta (i przechowywanie nazwę hosta) z wiadomości e-mail i weryfikację tego (czy ma rekord MX lub przynajmniej rekord A w DNS, ale pamiętaj:możesz wysłać wiadomość e-mail na adres IP [email protected][255.255.255.255] , więc zachowaj te prawidłowe)) pozbyłeś się więcej dobrej porcji. Adresy e-mail tutaj nie trwale wyłączone, ale z flagą stanu wskazującą, że są wyłączone z powodu nazwy domeny / adresu IP.
    • Skrypty zostały zmienione na wymagaj prawidłowe adresy e-mail w subskrypcji / przed wstawieniem, ten nonsens 'nie dostaniesz example@ sqldat.com ' zanieczyszczenie subskrypcji w bazie danych było po prostu śmieszne.
  • Teraz skończyłem z listą adresów e-mail, które mogły być ważne. Zasadniczo istnieją 3 sposoby wykrywania nieprawidłowych adresów (pamiętaj, że wszystkie może być tymczasowe):
    • Serwer natychmiast je odrzuca.
    • Wcześniej określony serwer po prostu nie nasłuchuje ruchu.
    • Są odbijane długo po tym, jak myślałeś, że je dostarczyłeś.
  • Dziwna rzecz, odbicia, które każdy serwer e-mail wydaje się mieć inny format i na początku były piekielnie do przeanalizowania, okazały się całkiem łatwe do przechwycenia za pomocą VERP . Zamiast analizować całe e-maile, dedykowany adres e-mail (nazwijmy go [email protected] ) został skonfigurowany tak, aby zamiast dostarczać do skrzynki pocztowej, przesyłać go za pomocą polecenia, a jeśli wysłaliśmy wiadomość e-mail na adres przykł[email protected] , Return-Path został ustawiony dla [email protected] . Łatwo analizowane przy odbiorze, a po tym, jak wiele odbić (skrzynka pocztowa nie może istnieć, skrzynka pocztowa może być pełna (tak, nadal!) itp.) Deklarujesz, że adres e-mail nie nadaje się do użytku, zależy od Ciebie.
  • Teraz bezpośrednia odmowa serwera. Prawdopodobnie mogliśmy zabrać się za odpowiednią konfigurację niektórych wtyczek MTA i/lub pisania dla nich, ale ponieważ e-maile były wrażliwe na czas i musieliśmy mieć absolutną konfigurowalną kontrolę nad wysyłką nad ostatnim użytecznym czasem dostarczenia (po którym e-mail nie był dłuższy interesujące dla użytkownika), ograniczanie przepustowości na serwer odbierający i ogólnie wszystko, zajęłoby mniej więcej tyle samo czasu napisanie mailera w PHP, który znaliśmy lepiej, który używał protokołu SMTP bezpośrednio do gniazda 25 na serwerach odbierających. Przy minimalnym nakładzie pracy wbudowana została możliwość innego transportu niż domyślne opcje w PHPMailerze. Protokół SMTP jest w rzeczywistości dość prosty, ale są pewne zastrzeżenia:
    • Wiele serwerów odbierających stosuje szarą listę:większość robotów spamujących nie będzie dbać o to, czy dotrze konkretna poczta, po prostu ją masowo. Tak więc, jeśli nieznany/jeszcze niezaufany nadawca wyśle ​​pocztę, zostanie ona tymczasowo odrzucona. Złap to (zazwyczaj kod 451) i umieść e-mail w kolejce do późniejszej próby.
    • Serwer poczty, zwłaszcza większych dostawców usług internetowych i bezpłatnych usług (gmail, hotmail/msn/live itp.) nie wytrzyma potoku poczty bez walki:po pierwszych kilkuset/tysięcach zaczynają odrzucać ty. Więcej o tym później.

Uzyskiwanie prędkości

  • Teraz mieliśmy system dostarczania, który działał, ale musiał być szybki . Wysyłanie 10 000 e-maili na godzinę jest w porządku, jeśli masz tylko 10 000 adresów do wysłania, ale wymagane minimum to około 200 000 na godzinę. Na początku był serwer dedykowany (który może mieć dość niską moc, bez względu na to, co robisz, większość czasu zajmuje dostarczanie wiadomości e-mail w sieci, a nie na serwerze).
  • Buforowanie adresów IP:pamiętasz wszystkie adresy IP, o które poprosiliśmy w nazwach hostów w adresach e-mail? Oczywiście zapisaliśmy je, a ciągłe sprawdzanie ich adresów IP powoduje znaczne opóźnienia. Jednak adresy IP mogą się zmienić:rekord DNS tam, inny MX w innym miejscu... dane szybko się starzeją. Przez większość czasu serwer nie wysyła niczego (oczywiście biuletyny z subskrypcjami pojawiają się w seriach), uruchomione jest zadanie cron o niskim priorytecie, sprawdzające wszystkie nazwy hostów ze starym adresem IP (jako nieaktualne wybraliśmy starsze niż 1 dzień) dla adresu IP , w tym te, które wcześniej nie miały żadnego (Nowe domeny są rejestrowane przez cały czas, więc dlaczego nie miałaby być dostępna dzień po tym, jak ktoś już entuzjastycznie zasubskrybował swój nowy adres e-mail? Lub rozwiązano problemy z serwerem z jakąś domeną itp.). Właściwie wysyłanie e-maili nie wymagało już więcej wyszukiwania domen.
  • Ponowne użycie połączenia SMTP:skonfigurowanie połączenia z serwerem zajmuje stosunkowo dużo czasu, aby dostarczyć wiadomość e-mail, gdy rozmawiasz bezpośrednio na porcie 25. Nie musisz konfigurować nowego połączenia dla każdego e-mail, możesz po prostu wysłać następny przez to samo połączenie. Trochę prób i błędów spowodowało ustawienie tutaj domyślnej wartości około 50 e-maili na połączenie (zakładając, że masz tyle lub więcej dla domeny). Jednak w przypadku niepowodzenia zamknięcia adresu e-mail i ponownego otwarcia połączenia w celu ponowienia próby czasami pomogło. Podsumowując, to naprawdę pomogło przyspieszyć rzeczy.
  • Pewna oczywista, tak oczywista, że ​​prawie zapomniałem o tym wspomnieć:marnotrawstwem byłoby tworzenie treści wiadomości e-mail na miejscu:jeśli jest to poczta ogólna, przygotuj treść (nieco zmieniłem PHPMailera, aby móc korzystać z e-maili z pamięci podręcznej), prawdopodobnie kilka dni wcześniej (jeśli wiesz zamierzasz wysłać maila w piątek, a twój serwer nie pracuje, dlaczego nie przygotować ich już w środę? Jeśli jest spersonalizowany, nadal możesz go przygotować wcześniej, mając wystarczająco dużo czasu, jeśli nie, przynajmniej niespersonalizowane porcje czekają na wyjście.
  • Wiele procesów. Czy wspomniałem, że większość czasu potrzebnego na dostarczenie wiadomości e-mail spędza się w sieci? Jeden proces mailingowy nie jest prawie w pełni wykorzystany na serwerze poczty e-mail, ledwo zauważalne obciążenie, a e-maile się rozchodzą. Pobaw się kilkoma procesami wysyłającymi różne części kolejki, aby zobaczyć, co jest właściwe dla twojego serwera/połączenia, ale pamiętaj o 2 bardzo ważnych rzeczach:
    • Różne procesy sprawiają, że jesteś bardzo podatny na warunki wyścigowe:bądź zwariowany absolutnie pewien masz w pełni odporny system, który nigdy wyślij tę samą pocztę dwa razy (trzy razy, a nawet więcej). Nie tylko poważnie denerwuje użytkowników, ale także zwiększa się ilość spamu.
    • Trzymaj domeny razem tam, gdzie to możliwe:wybierając losowo z kolejki, stracisz przewagę związaną z utrzymywaniem otwartego połączenia z serwerem odbierającym pocztę e-mail dla domeny.

Unikanie odrzuceń

  • Będziesz wysyłać dużo poczty. Dokładnie to robią spamerzy. Jednak nie chcesz być postrzegany jako spamer (w końcu nie jesteś, prawda)? Istnieje wiele mechanizmów, które całkowicie zwiększą Twoją wiarygodność w stosunku do serwerów odbierających:
  • Miej prawidłowy odwrotny DNS:procesy sprawdzające DNS należący do adresu IP, z którego wysyłana jest wiadomość e-mail bardzo dużo, jeśli domeny drugiego poziomu są takie same:czy wysyłasz pocztę w imieniu example.com ? Upewnij się, że odwrotny DNS Twojego serwera ma postać jakaś.example.com .
  • Opublikuj rekordy SPF dla swojej domeny:wyraźnie wskaż, że komputer używany do wysyłania zbiorczych wiadomości e-mail może i oczekuje, że będzie wysyłał pocztę z nagłówkami From/Return-Path.
  • pamiętaj o odrzuceniach :serwery nie lubią ciągle powtarzać, że różne adresy e-mail nie istnieją. Zautomatyzowane mechanizmy, a nawet administratorzy, zablokowali nasz serwer, gdy pracowaliśmy przez wszystkie niesprawdzone adresy e-mail, które (już) nie istnieją. Dopiero później zastosowaliśmy opcję double opt-in, więc baza danych była zaśmiecona literówkami, ludzie zmieniali adresy IP, a tym samym adresy e-mail, adresy e-mail do żartów i tak dalej. Pamiętaj, aby schwytać tych inwalidów i biorąc pod uwagę wystarczającą lub wystarczającą liczbę niepowodzeń, anuluj ich subskrypcję . Nie robią ci nic dobrego, pochłaniają zasoby, a jeśli naprawdę chcą, abyś e-mail i skrzynka pocztowa była dostępna później, będą musieli po prostu ponownie zasubskrybować.
  • DKIM to kolejny mechanizm, który może zwiększyć Twoją wiarygodność, ale ponieważ go (jeszcze) nie wdrożyliśmy, nie mogę Ci wiele o tym powiedzieć.
  • Rekordy MX:niektóre serwery nadal to lubią, jeśli serwer wysyłający jest również serwerem odbierającym dla domeny. W tamtym czasie mieliśmy tylko 1 MX, a ponieważ serwer pocztowy nadal nie był zbyt obciążony, nazwaliśmy go rezerwowym serwerem MX dla domeny. Normalny serwer MX nie serwer wysyłający subskrypcje, ponieważ czasowe zablokowanie przez serwer, na który próbujesz wysłać ważną wiadomość e-mail (klienci itp.), jest bardzo irytujące, ponieważ wysłałeś już ładunek mniej ważnych wiadomości. Ma najwyższą preferencję jako otrzymywanie MX, ale w przypadku niepowodzenia mieliśmy fajną premię, że nasz serwer wysyłający subskrypcję nadal będzie rezerwą do dostarczenia, więc w sytuacjach kryzysowych nadal moglibyśmy się do niego dostać, zapobiegając niezręcznym odesłaniom do klientów próbujących aby do nas dotrzeć.
  • Opowiedz im o sobie. Poważnie. Wielu głównych graczy korzystających z bezpłatnych adresów e-mail, takich jak live.com, oferuje możliwość zarejestrowania się w jakiś sposób lub uzyskania kontaktu, do którego można uzyskać pomoc i wsparcie, jeśli Twoje e-maile zostaną odrzucone. Jeśli masz uzasadniony powód, aby wysyłać tak wiele e-maili i jest prawdopodobne, że masz tak wielu subskrybentów, są szanse, że poważnie zwiększyli liczbę e-maili, które możesz wysłać na ich serwer na godzinę. Niewielki 1000 może stać się gdzieś w dziesięciu tysiącach lub nawet więcej, jeśli jesteś wystarczająco przekonujący i uczciwy. Mogą istnieć kontrakty, wymagania, które musisz spełnić, i obietnice, które musisz złożyć (i dotrzymać), aby mieć na to pozwolenie. Dostawcy usług internetowych to odrębna marka, a każdy inny gracz jest inny. Nie zawracaj sobie głowy dzwonieniem do nich zwykle, ponieważ w 99% przypadków jedyne numery, które możesz znaleźć, to tylko osoby chętne do rozwiązywania problemów z połączeniem internetowym, które rozumieją (lub są dozwolone) niewiele więcej. [email protected] adres e-mail to dobre miejsce na rozpoczęcie, ale sprawdź, czy możesz skądś znaleźć bardziej konkretny adres e-mail. Bądź precyzyjny, uczciwy i kompletny:mniej więcej ilu subskrybentów ma adres e-mail u tego dostawcy usług internetowych, jak często próbujesz je wysłać, jakie błędy lub odmowy otrzymujesz, jak wygląda proces subskrypcji i anulowania subskrypcji oraz na czym polega usługę, którą faktycznie świadczysz swoim klientom. Bądź też miły:jak ważne może być wysyłanie tych e-maili dla Twojej firmy, panikowanie z tego powodu i dochodzenie strasznych strat nie dotyczy ich. Uprzejme przedstawienie faktów i życzeń oraz pytanie to, czy mogą pomóc, a nie domagać się rozwiązania, to bardzo długa droga.
  • Ograniczanie:tak często, jak próbowałeś, niektóre serwery przyjmą od Ciebie tylko określoną ilość poczty na godzinę i/lub dzień. Poznaj te liczby (i tak rejestrujemy sukcesy i porażki), ustaw je na rozsądną wartość domyślną dla normalnych domen, ustaw je na uzgodnione limity dla większych graczy.

Unikanie oznaczania jako spam

  • Pierwsza zasada:nie spamuj!
  • Druga zasada:zawsze! Nie „jednorazowe”, nie „nie subskrybowali, ale może to być dla nich umowa na całe życie”, nie z najlepszymi intencjami, ludzie musieli prosić o twoje e-maile.
  • Oczywiście skonfiguruj poprawny mechanizm subskrypcji podwójnej zgody.
  • PHPMailer sam ustawia odpowiednie nagłówki,
  • Skonfiguruj łatwy mechanizm anulowania subskrypcji przez Internet (dołącz do niego link w każdym poczta), ewentualnie również e-mail i obsługa klienta, jeśli ją masz. Upewnij się, że obsługa klienta może anuluj subskrypcję osób bezpośrednio.
  • Jak wspomniano wcześniej:anulowanie subskrypcji (nadmierne) kończy się niepowodzeniem i odskakuje.
  • Unikaj spamerskich sformułowań „oferta życia”.
  • Oszczędnie używaj adresów URL w e-mailach.
  • Unikaj dodawania linków do domen pozostających poza Twoją kontrolą, chyba że masz absolutną pewność, że możesz im im ufać nie spamuj, jeśli nawet wtedy...
  • Dostarcz wartość dla użytkownika:bycie oznaczonym jako spam przez interakcję użytkownika w klientach poczty internetowej google/yahoo/live poważnie szkodzi przyszłym sukcesom (uwaga na stronie:jeśli się zarejestrujesz, live/msn/hotmail przekaże wszystkie e-maile wysyłane do Ciebie przez Twoją domenę, która jest oznaczona przez użytkowników jako spam. Naucz się to pokochać i jak zawsze:zrezygnuj z ich subskrypcji, wyraźnie nie chcą Twojego centrum handlowego i obniżają Twoją ocenę spamu).
  • Monitoruj czarne listy dla swojego adresu IP. Jeśli pojawisz się na jednym z nich, to już pożegnanie, więc natychmiastowe działanie, zarówno przy czyszczeniu swojego imienia, i ustalenie sprawy jest wymagane.

Pomiar sukcesu

  • Mając cały proces pod kontrolą, masz rozsądną pewność, że e-mail trafił gdzieś (chociaż może to być bitbucket MX lub folder spamu) lub zarejestrowałeś awarię i przyczynę. To zajmuje się numerami „faktycznie dostarczonymi”.
  • Niektórzy ludzie będą próbować przekonać Cię do dodania linków do obrazów online w swoich e-mailach (zarówno prawdziwych, jak i słynnych przezroczystych gifów 1x1), aby zmierzyć, ile osób faktycznie przeczytało Twoją wiadomość e-mail. Ponieważ wysoki procent blokuje te obrazy, liczby te są w najlepszym razie niepewne i uważamy, że po prostu nie powinniśmy się nimi przejmować, ich liczby są całkowicie niewiarygodne.
  • O wiele łatwiej jest zmierzyć rzeczywisty współczynnik sukcesu, jeśli chcesz, aby użytkownicy coś zrobili. Dodaj parametry do linków w wiadomości e-mail, aby zmierzyć, ilu użytkowników dotarło do witryny, do której linkujesz, czy wykonali pożądane czynności (obejrzeli film, zostawili komentarz, kupili towary).

Podsumowując, z całym logowaniem, interfejsem użytkownika, konfigurowalnymi ustawieniami dla domeny / adresu e-mail / użytkownika itp. Zbudowanie i wyeliminowanie dziwactw zajęło nam około 1,5 miesiąca. To może być sporą inwestycją w porównaniu z outsourcingiem e-maili, może nie być, wszystko zależy od wielkości i samego biznesu.

Teraz niech się zacznie płomień, że byłem głupcem, pisząc MTA w PHP, bardzo mi się to podobało (co jest jednym z powodów, dla których napisałem tak ogromną ilość tekstu) oraz niezwykle wszechstronne możliwości logowania i ustawień, na hosta alerty oparte na procentach niepowodzeń itp. sprawiają, że życie jest takie proste;)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Zatrzymaj okna usługi MySQL

  2. Zapytanie MySQL do wyszukiwania pola z ciągiem JSON

  3. mysql szukaj segmentu nazwy tabeli

  4. Pobierz dane z tabeli połączeń w Yii2

  5. Jak utworzyć bazę danych w MySQL Workbench za pomocą GUI