Google が oauth2client.py で提供するdocs および python ライブラリとoauth2.py ライブラリおよび docsを使用して、OAuth2.0 で認証することにより、ユーザーの gmail アカウントを介してメールを正常に送信できました。Google apis でプロジェクトを作成し、正しく認証してメールを送信するために必要なキーとその他のパラメーターを取得できました。
今、私は同じ目標を達成しようとしていますが、Google Marketplace アプリを使用しています。最終的な目標は、ドメイン管理者がアプリを Google Apps ドメインに追加して、各ユーザーが認証プロセスを経る必要がなく、アプリがユーザーに代わってメールを送信することを「自動的に」承認できるようにすることです。
最初の問題は、アプリをマーケットプレイスに登録するときに、クライアント キーとシークレットredirect_uri
が与えられたが、他のプロジェクトで与えられたように、クライアント キーとシークレットが与えられなかったということです。これは、OAuth2WebServerFlow
クラスを使用して認証できなかったことを意味します。これにより、数時間の検索と競合する回答が発生し、Google のドキュメント内のリンクが壊れました。このドキュメントを見ると、Marketplace アプリは OAuth 2.0 をサポートしておらず、2-legged OAuth 1.0 認証を使用する必要があると思います。しかし、これは 1 年以上前に更新されており、他のすべての Google ドキュメントでは、OAuth 1.0 は廃止されているため使用しないよう強く指示されています。
Marketplace アプリでこれを行う唯一の方法は、OAuth 1.0 を使用するためにすべての新しいコード (同じライブラリなどを使用できない) を書き直すことですか? 別の方法はありますか? そうでない場合は、既存のコードを活用するためのアドバイスや、現在のシステムで行う最善の方法はありますか?
私が現在 OAuth 2.0 を使用してそれを行っている方法の短いスニペット:
flow = OAuth2WebServerFlow(
client_id="xxx",
client_secret="xxx",
scope="https://mail.google.com/",
user_agent="mytest/0.1",
redirect_uri="http://127.0.0.1:5000/oauth2callback"
)
authorize_url = flow.step1_get_authorize_url()
そして帰りに
credentials = flow.step2_exchange(request.args['code'])
storage = Storage(request.user.email)
storage.put(credentials)
そしてメールを送る
conn = smtplib.SMTP('smtp.googlemail.com', 587)
conn.set_debuglevel(True)
conn.ehlo('test')
conn.starttls()
auth_string = 'user=%s\1auth=Bearer %s\1\1' % (user_address, credentials.access_token)
conn.docmd('AUTH', 'XOAUTH2 ' + base64.b64encode(auth_string))
header = 'To:' + recipient_address + '\n'
header += 'From:' + user_address + '\n'
header += 'Subject: Oauth test Email \n'
header += 'Content-Type: text/html; charset=UTF-8\n'
msg = header + '\n ' + "Waka waka" + ' \n\n'
conn.sendmail(user_address, recipient_address, msg)