mircealungu
mircealungu

Reputation: 6981

GMail Oauth2 authentication for yagmail stops working after a few days

I've started using yagmail a while ago for sending mails via GMail using OAuth2.

The code that I use is straightforward:

    def send_with_yagmail(self):
        yag = yagmail.SMTP(self.our_email, oauth2_file="/<path_to>/credentials.json")
        yag.send(self.to_email, self.message_subject, contents=self.message_body)

All was well for a few days, and then suddenly Gmail stopped sending mails with the following as part of the stack trace:

...
return get_oauth_string(user, oauth2_info)                            
File "/usr/local/lib/p│ython3.9/site-packages/yagmail/oauth2.py", line 96, in get_oauth_string
  access_token, expires_in = refresh_authorization(**oauth2_info)
File "/usr/local/lib/python3.9/site-packages/yagmail/oauth2.py", line 91, in refresh_authorization
  response = call_refresh_token(google_client_id, google_client_secret, google_refresh_token)
File "/usr/local/lib/python3.9/site-packages/yagmail/oauth2.py", line 71, in call_refresh_token
 response = urlopen(request_url, encoded_params).read().decode('UTF-8')
File "/usr/local/lib/python3.9/urllib/request.py", line 214, in urlopen 
  return opener.open(url, data, timeout)                                
File "/usr/local/lib/python3.9/urllib/request.py", line 523, in open    
  response = meth(req, response)                                        
File "/usr/local/lib/python3.9/urllib/request.py", line 632, in http_response
  response = self.parent.error(
File "/usr/local/lib/python3.9/urllib/request.py", line 561, in error   
  return self._call_chain(*args)
File "/usr/local/lib/python3.9/urllib/request.py", line 494, in _call_chain
  result = func(*args)│Ju
  File "/usr/local/lib/python3.9/urllib/request.py", line 641, in http_error_default
 raise HTTPError(req.full_url, code, msg, hdrs, fp)                    
urllib.error.HTTPError: HTTP Error 400: Bad Request                       

I've solved it by regenerating the credentials.json locally on my machine and uploading to the server thinking that it's a one-off event. It worked for a few days and now it stopped working again. So I'm wondering: what should I do so I don't have to regenerate the credentials every few days? My credentials.json looks like below:

{
  "email_address": "[email protected]",
  "google_client_id": "74<blabla>0e1feov.apps.googleusercontent.com",
  "google_client_secret": "GOCSP<blabla<kOz",
  "google_refresh_token": "1//09<blabla>-2_dxZH8"
}

Isn't the point of the refresh token to be used by the library such that I don't have to regenerate this thing by hand?

Can anybody recommend something that can be done? Thanks!

Upvotes: 0

Views: 627

Answers (1)

Erik
Erik

Reputation: 331

I ran into this same problem, is your app in 'testing' mode with the Google API? Testing tokens have an expiration of 7 days, which is why you had to re-generate your token. I found this answer, but after I changed my status to "In Production" it now gives me an authentication error. Based on this page if you're using Gmail, a production app needs to be verified by Google, but my credential says it doesn't need to be verified and I don't see an option to request verification. Might need to create a new credential?

Upvotes: 1

Related Questions