Как получать электронные письма с помощью Flask Framework для Python

Опубликовано: 2020-04-30

Хотя в Интернете есть множество руководств по отправке электронных писем, очень мало информации о том, как настроить приложение для их получения и обработки. Это задача, которая может быть невероятно сложной, если вы пытаетесь настроить все самостоятельно, но это так же просто, как получить веб-запрос при использовании функции Inbound Parse Twilio SendGrid .

В этом кратком руководстве вы узнаете, как заставить Twilio SendGrid пересылать ваши электронные письма непосредственно в ваше веб-приложение, используя Python и веб-фреймворк Flask.

Требования

Вот требования для завершения этого урока:

  • Python 3: Если ваша операционная система не поддерживает интерпретатор Python 3, вы можете загрузить программу установки на сайте python.org .
  • Учетная запись Twilio SendGrid. Если вы новичок в Twilio SendGrid, вы можете создать бесплатную учетную запись , которая позволит вам отправлять 100 электронных писем в день навсегда.
  • Домен, на который вы будете получать электронные письма: в этой статье я буду использовать yourdomainhere.com . Вам нужно будет заменить его на собственное доменное имя.
  • ngrok : мы будем использовать эту удобную утилиту для подключения приложения Flask, работающего локально на вашем компьютере, к общедоступному URL-адресу, на который SendGrid может отправлять запросы. Это необходимо для разрабатываемой версии приложения, поскольку ваш компьютер, скорее всего, находится за маршрутизатором или брандмауэром, поэтому он недоступен напрямую через Интернет. Если у вас не установлен ngrok, вы можете загрузить копию для Windows, MacOS или Linux .

Аутентификация домена

Прежде чем Twilio SendGrid сможет принимать электронные письма в вашем домене, вы должны аутентифицировать его , чтобы Twilio SendGrid знал, что домен находится под вашим контролем.

Инициировать аутентификацию домена

Чтобы аутентифицировать свой домен, войдите в свою учетную запись SendGrid и на левой панели навигации откройте «Настройки», затем выберите « Аутентификация отправителя » .

На странице « Аутентификация отправителя » нажмите кнопку «Начать» в разделе «Аутентификация домена».

Вам будет предложено выбрать поставщика DNS, которым в большинстве случаев является та же компания, у которой вы приобрели домен. Если вашего провайдера DNS нет в списке или вы не знаете, кто он, просто выберите «Я не уверен».

Затем вас спросят о добавлении брендинга к ссылкам, которые появляются в исходящих электронных письмах. Это не та тема, которой мы сейчас занимаемся, поэтому выберите «Нет». Вы можете включить эту опцию позже, если захотите ее использовать.

Нажмите кнопку «Далее», чтобы перейти на следующую страницу.

На следующей странице вас попросят указать ваше доменное имя. Я ввел yourdomainhere.com , и вам нужно будет ввести домен, который вы собираетесь использовать. В разделе «Дополнительные настройки» ничего менять не нужно.

Нажмите кнопку «Далее», чтобы продолжить.

Теперь на странице будут отображаться 3 новые записи DNS, которые необходимо добавить в конфигурацию вашего домена, каждая с типом, именем хоста и значением. Для вашего удобства хост и значения можно скопировать в буфер обмена. Ниже вы можете увидеть настройки, которые мне дали. Ваши будут похожи, но с вашим собственным доменным именем:

Добавление записей DNS в ваш домен

Следующий шаг будет отличаться в зависимости от вашего провайдера DNS. Посетите страницу конфигурации вашего домена и найдите, где редактируются настройки DNS.

Скриншоты ниже относятся к доменам Google . Вы можете увидеть, как я добавил первую из трех записей DNS, на следующем изображении. Обратите внимание, что 3 записи с именами @, ftp и www не имеют отношения к этому руководству и уже были установлены в моем домене.

Будьте осторожны при вводе имени записи DNS. В то время как некоторые провайдеры ожидают полного имени для ваших DNS-записей, как показано SendGrid, другие ожидают только часть перед именем домена. Например, запись, которую SendGrid показывала как em3329.yourdomainhere.com , нужно было ввести как em3329 в доменах Google. Проверьте свои другие записи DNS и будьте последовательны в том, как вы вводите эти новые.

Вот как выглядели 3 новые записи DNS после того, как я их ввел:

Проверка домена

Теперь вернитесь на страницу проверки подлинности отправителя SendGrid , где ваш домен будет отображаться как ожидающий. Нажмите на нее, чтобы продолжить процесс аутентификации.

На следующем экране вы увидите 3 записи DNS. Нажмите кнопку «Подтвердить» в правом верхнем углу страницы, чтобы SendGrid извлек ваши записи DNS и подтвердил, что вы добавили запрошенные записи.

