Jak odbierać wiadomości e-mail za pomocą Flask Framework dla Pythona?

Opublikowany: 2020-04-30

Chociaż w Internecie jest wiele samouczków na temat wysyłania wiadomości e-mail, niewiele jest informacji o tym, jak skonfigurować aplikację do ich odbierania i przetwarzania. Jest to zadanie, które może być niezwykle trudne, jeśli próbujesz skonfigurować wszystko samodzielnie, ale jest tak proste, jak odbieranie żądania internetowego podczas korzystania z funkcji analizy przychodzącej Twilio SendGrid .

W tym krótkim samouczku dowiesz się, jak sprawić, by Twilio SendGrid przekazywał wiadomości e-mail bezpośrednio do Twojej aplikacji internetowej, używając Pythona i frameworka Flask.

Wymagania

Oto wymagania niezbędne do ukończenia tego samouczka:

  • Python 3: Jeśli twój system operacyjny nie zapewnia interpretera Pythona 3, możesz przejść do python.org , aby pobrać instalator.
  • Konto Twilio SendGrid: Jeśli jesteś nowym użytkownikiem Twilio SendGrid, możesz utworzyć bezpłatne konto , które pozwala na zawsze wysyłanie 100 e-maili dziennie.
  • Domena, na której będziesz otrzymywać e-maile: W tym artykule będę używać twojadomenatutaj.com . Będziesz musiał ją zastąpić własną nazwą domeny.
  • ngrok : Użyjemy tego przydatnego narzędzia, aby połączyć aplikację Flask działającą lokalnie na twoim komputerze z publicznym adresem URL, do którego SendGrid może wysyłać żądania. Jest to konieczne w przypadku rozwojowej wersji aplikacji, ponieważ komputer prawdopodobnie znajduje się za routerem lub zaporą sieciową, więc nie jest bezpośrednio dostępny w Internecie. Jeśli nie masz zainstalowanego ngrok, możesz pobrać kopię dla systemu Windows, MacOS lub Linux .

Uwierzytelnianie domeny

Zanim Twilio SendGrid będzie mógł akceptować wiadomości e-mail w Twojej domenie, musisz ją uwierzytelnić , aby Twilio SendGrid wiedział, że domena jest pod Twoją kontrolą.

Zainicjuj uwierzytelnianie domeny

Aby uwierzytelnić swoją domenę, zaloguj się na swoje konto SendGrid, a na pasku nawigacyjnym po lewej stronie otwórz „Ustawienia”, a następnie wybierz Uwierzytelnianie nadawcy .

Na stronie Uwierzytelnianie nadawcy kliknij przycisk „Rozpocznij” w sekcji „Uwierzytelnianie domeny”.

Zostaniesz poproszony o wybranie dostawcy DNS, który w większości przypadków jest tą samą firmą, od której kupiłeś domenę. Jeśli Twój dostawca DNS nie pojawia się na liście lub nie wiesz, kim on jest, po prostu wybierz „Nie jestem pewien”.

Następnie zostaniesz poproszony o dodanie brandingu do linków pojawiających się w wychodzących e-mailach. W tej chwili nie zajmujemy się tym tematem, więc wybierz „Nie”. Możesz włączyć tę opcję później, jeśli chcesz z niej skorzystać.

Kliknij przycisk „Dalej”, aby przejść do następnej strony.

Na następnej stronie zostaniesz poproszony o podanie nazwy domeny. Wpisałem twojadomenatutaj.com i musisz podać domenę, której zamierzasz używać. Nie musisz nic zmieniać w sekcji „Ustawienia zaawansowane”.

Kliknij przycisk „Dalej”, aby kontynuować.

Strona wyświetli teraz 3 nowe rekordy DNS, które musisz dodać do konfiguracji domeny, każdy z typem, nazwą hosta i wartością. Dla Twojej wygody host i wartości można skopiować do schowka. Poniżej możesz zobaczyć ustawienia jakie otrzymałem. Twoje będą podobne, ale z Twoją własną nazwą domeny:

Dodawanie wpisów DNS do domeny

Następny krok będzie się różnić w zależności od dostawcy DNS. Odwiedź stronę konfiguracji swojej domeny i sprawdź, gdzie edytowane są ustawienia DNS.

