Postal – wysyłka email w ASP.NET MVC

Wysyłka email w ASP.NET MVC

Wcześniej, czy później w aplikacji następuje potrzeba wysłania wiadomości email do użytkownika. W aplikacji ASP.NET MVC można zrobić to na wiele sposób. Możemy ręcznie przygotować treść wiadomości oraz wysłać ją z wykorzystaniem klasy SmtpClient. Możemy też skorzystać z tego, co daje ASP.NET MVC i użyć widoki do generowania treści wiadomości. W tym wpisie pokaże jak wykorzystać bibliotekę Postal do wysyłki email w ASP.NET MVC.

Postal – przygotowanie wiadomości

Biblioteka Postal (a dokładnie Postal.MVC5 dla piątej wersji frameworka) bazuje na silniku ASP.NET MVC do generowania treści wiadomości email. Możemy korzystać z silnie typowanych widoków jak podczas codziennej pracy. Jest kilka drobnych różnic w stosunku do używania normalnych widów.

W pierwszej kolejności model przekazywany do widok musi dziedziczyć po klasie Email. Oczywiście możemy do niego dodać własne właściwości na podstawie, których później przygotujemy w widoku treść wiadomości. Najlepiej zobaczyć to na przykładzie wiadomości wysyłanej do użytkownika po założeniu konta:

W przykładzie do widoku przekazuje imię użytkownika oraz jego adres email. Sam widok różni się od zwykłego widoku informacjami o wysyłce email na początku widoku:

Na początku widoku określamy ustawienia do wysyłki wiadomości między innymi:

  • To – email użytkownika
  • Subject- tytuł wiadomości
  • inne ustawienia takie jak kopia, ukryta kopia itp. opisane w dokumentacji

Domyślnie widok powinien znajdować się w katalogu ~/Views/Emails lub ~/Views/Shared. Można to zmienić na przykład w konstruktorze klasy dziedziczącej po Email.

Postal – wysyłka wiadomości

Wysyłka wiadomości z wykorzystaniem Postal również jest bardzo prosta. Wystarczy utworzyć instancje wcześniej utworzonej klasy dziedziczącej po Email (w przykładzie to RegisterEmail) i wywołać metodę Send z tej klasy. W swoich aplikacjach logikę tą zamykam w dedykowanych klasach, aby można było to później dużo łatwiej testować za pomocą testów jednostkowych.

W przykładzie utworzyłem klasę UsersMailer, która zawiera metody związane z wysyłką wiadomości email dla użytkowników:

Do poprawnej wysyłki wiadomości potrzebna jest jeszcze konfiguracja SMTP (poniżej przykład dla gmail) w web.config:

W wyniku działania powyższego kodu otrzymamy takiego email:

testowy email wysłany przez bilbiotekę Postal

HttpContext?

Domyślnie Postal podobnie jak inne tego typu biblioteki wymaga, aby wygenerowanie treści wiadomości odbyło się w ramach żądania HTTP. Natomiast nam bardzo często zależy, aby wiadomość była dostarczona. Niestety wcześniej, czy później może się okazać, że serwer SMTP nie będzie odpowiadał, przez co wysłanie emaila w ramach żądania HTTP, w którym przyszły dane będzie kończyło się wyjątkiem i komunikatem dla użytkownika.

Dlatego lepiej skorzystać z jakiegoś mechanizmu, który będzie kolejkował wysyłanie wiadomości oraz je ponawiał, gdy będą jakieś problemy. W kolejnym wpisie pokaże jak to zrobić z wykorzystaniem biblioteki Hangfire. Tylko, że podczas wysyłki wiadomości w tle nie mamy dostępu do kontekstu HTTP, więc biblioteka do wysyłki wiadomości musi umożliwić działanie bez kontekstu. Na szczęście bibliotek Postal daje taką możliwość.

Aby wysyłać wiadomość bez kontekstu HTTP należy trochę zmienić metodę wysyłającą wiadomość. W swoim kodzie dodaje bazową klasę BaseMailer, która jest klasą bazową dla wszystkich klas wysyłających emaile. BaseMailer zawiera metodę Send, który nie wymaga kontekstu HTTP. BaseMailer wygląda następująco:

Jak widać musimy do klasy EmailService z biblioteki Postal przekazać ręcznie informacje o silnikach generujących widoki. Dodatkowo zmieniam też domyślną lokalizację plików widoków dla wiadomości. Widoki podobnie jak normalne widoku grupuje w dedykowane foldery dla każdej klasy Mailer, co powoduje więcej porządku, gdy w aplikacji wysyłamy wiele różnych wiadomości email. W przykładzie lokalizacja pliku widoku zmieni się z ~/Views/Emails/Register.cshtml na ~/Views/Emails/Users/Register.cshtml

Natomiast sama klasa UsersMailer docelowo wygląda tak:

Zmieniły się dwie rzeczy:

  • UsersMailer dziedziczy po BaseMailer (linijka 1)
  • Zamiast wywołania metody Send z RegisterEmail, wywołujemy metodę Send z klasy bazowej i przekazujemy obiekt RegisterEmail jako parametr (linijka 11)

Podsumowanie

Dzięki bibliotece Postal możemy w łatwy sposób wysyłać email w ASP.NET MVC pisząć praktycznie ten sam kod, jaki tworzymy podczas pracy z normalnymi widokami. Dodatkowo Postal wspiera wysyłanie wiadomości bez żadania HTTP, dzięki czemu możemy ją wykorzystać w wysyłania wiadomości z wykorzystaniem kolejek, aby zapewnić większą niezawodność aplikacji. O tym będzie w kolejnym wpisie na blogu.

Zachęcam do pobrania przykładu z githuba i przetestowania biblioteki w praktyce. Po pobraniu przykładu należy dodać w web.config informacji o serwerze SMTP.

A Ty w jaki sposób wysyłasz wiadomości email w swoich aplikacjach?

1 thought on “Postal – wysyłka email w ASP.NET MVC

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *