Python用Flaskフレームワークでメールを受信する方法

公開: 2020-04-30

電子メールの送信に関するチュートリアルはインターネット上にたくさんありますが、電子メールを受信して​​処理するようにアプリケーションを構成する方法についてはほとんどありません。 これは、すべてを自分でセットアップしようとすると非常に難しいタスクですが、TwilioSendGridのインバウンド解析機能を使用するとWebリクエストを受信するのと同じくらい簡単です。

この短いチュートリアルでは、PythonとFlask Webフレームワークを使用して、TwilioSendGridが電子メールをWebアプリケーションに直接転送する方法を学習します。

要件

このチュートリアルを完了するための要件は次のとおりです。

  • Python 3:オペレーティングシステムがPython 3インタープリターを提供していない場合は、python.orgにアクセスしてインストーラーをダウンロードできます。
  • Twilio SendGridアカウント:Twilio SendGridを初めて使用する場合は、無料のアカウントを作成できます。これにより、1日あたり100通のメールを永久に送信できます。
  • メールを受信するドメイン:この記事全体を通して、 yourdomainhere.comを使用します 独自のドメイン名に置き換える必要があります。
  • ngrok :この便利なユーティリティを使用して、コンピューター上でローカルに実行されているFlaskアプリケーションを、SendGridがリクエストを送信できるパブリックURLに接続します。 これは、アプリケーションの開発バージョンに必要です。これは、コンピューターがルーターまたはファイアウォールの背後にある可能性が高く、インターネットから直接アクセスできないためです。 ngrokがインストールされていない場合は、Windows、MacOS、またはLinux用のコピーをダウンロードできます

ドメイン認証

Twilio SendGridがドメイン上の電子メールを受け入れる前に、それを認証する必要があります。これにより、TwilioSendGridはドメインが管理下にあることを認識します。

ドメイン認証を開始します

ドメインを認証するには、SendGridアカウントにログインし、左側のナビゲーションバーで[設定]を開いて[送信者認証]を選択します

[送信者認証]ページで [ドメイン認証]セクションの[開始]ボタンをクリックします。

DNSプロバイダーを選択するように求められます。ほとんどの場合、DNSプロバイダーはドメインを購入した会社と同じです。 DNSプロバイダーがリストに表示されない場合、またはDNSプロバイダーが誰であるかわからない場合は、[わからない]を選択してください。

次に、送信メールに表示されるリンクにブランドを追加するかどうかを尋ねられます。 現時点ではこれは問題ではないので、「いいえ」を選択します。 このオプションを使用する場合は、後で有効にすることができます。

「次へ」ボタンをクリックして、次のページに進みます。

次のページで、ドメイン名を入力するように求められます。 yourdomainhere.comに入りました。使用するドメインを入力する必要があります。 「詳細設定」セクションでは何も変更する必要はありません。

「次へ」ボタンをクリックして続行します。

このページには、ドメイン構成に追加する必要のある3つの新しいDNSレコードが表示されます。各レコードには、タイプ、ホスト名、および値が含まれています。 便宜上、ホストと値をすべてクリップボードにコピーできます。 以下に、私が与えられた設定を示します。 あなたのものも似ていますが、あなた自身のドメイン名が含まれています:

ドメインへのDNSエントリの追加

次のステップは、DNSプロバイダーによって異なります。 ドメインの構成ページにアクセスして、DNS設定が編集されている場所を見つけます。

以下のスクリーンショットは、 Googleドメインです。 次の画像で、3つのDNSレコードの最初のレコードをどのように追加したかを確認できます。 @、 ftp 、およびwwwレコードという名前の3つのレコードは、このチュートリアルとは無関係であり、すでに私のドメインに設定されていることに注意してください。

DNSレコード名の入力方法に注意してください。 SendGridで示されているように、DNSレコードに完全修飾名を期待するプロバイダーもあれば、ドメイン名の前の部分だけを期待するプロバイダーもあります。 たとえば、 SendGridem3329.yourdomainhere.comとして表示したレコードは、Googleドメインem3329として入力する必要がありました。 他のDNSレコードを確認し、これらの新しいレコードの入力方法に一貫性を持たせてください。

