受信メールをGoogleスプレッドシートに保存する

受信メールをGoogleスプレッドシートに保存する

今回は、SendGridのParse Webhook機能で受信したメールの内容を「gspread」というPythonモジュールを使ってGoogleスプレッドシートに保存する方法をご紹介します。

Parse WebhookはSendGridが提供するメールの受信機能です。この機能を利用することで、あるドメイン宛のメールの内容をあらかじめ設定したURLにPOSTできます。それでは早速設定をしていきましょう。

前提条件

  • SendGridのアカウント
  • Googleのアカウント
  • Python実行環境が整っているサーバ
  • DNSの設定変更権限(とりあえず試すだけであれば必須ではありません)

DNSの設定

まずはじめに、あるドメイン宛のメールをSendGridが処理できるようにします。そのドメインのMXレコードを「mx.sendgrid.net」に変更します。

※とりあえず試してみたい、という方向けにこちらの記事でご紹介している「5分間アプローチ」という方法を使うことでMXレコードの変更なしで動作を試すこともできます。

GSpreadモジュールとGoogleスプレッドシートの準備

モジュールのインストール

次にPOSTを受信するサーバ(Python環境が整っている前提)上にgspreadその他関連モジュールをインストールします。インストールにはpipを利用します。

pip install gspread flask requests

Googleスプレッドシートの作成

データの保存先となるGoogleスプレッドシートを作成します。スプレッドシート名は「ParseWebhook」としてGoogleドライブのルート上に作成します。

スプレッドシートの作成

スプレッドシート名の変更

なお、gspreadからGoogleスプレッドシートへアクセスするためにGoogleのアカウント設定で安全性の低いアプリのアクセスをオンにする必要があります。

安全性の低いアプリのアクセス

コードの修正と実行

Flask(Python用マイクロWebフレームワーク)上で動作するコード(ファイル名はapp.py)は以下の通りです。このコードは、受信したPOST内のFrom、Subject、Spam Scoreを取得してスプレッドシートに保存します。そして、以下の部分を修正します。

  • googleUserとgooglePassにGoogleアカウントの認証情報を設定するよう修正
  • gc.open()の引数に先ほど作成したスプレッドシートの名前「ParseWebhook」を渡すよう修正
from flask import Flask, request
import requests
import os
import gspread

app = Flask(__name__)


googleUser = 'Googleアカウントの認証情報'
googlePass = 'Googleアカウントの認証情報'

gc = gspread.login(googleUser, googlePass)
wks = gc.open("作成したスプレッドシートの名前").sheet1

def getNextRow():
    values_list = wks.col_values(1) #gets all values in first column
    emptyrow = str(len(values_list)+1)
    return emptyrow


def addRow(email, subject, spam_score):
    row = getNextRow()
    emailCell = 'A'+row
    subjectCell = 'B'+row
    spamCell = 'C'+row
    wks.update_acell(emailCell, email)
    wks.update_acell(subjectCell, subject)
    wks.update_acell(spamCell, spam_score)

@app.route('/', methods = ['POST'])
def insertData():
    email = request.form['from']
    subject = request.form['subject']
    spamscore = request.form['spam_score']
    addRow(email, subject, spamscore)
    return "OK"

if __name__ == '__main__':
    app.debug = True
    app.run()

このコードをサーバ上に配置して実行してください。

python app.py
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
 * Restarting with stat

Parse Webhookの設定

Parse Webhookの設定を行います。SendGridのダッシュボードでParse Incoming Emails設定を開き、メールを受信するドメインとアプリケーションURLを設定します。迷惑メールチェック(Spam Check)をオンにするのを忘れないでください。詳しい操作手順については操作マニュアル会員登録が必要)をご確認ください。

※ローカル環境のポートをインターネット上にトンネルするngrokを使うことで公開サーバを必要とせず簡単にPOSTの受信を試すことができます。詳しくはこちらをご確認ください。

Parsing Incoming Emails

メールの送信と結果の確認

メールの送信

メールを受信するドメインの任意のアドレス宛にメールを送信します。

メールの送信

結果の確認

受信したメールの内容がアプリケーションにPOSTされ、アプリケーションがスプレッドシートにレコードを記録することを確認します。

この例では、以下の情報が記録されます。

  • A列:From
  • B列:Subject
  • C列:Spam Score

結果の確認

参考

Parse Webhook/Webhookについては以下の記事もご確認ください。