1

ユーザーが Gmail で認証してメールを送信できるアプリケーションを開発しています。

これが起こる必要があることです:

  • ユーザーは OAuth2 で認証します
  • ユーザーの電子メール アドレス (またはその他の永続的な一意の識別子) が取得され、ユーザーがアプリにログインするために使用されます。
  • ユーザーは SMTP を使用して電子メールを作成および送信できます

ただし、認証に問題があります。私が使用している関数は OAuth2WebServerFlow() です:

flow = OAuth2WebServerFlow(client_id=GOOGLE_CLIENT_ID,
                           client_secret=GOOGLE_CLIENT_SECRET,
                           scope=scope,
                           redirect_uri=base_app_url + '/oauth2callback')

これはscope='https://mail.google.com/ ' の場合はうまく機能しますが、問題は、ユーザーが許可を与えていないため ( https://developersで示されているように)、ユーザーのメール アドレスを取得できないことです。 .google.com/oauthplayground/ )。その結果、これを機能させるには、自分のメール アドレスをハードコーディングする必要がありました。

一方、scope='https://mail.google.com/,https://www.googleapis.com/auth/userinfo.email' の場合、次のようにしてユーザーのメールアドレスを取得できます。

r = requests.get('https://www.googleapis.com/oauth2/v2/userinfo',
                 headers={'Authorization': 'OAuth ' + access_token})

ただし、この場合の問題は、メールを送信しようとすると、認証文字列の作成に使用される access_token が受け入れられず、次のエラーが表示されることです (これは不適切だと思います)。

SMTPSenderRefused: (535,
                    '5.7.1 Username and Password not accepted. Learn more at\n5.7.1 http://support.google.com/mail/bin/answer.py?answer=14257 cv19sm54718503vdb.5',
                    u'<MY_NAME@MY_GOOGLE_APP_DOMAIN.COM>')

メールを送信するためのコードは次のとおりです。

def send_email(user_address, access_token, recipient_address, subject, body):
    xoauth2_string = 'user=%s\1auth=Bearer %s\1\1' % (user_address, access_token)
    url = "https://mail.google.com/mail/b/" + user_address + "/smtp/"

    conn = smtplib.SMTP('smtp.gmail.com', 587)
    conn.set_debuglevel(True)
    conn.ehlo()
    conn.starttls()
    conn.ehlo()
    conn.docmd('AUTH', 'XOAUTH2 ' + base64.b64encode(xoauth2_string))

    header = 'To:' + recipient_address + '\n'
    header += 'From:' + user_address + '\n'
    header += 'Subject:' + subject + ' \n'
    header += 'Content-Type: text/html; charset=UTF-8\n' 
    msg = header + '\n ' + body + ' \n\n'

    conn.sendmail(user_address, recipient_address, msg)

基本的に、次のことを確認したい:

  1. scope='https://mail.google.com/' を使用して、ユーザーの電子メールまたはその他の永続的な一意の識別子を取得できます。
  2. scope='https://mail.google.com/,https://www.googleapis.com/auth/userinfo.email' で SMTP を機能させる方法があります。

認証文字列が拒否されるのはなぜですか? 足りないものはありますか?複数のアクセス許可を要求するときに、Google API に何か問題がありますか?

4

0 に答える 0