入力した後の3つの新しいDNSレコードは次のとおりです。

ドメイン検証

次に、SendGrid Sender Authenticationページに戻ります。このページでは、ドメインが保留中として表示されます。 それをクリックして、認証プロセスを続行します。

次の画面に、3つのDNSレコードが表示されます。 ページの右上にある[確認]ボタンをクリックして、SendGridにDNSレコードをプルさせ、要求されたエントリが追加されたことを確認します。

SendGridがドメインを確認できる場合は、「機能しました」というメッセージが表示されます。 ページ:

一方、SendGridがDNSエントリを確認できない場合は、後で再試行する必要があります。 DNSの変更が行われるたびに、変更がDNSサーバー間で伝播するまでにある程度の時間がかかります。 DNSエントリを編集した直後に失敗した場合は、[確認]ボタンをもう一度押す前にもう少し時間をかける必要があることを意味します。 DNSが完全に伝播するまでに最大48時間かかる場合がありますが、通常ははるかに短い時間で済みます。

「うまくいった!」を取得したらページは、FlaskWebアプリケーションに電子メールを投稿するための準備が整っています。

Flaskメールアプリケーション

これで、SendGridがメールを転送できる簡単なFlaskWebアプリケーションを作成する準備が整いました。

Python仮想環境を作成する

Pythonのベストプラクティスに従って、プロジェクト用に別のディレクトリを作成し、その中に仮想環境を作成します 次に、Flaskフレームワークをインストールします。

UnixまたはMacOSシステムを使用している場合は、ターミナルを開き、次のコマンドを入力して上記のタスクを実行します。

Windowsでチュートリアルを実行している場合は、コマンドプロンプトウィンドウに次のコマンドを入力します。

受信メールルート

次に、受信メールを受信するFlaskアプリケーションを作成しましょう。 完全なアプリケーションのコードを以下に示します。 このコードをapp.pyという名前のファイルに入れます

アプリケーションには、 /emailURLに接続されたWebルートが1つだけあります。 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 Webhook

このチュートリアルの最後は、ドメインの受信メールをFlaskアプリケーションに転送するようにSendGridを構成することです。

ngrokを開始します

ngrokツールは、公開されているURLを作成し、それをローカルで実行されているアプリケーションにマップします。 これは、開発とテストのためにインターネット上のサービスを公開するために使用される一般的な手法です。 Flaskアプリケーションが完成したら、適切なサーバーに本番用にデプロイします。これはもう必要ありません。

まだインストールしていない場合は、システムにngrokをインストールしてください。 Flaskアプリケーションを実行したままにし、2番目のターミナルウィンドウを開いて、次のようにngrokを起動します。

これは、パブリックインターネットからローカルマシンのポート5000に「トンネル」を作成するようにngrokに指示しています。ここで、FlaskアプリケーションはWebリクエストを待機しています。 ngrokの出力は次のようになります。

ngrok画面の「Forwarding」で始まる行に注意してください。 これらは、ngrokがリクエストをサービスにリダイレクトするために使用するランダムに生成されたパブリックURLを示しています。 暗号化を使用しているため、 https:// URLを使用します。

SendGridにWebhookURLを登録する

SendGridダッシュボードに戻り、 [設定]で[インバウンド解析]を選択し、[ホストとURLの追加]をクリックします。

次のページで、メールを受信するサブドメインを入力します。 これは、ドメインでまだ使用されていないサブドメインにすることができます。または、トップレベルドメインで直接メールを受信したい場合は、空のままにしておくことができます。 以下の画像では、サブドメインparseを使用しました。これは、SendGridによって受け入れられる電子メールの形式が< anything>@parse.yourdomainhere.comであることを意味します サブドメインフィールドを空のままにすると、SendGridは<anything> @ yourdomainhere.comの電子メールを受け入れることができます。これは、場合によっては望ましい場合があります。