Если SendGrid сможет подтвердить ваш домен, вы получите сообщение «Это сработало!» страница:

Если, с другой стороны, SendGrid не может проверить ваши записи DNS, вам нужно будет повторить попытку позже. Каждый раз, когда вносятся изменения в DNS, требуется некоторое время, чтобы изменения распространились по DNS-серверам. Сбой сразу после редактирования записей DNS просто означает, что вам нужно подождать немного больше времени, прежде чем вы снова нажмете кнопку «Подтвердить». Обратите внимание, что для полного распространения DNS может потребоваться до 48 часов, хотя обычно это занимает гораздо меньше времени.

Как только вы получите «Это сработало!» page, вы находитесь на пути к отправке электронных писем в свое веб-приложение Flask.

Почтовое приложение Flask

Теперь мы готовы написать простое веб-приложение Flask, в котором SendGrid может пересылать наши электронные письма.

Создайте виртуальную среду Python

Следуя лучшим практикам Python, мы создадим отдельный каталог для нашего проекта, а внутри него создадим виртуальную среду . Затем мы установим на него фреймворк Flask.

Если вы используете систему Unix или Mac OS, откройте терминал и введите следующие команды для выполнения задач, описанных выше:

Если вы следуете руководству в Windows, введите следующие команды в окне командной строки:

Маршрут входящей электронной почты

Давайте теперь напишем приложение Flask, которое будет получать входящие электронные письма. Код для полного приложения показан ниже. Поместите этот код в файл с именем app.py.

Приложение имеет только один веб-маршрут, связанный с URL -адресом /email . Мы заставим SendGrid вызывать этот маршрут для передачи нам входящих писем. Запрос, который они отправляют, будет содержать все детали, связанные с электронным письмом, отправленным в виде стандартного сообщения HTTP-формы. Это означает, что из Flask мы можем легко получить доступ ко всем этим деталям из словаря `request.form`.

Особый интерес представляют следующие переменные формы:

  • `request.form['from']`: отправитель электронной почты
  • `request.form['to']`: получатель(и) электронной почты
  • `request.form['subject']`: тема письма
  • `request.form['text']` тело письма в текстовом формате
  • `request.form['html']` тело письма в формате HTML

Обратите внимание, что это не единственные поля, представленные SendGrid. Просмотрите полный список параметров электронной почты в документации SendGrid.

Поскольку обработка электронной почты во многом зависит от каждого приложения, например, приложения Flask, все, что мы делаем, — это вывод полей электронной почты на консоль.

После сохранения app.py вы можете запустить приложение Flask следующим образом:

Теперь приложение работает и прослушивает входящие запросы, но оно доступно только с вашего компьютера. Пока оставьте приложение запущенным в окне терминала. В следующем разделе мы представим его в Интернете.

Веб-хук SendGrid Inbound Parse

Последним в этом руководстве является настройка SendGrid для пересылки входящих сообщений электронной почты в вашем домене в приложение Flask.

Запуск нгрока

Инструмент ngrok создает общедоступный URL-адрес и сопоставляет его с локально запущенным приложением. Это распространенный метод, используемый для предоставления услуг в Интернете для разработки и тестирования. Как только ваше приложение Flask будет готово, вы развернете его для производства на соответствующем сервере, и в этом больше не будет необходимости.

Если вы еще этого не сделали, установите ngrok в своей системе. Оставьте приложение Flask запущенным и откройте второе окно терминала, чтобы запустить ngrok следующим образом:

Это говорит ngrok создать «туннель» из общедоступного Интернета в порт 5000 на нашем локальном компьютере, где приложение Flask ожидает веб-запросов. Вывод ngrok будет выглядеть следующим образом:

Обратите внимание на строки, начинающиеся с «Переадресация» на экране ngrok. Они показывают случайно сгенерированный общедоступный URL-адрес, который ngrok использует для перенаправления запросов в нашу службу. Мы собираемся использовать URL-адрес https:// , поскольку он использует шифрование.

Регистрация URL-адреса веб-перехватчика в SendGrid

Вернитесь на панель инструментов SendGrid и в разделе «Настройки» выберите «Входящий анализ », затем нажмите «Добавить хост и URL».

На следующей странице введите субдомен , на который вы будете получать электронные письма. Это может быть любой поддомен, который еще не используется в вашем домене, или, если вы предпочитаете получать электронные письма непосредственно в домене верхнего уровня, его можно просто оставить пустым. На изображении ниже я использовал синтаксический анализ поддоменов , что означает, что электронные письма, принимаемые SendGrid, будут иметь формат < anything>@parse.yourdomainhere.com . Если оставить поле поддомена пустым, SendGrid будет принимать электронные письма для <всего>@yourdomainhere.com , что в некоторых случаях может быть предпочтительнее.

