kootenpv / yagmail

Send email in Python conveniently for gmail using yagmail
MIT License
2.66k stars 265 forks source link

Calling call_refresh_token results in HTTP 400 Error: Bad Request #181

Closed asharma13524 closed 4 years ago

asharma13524 commented 4 years ago

First, just wanted to say thanks for such an awesome library. Now, I am obtaining an HTTP Error 400: Bad Request when attempting to send an email. I thought that the issue was being caused by an unexpired token perhaps. I could not quite track down exactly why this error was happening. But I run this scraper ~ once a week and after about a couple of months, this error started popping up.

Both the error and the relevant code that is producing the error can be found below.

Traceback (most recent call last):
  File "scraper.py", line 33, in main
    contents=updated_trials,
  File "/home/mattwilliams1760/.local/lib/python3.5/site-packages/yagmail/sender.py", line 147, in send
    self.login()
  File "/home/mattwilliams1760/.local/lib/python3.5/site-packages/yagmail/sender.py", line 244, in login
    self._login_oauth2(self.credentials)
  File "/home/mattwilliams1760/.local/lib/python3.5/site-packages/yagmail/sender.py", line 223, in _login_oauth2
    auth_string = self.get_oauth_string(self.user, oauth2_info)
  File "/home/mattwilliams1760/.local/lib/python3.5/site-packages/yagmail/sender.py", line 213, in get_oauth_string
    return get_oauth_string(user, oauth2_info)
  File "/home/mattwilliams1760/.local/lib/python3.5/site-packages/yagmail/oauth2.py", line 98, in get_oauth_string
    access_token, expires_in = refresh_authorization(**oauth2_info)
  File "/home/mattwilliams1760/.local/lib/python3.5/site-packages/yagmail/oauth2.py", line 93, in refresh_authorization
    response = call_refresh_token(google_client_id, google_client_secret, google_refresh_token)
  File "/home/mattwilliams1760/.local/lib/python3.5/site-packages/yagmail/oauth2.py", line 73, in call_refresh_token
    response = urlopen(request_url, encoded_params).read().decode('UTF-8')
  File "/usr/lib/python3.5/urllib/request.py", line 163, in urlopen
    return opener.open(url, data, timeout)
  File "/usr/lib/python3.5/urllib/request.py", line 472, in open
    response = meth(req, response)
  File "/usr/lib/python3.5/urllib/request.py", line 582, in http_response
    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python3.5/urllib/request.py", line 510, in error
    return self._call_chain(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 444, in _call_chain
    result = func(*args)
  File "/usr/lib/python3.5/urllib/request.py", line 590, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: Bad Request

Here is the relevant code in my script using the pattern you describe in the docs.

yag = yagmail.SMTP("email", oauth2_file="/home/mattwilliams1760/oauth2_creds.json") 
                yag.send(
                    to=["email", "email"],
                    subject="subject",
                )

I have all credentials in the oauth2_creds.json file in the following format:

{"email_address": "email address", "google_client_id": "client id", "google_refresh_token": "google refresh token", "google_client_secret": "google client secret"}

Any help would be greatly appreciated in tracking down what is going on. Please let me know if anything else is needed to help understand what is going on, I am still a bit of a beginner. My entire repo can be found here: https://github.com/asharma13524/clinical-trials-scraper

kootenpv commented 4 years ago

Yea I am not sure, I think OAuth2 possibly might not work anymore. I'd recommend switching to application specific passwords - this is my current way.

Hope it's useful to you!

asharma13524 commented 4 years ago

Thank you very much. This worked!