次に、ドメイン名を選択する必要があります これは、SendGridで確認したすべてのドメインを表示するドロップダウンリストです。 これを初めて行う場合は、前に確認したドメインのみが表示されます。

次のフィールドは、Webhookのリンク先URLです。 これは、Flask URL /emailが付加されたngrokによって生成されたURLです。 私の場合、これはhttps://bbf1b72b.ngrok.io/emailでした。 同様のURLがありますが、ngrokホスト名の最初の部分は異なります。

「追加」をクリックして、Webhookを構成します。

これで、メインのInboundParseページにWebhookのエントリが表示されます。

注:ngrokのURLは、ngrokを停止して再起動するたびに変更されるため、開発中は、ngrokを再起動するたびにURLを更新するようにWebhookを編集する必要があります。 Webhookを本番環境で使用するためにデプロイする場合、パブリックURLで直接ホストするため、ngrokは使用されません。

解析サブドメインの登録

前のセクションでメールを受信するために選択したサブドメインは、ドメインのDNS構成で`MX`レコードを使用して定義する必要があります。 このレコードの値は、すべてのSendGridのお客様で同じです: `mx.sendgrid.net.`(「net」の後の末尾のドットに注意してください)。

GoogleドメインのDNS構成で、解析サブドメインを次のように定義しました。

使用するドメインプロバイダーによっては、このDNSレコードの完全なホスト名を入力する必要がある場合があることを思い出してください。その場合、 parse.yourdomainhere.comになります。

前のセクションでサブドメインを定義しないことにした場合、ホスト名はyourdomainhere.comになります。これは、一部のDNSプロバイダーでは「 @」として指定する必要があります

このDNSの変更も伝播する必要があるため、すぐに電子メールを受信できない場合があることに注意してください。

テストメールの送信

Flaskアプリケーションとngrokの両方が実行されている間に、電子メールクライアントを開き、テスト電子メールを送信します。 SendGridはすべてのユーザー名をキャプチャするため、[宛先]フィールドに任意のユーザー名を入力できます。 @の後に続くものは、完全な電子メール受信ドメインである必要があります。

以下の例では、 [email protected]にメールを送信しました

SendGridが電子メールを受信して​​ngrokwebhookURLに転送するまで、1〜2分待ちます。次に、それがFlaskの/emailエンドポイントに渡されます。 上で見たように、Flaskアプリケーションで作成した単純なエンドポイントは、受信した電子メールデータをコンソールに出力します。

これで、FlaskアプリケーションでWebリクエストとしてメールを受信できるようになりました。

実稼働展開

このセクションでは、開発中にデプロイされたWebhookと本番環境での使用を目的としたWebhookの重要な違いをいくつか指摘します。

ngrokを使用しない展開

上記のように、ngrokは本番ツールではないため、本番デプロイメントで使用しないでください。 代わりに、インターネットに直接接続されているサーバーにFlaskアプリケーションをデプロイします。 Flaskのドキュメントで説明されているいくつかのデプロイメントオプションがあります。

Webhookセキュリティ

メール受信エンドポイントはインターネット上で公開されているため、URLを知っている人なら誰でもリクエストを送信でき、SendGridリクエストを装った悪意のあるユーザーから送信された偽の呼び出しにアプリケーションがさらされる可能性があることを考慮してください。

このタイプの攻撃を防ぐための良い対策は、Flaskエンドポイントに基本認証を実装することです。 Flask-HTTPAuth拡張機能はこのタイプのセキュリティを実装するのに役立ちます。

エンドポイントに認証を追加する場合は、SendGridに指定されたWebhookURLにユーザー名とパスワードを含める必要があります。 上記で使用したWebhookは、 https:// username:[email protected]/emailとして指定する必要があります。

結論

電子メールを受信するためのすべての設定には多くの手順が含まれますが、これはそれを実現するための最も簡単な方法の1つです。 インバウンド解析の詳細については、ドキュメントページをご覧ください。

Inbound Parseで何を構築するかを楽しみにしています!