Poniższe zrzuty ekranu dotyczą Google Domains . Możesz zobaczyć, jak dodałem pierwszy z trzech rekordów DNS na poniższym obrazku. Zauważ, że 3 rekordy o nazwach @, ftp i www nie są związane z tym samouczkiem i zostały już ustawione w mojej domenie.

Uważaj, jak wpisujesz nazwę rekordu DNS. Podczas gdy niektórzy dostawcy oczekują w pełni kwalifikowanej nazwy dla rekordów DNS, jak pokazuje SendGrid, inni oczekują tylko części przed nazwą domeny. Na przykład rekord, który SendGrid pokazał jako em3329.twojadomena.com , musiał zostać wprowadzony jako em3329 w Google Domains. Sprawdź swoje inne rekordy DNS i bądź konsekwentny we wprowadzaniu tych nowych.

Oto jak wyglądały 3 nowe rekordy DNS po ich wprowadzeniu:

Weryfikacja domeny

Teraz wróć do strony Uwierzytelnianie nadawcy SendGrid , gdzie Twoja domena będzie wyświetlana jako oczekująca. Kliknij go, aby kontynuować proces uwierzytelniania.

Na następnym ekranie zobaczysz 3 rekordy DNS. Kliknij przycisk "Zweryfikuj" w prawym górnym rogu strony, aby SendGrid ściągnął Twoje rekordy DNS i potwierdził, że dodałeś żądane wpisy.

Jeśli SendGrid będzie w stanie zweryfikować Twoją domenę, otrzymasz komunikat „Udało się!” strona:

Jeśli z drugiej strony SendGrid nie może zweryfikować wpisów DNS, będziesz musiał spróbować ponownie później. Za każdym razem, gdy wprowadzane są zmiany DNS, propagacja zmian na serwerach DNS zajmuje trochę czasu. Awaria zaraz po edycji wpisów DNS oznacza po prostu, że musisz poświęcić trochę więcej czasu, zanim ponownie naciśniesz przycisk „Zweryfikuj”. Pamiętaj, że pełna propagacja DNS może potrwać do 48 godzin, chociaż zwykle zajmuje to znacznie mniej czasu.

Po otrzymaniu komunikatu „Udało się!” strona, na której jesteś na dobrej drodze, aby otrzymywać wiadomości e-mail wysyłane do Twojej aplikacji internetowej Flask.

Aplikacja e-mail Flask

Teraz jesteśmy gotowi do napisania prostej aplikacji internetowej Flask, w której SendGrid może przekazywać nasze e-maile.

Utwórz wirtualne środowisko Pythona

Zgodnie z najlepszymi praktykami Pythona stworzymy osobny katalog dla naszego projektu, a wewnątrz niego stworzymy wirtualne środowisko . Następnie zainstalujemy na nim framework Flask.

Jeśli używasz systemu Unix lub Mac OS, otwórz terminal i wprowadź następujące polecenia, aby wykonać opisane powyżej zadania:

Jeśli korzystasz z samouczka w systemie Windows, wprowadź następujące polecenia w oknie wiersza polecenia:

Trasa poczty przychodzącej

Napiszmy teraz aplikację Flask, która będzie odbierać przychodzące e-maile. Poniżej znajduje się kod do kompletnego wniosku. Umieść ten kod w pliku o nazwie app.py .

Aplikacja ma tylko jedną trasę internetową połączoną z adresem URL /email . Będziemy mieli SendGrid wywołać tę trasę, aby przekazać nam przychodzące wiadomości e-mail. Wysłane przez nich żądanie będzie zawierało wszystkie szczegóły dotyczące wiadomości e-mail wysłanej w formie standardowego formularza HTTP. Oznacza to, że z Flask możemy łatwo uzyskać dostęp do wszystkich tych szczegółów ze słownika `request.form`.

Szczególnie interesujące są następujące zmienne formularza:

  • `request.form['from']`: nadawca e-maila
  • `request.form['to']`: adresat(y) e-maila
  • `request.form['temate']`: temat wiadomości e-mail
  • `request.form['text']` treść wiadomości e-mail w formacie zwykłego tekstu
  • `request.form['html']` treść wiadomości e-mail w formacie HTML