Далее вам нужно выбрать доменное имя . Это раскрывающийся список, в котором показаны все домены, которые вы подтвердили с помощью SendGrid. Если вы делаете это впервые, вы увидите только тот домен, который вы подтвердили ранее.

Следующее поле предназначено для целевого URL -адреса вашего веб-перехватчика. Это URL-адрес, сгенерированный ngrok, к которому добавлен Flask URL-адрес /email . В моем случае это был https://bbf1b72b.ngrok.io/email . У вас будет аналогичный URL-адрес, но первая часть имени хоста ngrok будет другой.

Нажмите «Добавить», чтобы настроить веб-хук.

Теперь вы увидите запись для вашего вебхука на главной странице Inbound Parse:

Примечание: URL-адреса ngrok меняются каждый раз, когда ngrok останавливается и перезапускается, поэтому во время разработки вам нужно будет отредактировать свой веб-хук, чтобы обновлять URL-адрес каждый раз, когда вы перезапускаете ngrok. Когда вы развертываете свой веб-перехватчик для производственного использования, вы размещаете его непосредственно на общедоступном URL-адресе, поэтому ngrok не будет использоваться.

Регистрация поддомена разбора

Субдомен, который вы выбрали для получения электронной почты в предыдущем разделе, должен быть определен в конфигурации DNS вашего домена с записью MX. Значение этой записи одинаково для всех клиентов SendGrid: `mx.sendgrid.net` (обратите внимание на точку в конце после слова «net»).

В моей конфигурации DNS Google Domains я определил свой субдомен синтаксического анализа следующим образом:

Напомним, что в зависимости от того, какого провайдера домена вы используете, вам может потребоваться ввести полное имя хоста для этой записи DNS, поэтому в этом случае это будет parse.yourdomainhere.com .

Если вы решили не определять поддомен в предыдущем разделе, то ваше имя хоста будет yourdomainhere.com , которое для некоторых провайдеров DNS должно быть указано как « @».

Помните, что это изменение DNS также должно распространяться, поэтому вы не сможете получать электронные письма немедленно.

Отправка тестового письма

Пока ваше приложение Flask и ngrok работают, откройте почтовый клиент и отправьте тестовое письмо. В поле «Кому:» вы можете ввести любое имя пользователя, которое вы хотите, поскольку SendGrid фиксирует все имена пользователей. То, что идет после @, должно быть вашим полным доменом для получения электронной почты.

В приведенном ниже примере я отправил электронное письмо на адрес [email protected] :

Подождите минуту или две, пока SendGrid получит электронное письмо и перенаправит его на URL-адрес веб-перехватчика ngrok, который, в свою очередь, передаст его на конечную точку /email Flask . Как вы видели выше, простая конечная точка, которую я написал в приложении Flask, выводит полученные данные электронной почты на консоль:

Вот и все, теперь мы получаем электронные письма в виде веб-запросов в нашем приложении Flask!

Развертывание производства

В этом разделе я хочу указать на пару важных различий между веб-перехватчиками, развернутыми во время разработки, и теми, которые предназначены для использования в производственной среде.

Развертывания без ngrok

Как упоминалось выше, ngrok не является производственным инструментом и никогда не должен использоваться в производственной среде. Вместо этого вы развернете свое приложение Flask на сервере, который напрямую подключен к Интернету. В документации Flask обсуждается несколько вариантов развертывания .

Безопасность веб-перехватчика

Учтите, что ваша конечная точка получения электронной почты общедоступна в Интернете, поэтому любой, кто знает URL-адрес, может отправить на нее запрос, потенциально подвергая ваше приложение ложным вызовам, отправленным злоумышленниками, выдающими себя за запросы SendGrid.

Хорошей мерой для предотвращения этого типа атак является реализация базовой аутентификации на вашей конечной точке Flask. Расширение Flask-HTTPAuth может помочь в реализации этого типа безопасности.

Если вы добавите аутентификацию в свою конечную точку, вам потребуется указать имя пользователя и пароль в URL-адресе веб-перехватчика, предоставленном SendGrid. Веб-хук, который я использовал выше, должен быть указан как https://username:[email protected]/email.

Заключение

Несмотря на то, что для настройки получения электронной почты требуется много шагов, это один из самых простых способов добиться этого. Для получения дополнительной информации о Inbound Parse посетите нашу страницу документации.

Нам не терпится увидеть, что вы создадите с помощью Inbound Parse!