Jak wysłać e-mail za pomocą PHP za pomocą Twilio SendGrid i Mezzio?
Opublikowany: 2021-03-24Poczta e-mail jest tak samo ważnym narzędziem komunikacji jak zawsze. Aby pomóc Ci lepiej wykorzystać pocztę elektroniczną, pokażę Ci, jak wysyłać wiadomości e-mail za pomocą frameworka Mezzio PHP i API Twilio SendGrid.
W szczególności dowiesz się, jak wysyłać wiadomości e-mail z treściami w postaci zwykłego tekstu i HTML, w tym z załącznikiem PDF. Dowiesz się również, jak korzystać z funkcji szablonów transakcyjnych Twilio SendGrid, aby uprościć tworzenie treści wiadomości e-mail zarówno przez zespół programistów, jak i każdy inny zespół w Twojej organizacji.
Brzmi dobrze? Zaczynajmy.
Szybki przegląd aplikacji
Aby uczynić ten samouczek bardziej znaczącym, udawaj, że kod, który napiszemy, jest częścią fikcyjnego, internetowego sklepu e-commerce zbudowanego za pomocą Mezzio, o nazwie The Little PHP Shop — a konkretnie części bezpośrednio po dokonaniu przez klienta zakupu. Na tym etapie przepływu użytkownika klient otrzymuje wiadomość e-mail z podziękowaniem za zakup i dołącza do swojej dokumentacji fakturę PDF.
Zamierzamy utworzyć klasę Handler, aby wysłać wiadomość e-mail po zakupie, która otrzyma szczegóły zakupu z zamówienia zrealizowanego przez klienta. Dzięki tym informacjom o zakupie klasa Handler użyje kilku klas w interfejsie API SendGrid PHP do zbudowania i wysłania wiadomości e-mail z potwierdzeniem zakupu.
Spośród nich najważniejsze to „SendGrid\Mail\Mail” i „\SendGrid”. „SendGrid\Mail\Mail” to obiekt przechowujący wszystkie właściwości wiadomości e-mail, którą wyślemy za pośrednictwem usługi Twilio SendGrid. Obiekt „SendGrid” tworzy warstwę transportową, ułatwiając wysyłanie wiadomości e-mail przez Twilio SendGrid.
Warunki wstępne
Aby ukończyć ten samouczek, będziesz potrzebować następujących 4 rzeczy w lokalnym środowisku programistycznym:
- Konto Twilio SendGrid
- PHP 7.4 z zainstalowanymi i włączonymi rozszerzeniami cURL , mbstring i Open SSL
- Composer zainstalowany na całym świecie
- kędzior
Rusztuj aplikację Mezzio
Najpierw musimy stworzyć aplikację bazową. Aby to zrobić, jak zwykle użyjemy szkieletu Mezzio , aby zrobić to za nas. Gdy już stworzymy szkielet aplikacji bazowej, przełączymy się do nowo utworzonego katalogu projektu. Następnie uruchom następujące polecenia w swoim terminalu, postępując zgodnie z monitami dotyczącymi pierwszego:
Zainstaluj wymagane zależności
Z rusztowaniem projektu musimy dodać 3 dodatkowe zależności, aby ukończyć projekt. To są:
- Biblioteka PHP API Twilio SendGrid do interakcji z API Twilio SendGrid
- Klient PHP HTTP do wysyłania żądań HTTP
- PHP Dotenv do przechowywania i pobierania zmiennych środowiskowych
Aby je zainstalować, uruchom następujące polecenie w swoim terminalu:
Zainicjuj PHP Dotenv
Po zainstalowaniu zależności ładujemy PHP Dotenv, aby odczytał zmienne ustawione w „.env” i udostępnił je PHP jako zmienne środowiskowe. Aby to zrobić, wstaw następujący kod w „public/index.php”, zaraz po „require vendor/autoload.php”.
Dodaj dane swojego konta Twilio SendGrid
Teraz musisz dostarczyć aplikacji swój klucz API SendGrid. Aby to zrobić, po zalogowaniu się do Twilio SendGrid przejdź do „Ustawienia -> Klucze API . " Raz tam:
- Kliknij „ Utwórz klucz API ”, aby utworzyć klucz API
- Nadaj nazwę nowemu kluczowi API, zaakceptuj domyślne uprawnienia klucza API „ Pełny dostęp ” i kliknij „ Utwórz i wyświetl ”
Po utworzeniu klucza API kliknij i skopiuj klucz, a następnie kliknij „ Gotowe . ”
Następnie dodaj 2 kolejne klucze do pliku: „SENDGRID_DEFAULT_SENDER_ADDRESS” i „SENDGRID_DEFAULT_SENDER_NAME”. Jak wskazują nazwy, są to adresy e-mail i imię i nazwisko, których będziemy używać we wszelkich wiadomościach e-mail wysyłanych z naszej aplikacji, chyba że zostaną one zastąpione.
Uwaga: Aby to zrobić, w Uwierzytelnianiu nadawcy upewnij się, że w tabeli „Weryfikacja pojedynczego nadawcy” jest napisane „Zweryfikowano”.
Ustaw szczegóły konfiguracji poczty aplikacji
Oprócz klucza interfejsu API Twilio SendGrid będziemy przechowywać kilka innych globalnych ustawień konfiguracji poczty. W szczególności ustawimy adres e-mail nadawcy i adres e-mail oraz imię i nazwisko, których będziemy używać w każdej wiadomości e-mail. W ten sposób nie musimy ich ustawiać za każdym razem.
Zamierzamy również utworzyć 2 szablony treści wiadomości e-mail: jeden dla wiadomości e-mail w postaci zwykłego tekstu i jeden dla wiadomości e-mail w formacie HTML. Aby to zrobić, w „config/autoload” utwórz nowy plik o nazwie „mail.global.php” i dodaj w nim następujący kod.
Utwórz klasę, aby utworzyć instancję obiektu poczty
Mając ustawione kluczowe szczegóły konfiguracji aplikacji, utwórzmy teraz klasę, która będzie tworzyć instancję podstawowego obiektu poczty z domyślnymi ustawieniami właściwości. Aby to zrobić, w nowym katalogu „src/App/src/Mailer” utwórz nowy plik o nazwie „SendGridMailMessageFactory.php” i dodaj do niego poniższy kod.
Kiedy wywołujemy klasę, ma ona dostęp do kontenera wstrzykiwania zależności (DI) aplikacji, z którego pobiera szczegóły konfiguracji, które zapisaliśmy w „config/autoload/mail.global.php”.
Następnie utworzy instancję nowego obiektu „SendGrid\Mail\Mail” i ustawi od oraz odpowie na szczegóły, przekazując odpowiednie szczegóły konfiguracji do wywołań odpowiednio metod „Mail”, „setFrom” i „setReplyTo”. Następnie zwróci skonkretyzowany obiekt „Mail”.
Aby jednak z niego skorzystać, musisz zarejestrować go w kontenerze DI. Aby to zrobić, w „src/App/src/ConfigProvider” dodaj następujący wpis do elementu „factories” w tablicy zwróconej przez metodę „getDependencies”.
Utwórz Handler, aby wysłać e-mail
Następnie musimy stworzyć klasę Handler do tworzenia i wysyłania e-maili. Aby to zrobić, użyjemy narzędzia Mezzio CLI , dostępnego w Composer, uruchamiając poniższe polecenie.
Uruchomienie powyższego polecenia robi dla nas cztery rzeczy:
- Tworzy nową klasę Handler, „src/App/Handler/EmailSenderHandler.php ”
- Tworzy klasę fabryczną w celu utworzenia instancji klasy Handler „src/App/Handler/EmailSenderHandlerFactory.php”
- Tworzy plik szablonu („src/App/templates/app/email-sender.html.<ext>”), którego nie będziemy potrzebować . Nazwa pliku „<ext>” jest określana przez silnik szablonów wybrany na etapie „tworzenia projektu”.
- Rejestruje nową klasę Handler jako usługę w kontenerze DI, dodając wpis do „config/autoload/mezzio-tooling-factories.global.php”
Refaktoryzuj Handler, aby wysyłać e-maile
Po utworzeniu „EmailSenderHandler.php” musimy teraz zrefaktoryzować go, aby mógł wysyłać e-maile. W tym celu najpierw dokonamy refaktoryzacji konstruktora „EmailSenderHandler”, zastępując parametr „TemplateRendererInterface” 3 nowymi parametrami. Spowodują one zainicjowanie 3 nowych zmiennych składowych klasy:
- Obiekt „\SendGrid\Mail\Mail”
- Obiekt „\SendGrid”
- Tablica zawierająca wymagane szczegóły konfiguracji
Możesz zobaczyć poprawiony konstruktor w poniższym przykładzie, wraz z powiązanymi zmiennymi składowymi klasy. Zastąp istniejącą zmienną składową klasy i konstruktora tym kodem.
Uwaga: Następnie musimy dokonać refaktoryzacji metody „uchwytu”. Zastąp istniejącą zawartość metody „EmailSenderHandler” „handle” poniższym kodem, a następnie przejdźmy przez to, co robi.
Rozpoczyna się od użycia „$request->getParsedBody()”, aby pobrać dowolne parametry podane w treści żądania, które zwróci tablicę asocjacyjną, inicjując „$details”. Mając dostępne parametry, wywołuje metodę „addTo” obiektu „SendGrid\Mail\Mail”, aby ustawić odbiorcę wiadomości e-mail, przekazując adres e-mail i nazwę odbiorcy w pierwszych 2 argumentach oraz tablicę podstawień w trzecim argumencie.
Zastępstwa pozwalają dostosować wiadomości e-mail dla każdego odbiorcy. W wiadomościach e-mail w postaci zwykłego tekstu każdy ciąg bezpośrednio otoczony myślnikami, np. „-first_name-” jest substytucją. W wiadomościach e-mail HTML używa składni Handlebars , która otacza ciągi z podwójnymi nawiasami, np. „{{ first_name }}”.
Następnie ustawiamy temat wiadomości i dodajemy tekst jawny oraz treść wiadomości HTML. Dzięki temu nasz e-mail jest gotowy do wysłania. Używamy więc obiektu „SendGrid”, „$this->mailer”, aby go wysłać, inicjując nową zmienną „$response” z odpowiedzią z próby wysłania wiadomości. Na koniec zwracamy obiekt JsonResponse zawierający kod statusu i treść odpowiedzi.
Uwaga: Refactor EmailSenderHandlerFactory metoda __invoke
Teraz, gdy zakończyliśmy refaktoryzację „EmailSenderHandler”, musimy dokonać refaktoryzacji „EmailSenderHandlerFactory”. Spowoduje to prawidłowe utworzenie instancji „EmailSenderHandler”. Aby to zrobić, zastąp istniejącą definicję metody „__invoke`” następującym kodem.
Pobiera to obiekt „\SendGrid\Mail\Mail” z kontenera DI, wstępnie zainicjowany z nadawcą i odpowiedzią na szczegóły wiadomości e-mail oraz inicjuje nowy obiekt o nazwie „$message”. Następnie tworzy instancję nowego obiektu „SendGrid” o nazwie „$mailer” do wysyłania wiadomości e-mail. Na koniec pobiera konfigurację poczty z konfiguracji aplikacji. Następnie używa ich do inicjalizacji i zwrócenia obiektu „EmailSenderHandler”.
Zaktualizuj tablicę routingu
Po tych wszystkich zmianach należy wprowadzić jeszcze jedną zmianę, zanim będziemy mogli przetestować kod i wysłać e-mail. Musimy zaktualizować tablicę routingu, aby domyślna trasa używała naszej nowej klasy Handler jako procedury obsługi trasy, zamiast „HomePageHandler”. Aby to zrobić, zastąp definicję trasy domyślnej w „config/routes.php” następującym przykładem.
Wyślij pierwszego e-maila
Teraz nadszedł czas na wysłanie pierwszego e-maila. Aby to zrobić, najpierw uruchom aplikację, uruchamiając poniższe polecenie w terminalu.
Następnie, korzystając z cURL, wyślij żądanie GET do „ http://localhost:8080 ”, jak w poniższym przykładzie, zastępując wartości w nawiasach ostrych odpowiednimi szczegółami wiadomości e-mail.
Powinieneś zobaczyć wyjście „{„status”:202,„wiadomość”:””}” na terminalu i powinieneś otrzymać wiadomość e-mail, która wygląda jak na poniższym obrazku.
Uwaga: Używaj szablonów transakcyjnych wiadomości e-mail zamiast ciągów szablonów
Chociaż byliśmy w stanie wysłać wiadomość e-mail zarówno w postaci zwykłego tekstu, jak i treści HTML, sposób, w jaki to zrobiliśmy, nie jest jednak idealny. Do każdego wysyłanego przez nas e-maila — a nasza aplikacja może w końcu wysłać całkiem sporo — musimy dodać dla nich zwykły tekst i treść HTML.
Jednak przechowywanie definicji treści wiadomości e-mail w kodzie nakłada większość wysiłku na zespół programistów. Jednak, przynajmniej z mojego doświadczenia, często zdarza się, że inne zespoły, często marketingowe, tworzą i utrzymują szablony e-maili.
Z tego powodu, a także ponieważ przyspieszyłoby to rozwój i dzielenie obciążenia między wiele zespołów, zamierzamy zrefaktoryzować aplikację tak, aby korzystała z szablonów transakcyjnych wiadomości e-mail . Możesz je tworzyć i konserwować za pomocą interfejsu użytkownika Twilio SendGrid przez członków zespołu, którzy mogą mieć niewielkie lub żadne doświadczenie techniczne, zamiast w kodzie.
Jeśli nie słyszałeś o nich, glosariusz Twilio SendGrid definiuje je w następujący sposób:
Szablony transakcyjnych wiadomości e-mail to wstępnie zakodowane układy wiadomości e-mail, których marketerzy, projektanci i programiści mogą używać do szybkiego i łatwego tworzenia transakcyjnych kampanii e-mailowych. Szablony transakcyjnych wiadomości e-mail Twilio SendGrid umożliwiają osobom nietechnicznym i technicznym wprowadzanie zmian w czasie rzeczywistym w wiadomościach e-mail otrzymywanych przez ich odbiorców.
W tym artykule potrzebujemy tylko dość podstawowego. Aby to zrobić, postępuj zgodnie ze szczegółami w dokumentacji Twilio SendGrid i utwórz taki, który ma jako swoją zawartość tylko w module jednotekstowym. Następnie jako tekst podstawowy użyj poniższego tekstu.
Zwróć uwagę, że w e-mailu znajduje się 6 podmian:
- „first_name”: imię klienta
- „last_name”: Nazwisko klienta
- „sender_name”: nazwa sklepu internetowego (The Little PHP Shop)
- „sender_state”: Stan sklepu internetowego
- „sender_country”: kraj sklepu internetowego
- „support_email”: adres e-mail pomocy technicznej, z którego klienci mogą korzystać, aby uzyskać wsparcie posprzedażowe
Biorąc to pod uwagę, musimy udostępnić te informacje naszej aplikacji. Imiona i nazwiska klienta już znamy. Pozostałe 4 podstawienia będą globalne, więc tak jak to zrobiliśmy wcześniej, dodamy poniższą konfigurację do „ config/autoload/mail.global.php ”, po elemencie „templates”.
Po utworzeniu nowego pliku konfiguracyjnego w metodzie „EmailSenderHandler” „handle” zastąp 2 wywołania „$this->mail->addContent()” następującym kodem.
Dwa wywołania metod dodają dane nadawcy i obsługują adres e-mail jako globalne podstawienia. Te podstawienia dotyczą treści wiadomości e-mail przed innymi podstawieniami, ale są zastępowane, jeśli istnieją podstawienia z tym samym kluczem dla odbiorcy wiadomości e-mail.
Następnie musisz pobrać identyfikator szablonu transakcyjnego e-maila. Możesz go znaleźć, klikając nazwę szablonu na liście szablonów , jak widać na poniższym zrzucie ekranu.
Skopiuj go i przechowuj w „config/autoload/mail.global.php” w nowym elemencie z kluczem „template_id”, a następnie usuń „plain” i „HTML”. Po zakończeniu element „mail/templates” zwróconej tablicy będzie wyglądał jak poniższy kod, gdzie „<identyfikator szablonu>” zastępuje identyfikator szablonu.
Po zaktualizowaniu konfiguracji musimy teraz dodać wywołanie metody „Mail” „setTemplateId” w metodzie „EmailSenderHandler” „handle”, przekazując identyfikator szablonu, który właśnie dodaliśmy do „config/autoload/mail.global”. php.” Możesz zobaczyć przykład w poniższym kodzie.
Przetestujmy zmiany
Tak jak poprzednio, używając cURL, wyślij żądanie GET do „ http://localhost:8080 ”, aby sprawdzić, czy zmiany działają zgodnie z oczekiwaniami. Powinieneś zobaczyć wyjście „{„status”:202,„wiadomość”:””}” na terminalu, tak jak w poprzednim przykładzie. W skrzynce odbiorczej e-mail powinien pojawić się piękny e-mail z zastąpionymi zastąpieniami, jak na poniższym zrzucie ekranu.
Dołącz fakturę PDF
Teraz, gdy korzystamy z szablonów dynamicznych, dołączmy fakturę PDF, o której mówiliśmy na początku artykułu. Aby zaoszczędzić czas i wysiłek związany z samodzielnym poszukiwaniem lub tworzeniem faktury, przygotowałem przykładową fakturę PDF , której możesz użyć w tym artykule. Zapisz go w katalogu „ data” aplikacji .
Uwaga: Aby dołączyć fakturę, musimy skorzystać z metody „Mail” „addAttachment”, którą można zobaczyć w kolejnym przykładzie kodu. Metoda przyjmuje 5 argumentów, ale dostarczamy tylko pierwsze 4. Są to:
- Obiekt „ Załącznik” lub ciąg zakodowany w Base64 . Jeśli wartość tego parametru nie jest zakodowana w base64, metoda zrobi to za nas.
- Typ MIME załącznika (obecnie znany jako typ mediów ).
- Nazwa pliku załącznika . Jest to nazwa, pod którą plik zostanie domyślnie zapisany, chyba że użytkownik ją zmieni.
- Dyspozycja zawartości załącznika . Jeśli nie jesteś zaznajomiony z dyspozycją zawartości, wbudowana dyspozycja zawartości oznacza, że załącznik powinien być automatycznie wyświetlany po wyświetleniu wiadomości, a dyspozycja zawartości załącznika oznacza, że załącznik nie jest wyświetlany automatycznie i wymaga jakiejś formy działania od użytkownika, aby Otwórz to.
W poniższym przykładzie kodu metoda PHP file_get_contents odczytuje zawartość pliku do nowej zmiennej o nazwie „$invoice”. Następnie plik PDF dołącza się do wiadomości, wywołując metodę „addAttachment”.
Tutaj my:
- Przekaż treść faktury, która będzie zakodowana w Base64
- Ustaw typ MIME na „aplikacja/pdf”, ponieważ dołączamy plik PDF
- Ustaw nazwę pliku faktury na fikcyjną nazwę, której klient może racjonalnie oczekiwać
- Ustaw dyspozycję zawartości na „załącznik”
Teraz, gdy zakończyliśmy te zmiany, sprawdźmy, czy działają. Uruchom to samo żądanie cURL, które uruchamialiśmy poprzednie 2 razy. Następnie w skrzynce odbiorczej e-mail powinien pojawić się piękny e-mail z przykładową fakturą PDF widoczną podczas przeglądania wiadomości e-mail.
Oto jak wysyłać wiadomości e-mail za pomocą PHP za pomocą Twilio SendGrid i Mezzio
Chociaż tylko zarysowaliśmy powierzchnię tego, co jest możliwe podczas wysyłania wiadomości e-mail za pomocą Twilio SendGrid i Mezzio, możesz teraz wysłać wiadomość e-mail ze zwykłym tekstem i treścią HTML, a także z załącznikiem. Nauczyłeś się również, jak korzystać z szablonów transakcyjnych i zamienników, które można ustawiać globalnie i na odbiorcę.
Gorąco zachęcam do zapoznania się z dokumentacją biblioteki PHP, aby zobaczyć, co jeszcze jest dostępne, takie jak planowanie wysyłek e-maili, załączanie pliku z Amazon S3, dodawanie nagłówków oraz dodawanie sekcji i kategorii.
Matthew Setter jest edytorem PHP w zespole Twilio Voices i – oczywiście – programistą PHP. Jest także autorem Mezzio Essentials . Kiedy nie pisze kodu PHP, edytuje świetne artykuły PHP w Twilio. Można się z nim skontaktować przez:
- E-mail: [email protected]
- Sieć: http://matthewsetter.com
- Twitter: @settermjd
- GitHub: https://github.com/settermjd