Pamiętaj, że nie są to jedyne pola przesłane przez SendGrid. Przejrzyj pełną listę parametrów wiadomości e-mail w dokumentacji SendGrid.

Ponieważ przetwarzanie wiadomości e-mail jest w dużej mierze zależne od każdej aplikacji, na przykład aplikacji Flask, wszystko, co robimy, to drukowanie pól wiadomości e-mail na konsoli.

Po zapisaniu app.py możesz uruchomić aplikację Flask w następujący sposób:

Aplikacja jest teraz uruchomiona i nasłuchuje przychodzących żądań, ale jest dostępna tylko z własnego komputera. Na razie pozostaw aplikację uruchomioną w oknie terminala. W następnej sekcji udostępnimy go w Internecie.

Webhook SendGrid Inbound Parse

Ostatnim z tego samouczka jest skonfigurowanie SendGrid do przekazywania przychodzących wiadomości e-mail w Twojej domenie do aplikacji Flask.

Rozpoczęcie nrok

Narzędzie ngrok tworzy publicznie dostępny adres URL i mapuje go na lokalnie działającą aplikację. Jest to powszechna technika używana do wystawiania usług w Internecie na potrzeby programowania i testowania. Gdy Twoja aplikacja Flask będzie gotowa, wdrożysz ją do produkcji na odpowiednim serwerze i nie będzie to już konieczne.

Jeśli jeszcze tego nie zrobiłeś, zainstaluj ngrok w swoim systemie. Pozostaw uruchomioną aplikację Flask i otwórz drugie okno terminala, aby uruchomić ngrok w następujący sposób:

To mówi ngrokowi, aby utworzył „tunel” z publicznego Internetu do portu 5000 na naszej lokalnej maszynie, gdzie aplikacja Flask czeka na żądania sieciowe. Wynik działania ngrok będzie wyglądał następująco:

Zwróć uwagę na wiersze zaczynające się od „Przekazywanie” na ekranie nrok. Pokazują one losowo wygenerowany publiczny adres URL, którego nrok używa do przekierowywania żądań do naszej usługi. Będziemy używać adresu URL https:// , ponieważ wykorzystuje on szyfrowanie.

Rejestracja adresu URL webhooka w SendGrid

Wróć do pulpitu nawigacyjnego SendGrid i w obszarze Ustawienia wybierz Analiza przychodząca , a następnie kliknij „Dodaj hosta i adres URL”.

Na następnej stronie wpisz subdomenę , na którą będziesz otrzymywać e-maile. Może to być dowolna subdomena, która nie jest jeszcze używana w Twojej domenie lub jeśli wolisz otrzymywać wiadomości e-mail bezpośrednio w domenie najwyższego poziomu, możesz po prostu pozostawić ją pustą. Na poniższym obrazku użyłem parsowania subdomeny , co oznacza, że ​​e-maile akceptowane przez SendGrid będą miały format < any>@parse.yourdomainhere.com . Pozostawienie pustego pola subdomeny umożliwi SendGrid akceptowanie wiadomości e-mail dla <cokolwiek>@twojadomena.com , co w niektórych przypadkach może być preferowane.

Następnie musisz wybrać nazwę swojej domeny . To jest lista rozwijana, która pokazuje wszystkie domeny zweryfikowane za pomocą SendGrid. Jeśli robisz to po raz pierwszy, zobaczysz tylko zweryfikowaną wcześniej domenę.

Poniższe pole dotyczy docelowego adresu URL Twojego webhooka. Jest to adres URL wygenerowany przez ngrok z dołączonym adresem Flask URL /email . W moim przypadku był to https://bbf1b72b.ngrok.io/email . Będziesz miał podobny adres URL, ale pierwsza część nazwy hosta ngrok będzie inna.

Kliknij „Dodaj”, aby skonfigurować webhooka.

Teraz zobaczysz wpis dla swojego webhooka na głównej stronie analizy przychodzącej:

Uwaga: adresy URL ngrok zmieniają się za każdym razem, gdy nrok jest zatrzymywany i restartowany, więc podczas projektowania będziesz musiał edytować swój webhook, aby aktualizować adres URL za każdym razem, gdy ponownie uruchomisz nrok. Po wdrożeniu webhooka do użytku produkcyjnego będzie on hostowany bezpośrednio pod publicznym adresem URL, więc ngrok nie będzie używany.

