LoginSignup
1
1

More than 5 years have passed since last update.

Bluemix と Heroku の Flask で、Gmail の oauth 2.0 を使う

Last updated at Posted at 2017-08-30

関連ページ 次のページのコードを使っています。
Flask 関連
Bluemix で、Node-RED で作成した API を、Flask から呼び出す

  • static/index.html
  • static/mail.js

Gmail oauth 2.0 関連
Python で、Gmail の oauth 2.0 を使う

  • get_credentials.py
  • client_secret.json
  • .credentials/my-gmail-sender.json

フォルダー構成

Heroku では manifest.yml は不要です。

├── client_secret.json
├── get_credentials.py
├── Procfile
├── requirements.txt
├── runtime.txt
├── send_gmail_oauth2.py
├── static
│   ├── index.html
│   ├── lib
│   │   └── jquery-3.3.1.min.js
│   └── mail.js
├── welcome.py
├── manifest.yml
└── .credentials/my-gmail-sender.json
welcome.py
# -*- coding: utf-8 -*-
#
#   welcome.py
#
#                       Aug/30/2017
#
# ----------------------------------------------------------------------
import sys
import os

from flask import Flask
from flask import jsonify
from flask import request
app = Flask(__name__)

from send_gmail_oauth2 import send_gmail_proc
# ----------------------------------------------------------------------
@app.route("/")
def welcome():
    print("welcome")
    return app.send_static_file('index.html')
# ----------------------------------------------------------------------
@app.route('/post_mail' ,methods=['POST'])
def mail_proc():
    print("*** post_mail *** start ***")
    message = []
    message.append("*** mail *** start ***")
    message.append("request.method = " + request.method)
#
    to = request.form['to']
    topic = request.form['topic']
    content = request.form['content']
#
    try:
        send_gmail_proc(to,topic,content)
    except Exception as ee:
        sys.stderr.write("*** error *** send_gmail_proc ***\n")
        message.append("*** error *** send_gmail_proc ***")
        sys.stderr.write(str(ee) + "\n")
        message.append(str(ee))
#
    message.append("*** mail *** end ***")
    print("*** mail *** end ***")
#
    rvalue={}
    rvalue['to'] = to
    rvalue['content'] = content
    rvalue['message'] = message
#
    return jsonify(rvalue)
# ----------------------------------------------------------------------
port = os.getenv('PORT', '5000')
if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0',  port=int(port))
# ----------------------------------------------------------------------
send_gmail_oauth2.py
# -*- coding: utf-8 -*-
#
#   send_gmail_oauth2.py
#
#                   Aug/30/2017
# ------------------------------------------------------------------
import httplib2
import os
import sys
import apiclient
import base64
import traceback
from email.mime.text import MIMEText
from email.utils import formatdate

from get_credentials import get_credentials
# ------------------------------------------------------------------
def send_gmail_proc(to,topic,content):
#
    credentials = get_credentials()
    http = credentials.authorize(httplib2.Http())
    service = apiclient.discovery.build("gmail", "v1", http=http)

    mail_from = "test_aa@gmail.com"

    try:
        result = service.users().messages().send(
            userId=mail_from,
            body=create_message(mail_from,to,topic,content)
        ).execute()

        print("Message Id: {}".format(result["id"]))

    except apiclient.errors.HttpError:
        print("------start trace------")
        traceback.print_exc()
        print("------end trace------")
#
# ------------------------------------------------------------------
def create_message(mail_from,mail_to,subject,contents):
    message = MIMEText(contents)
#
    message["from"] = mail_from
    message["to"] = mail_to
    message["subject"] = subject
    message["Date"] = formatdate(localtime=True)

    byte_msg = message.as_string().encode(encoding="UTF-8")
    byte_msg_b64encoded = base64.urlsafe_b64encode(byte_msg)
    str_msg_b64encoded = byte_msg_b64encoded.decode(encoding="UTF-8")

    body = {"raw": str_msg_b64encoded}
#
    return body
#
# ------------------------------------------------------------------
requirements.txt
Flask==1.0.2
requests==2.20.1
httplib2==0.12.0
oauth2client==4.1.3
google-api-python-client==1.7.4
runtime.txt
python-3.7.1
Procfile
web: python welcome.py
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1