Rejestracja subdomeny parsowania

Subdomena wybrana do otrzymywania e-maili w poprzedniej sekcji musi być zdefiniowana w konfiguracji DNS domeny za pomocą rekordu `MX`. Wartość tego rekordu jest taka sama dla wszystkich klientów SendGrid: `mx.sendgrid.net.` (zwróć uwagę na końcową kropkę po słowie „net”).

W mojej konfiguracji DNS Google Domains zdefiniowałem moją subdomenę parse w następujący sposób:

Przypomnij sobie, że w zależności od dostawcy domeny, którego używasz, może być konieczne wprowadzenie pełnej nazwy hosta dla tego rekordu DNS, więc w takim przypadku będzie to parse.twojadomena.com .

Jeśli w poprzedniej sekcji zdecydowałeś się nie definiować subdomeny, nazwą hosta będzie twojadomenatutaj.com , która w przypadku niektórych dostawców DNS musi być podana jako „ @”.

Pamiętaj, że ta zmiana DNS również będzie musiała zostać rozpowszechniona, więc możesz nie być w stanie od razu otrzymywać wiadomości e-mail.

Wysyłanie testowego e-maila

Gdy zarówno aplikacja Flask, jak i ngrok są uruchomione, otwórz klienta poczty i wyślij testową wiadomość e-mail. W polu „Do:” możesz wprowadzić dowolną nazwę użytkownika, ponieważ SendGrid przechwytuje wszystkie nazwy użytkowników. To, co występuje po @, musi być pełną domeną odbierającą pocztę e-mail.

W poniższym przykładzie wysłałem e-mail na adres [email protected] :

Poczekaj minutę lub dwie, aż SendGrid odbierze wiadomość e-mail i przekaż ją do adresu URL webhooka ngrok, który z kolei przekaże go do punktu końcowego /email Flask. Jak widzieliście powyżej, prosty punkt końcowy, który napisałem w aplikacji Flask, drukuje otrzymane dane e-mail na konsoli:

Więc to jest to, teraz otrzymujemy e-maile jako prośby internetowe w naszej aplikacji Flask!

Wdrożenie produkcyjne

W tej sekcji chcę wskazać kilka ważnych różnic między webhookami wdrożonymi podczas projektowania a tymi przeznaczonymi do użytku produkcyjnego.

Wdrożenia bez nrok

Jak wspomniano powyżej, ngrok nie jest narzędziem produkcyjnym i nigdy nie powinien być używany we wdrożeniu produkcyjnym. Zamiast tego wdrożysz aplikację Flask na serwerze, który jest bezpośrednio podłączony do Internetu. W dokumentacji Flask omówiono kilka opcji wdrażania .

Bezpieczeństwo webhooka

Należy wziąć pod uwagę, że punkt końcowy odbierania wiadomości e-mail jest dostępny publicznie w Internecie, więc każdy, kto zna adres URL, może wysłać do niego żądanie, potencjalnie narażając aplikację na fałszywe wywołania wysyłane przez złośliwych użytkowników podszywających się pod żądania SendGrid.

Dobrym sposobem zapobiegania tego typu atakom jest zaimplementowanie uwierzytelniania podstawowego w punkcie końcowym Flask. Rozszerzenie Flask-HTTPAUth może być pomocne we wdrożeniu tego typu zabezpieczeń.

Jeśli dodasz uwierzytelnianie do punktu końcowego, musisz dołączyć nazwę użytkownika i hasło do adresu URL elementu webhook podanego do SendGrid. Webhook, którego użyłem powyżej, musiałby być podany jako https://username:[email protected]/email.

Wniosek

Mimo że konfiguracja wszystkiego do odbierania wiadomości e-mail wiąże się z wieloma krokami, jest to jeden z najprostszych sposobów, aby to osiągnąć. Więcej informacji na temat analizy przychodzącej znajdziesz na naszej stronie z dokumentami.

Nie możemy się doczekać, aby zobaczyć, co zbudujesz za pomocą Inbound Parse!