Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using googleapiclient to send an email draft by Id

I'm using google's API client to interact with the Gmail API. Assuming I have a draft's immutable ID, I'd like to send the associated draft.

I tried:

service.users().drafts().send(
    userId='me', id=draft_id).execute(http=http)

Here draft_id is the id of the draft that I'd like to send, http is an instance of Http that works for other requests (so it is properly authenticated).

Trying the above, I get a TypeError:

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/Users/mgilson/git/spider-web/app/pattern/handlers/ajax/email.py", line 77, in post
    'success': int(client.send_draft(draft_id))
  File "/Users/mgilson/git/spider-web/app/pattern/services/email/gmail.py", line 601, in send_draft
    userId='me', id=draft_id) \
  File "/Users/mgilson/git/spider-web/app/third_party/googleapiclient/discovery.py", line 669, in method
    raise TypeError('Got an unexpected keyword argument "%s"' % name)
TypeError: Got an unexpected keyword argument "id"

The documentation has a Java example, but no python example.

Other variations that I've tried:

service.users().drafts().send(
    userId='me', draftId=draft_id).execute(http=http)

service.users().drafts().send(
    userId='me', draft_id=draft_id).execute(http=http)

service.users().drafts().send(
    userId='me', body={'draft': {'id': draft_id}}).execute(http=http)

The last one actually gives a different error:

Traceback (most recent call last):
  File "/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/lib/webapp2-2.5.2/webapp2.py", line 570, in dispatch
    return method(*args, **kwargs)
  File "/Users/mgilson/git/spider-web/app/pattern/handlers/ajax/email.py", line 77, in post
    'success': int(client.send_draft(draft_id))
  File "/Users/mgilson/git/spider-web/app/pattern/services/email/gmail.py", line 603, in send_draft
    .execute(http=self._http)
  File "/Users/mgilson/git/spider-web/app/third_party/oauth2client/util.py", line 140, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/Users/mgilson/git/spider-web/app/third_party/googleapiclient/http.py", line 729, in execute
    raise HttpError(resp, content, uri=self.uri)
HttpError: <HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/drafts/send?alt=json returned "Invalid draft">

which makes me feel like it might be moving in the correct direction ... (note, I've been able to use the IDs to send messages from the API explorer linked above, so I'm confident that I'm working with valid IDs)

What's the right way to send this data?


I'm not sure how relevant this is, but the discovery API's representation of the GMAIL Api can be found at https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest

Specifically, I think that the method I'm working with is defined by the following JSON:

  "send": {
   "id": "gmail.users.drafts.send",
   "path": "{userId}/drafts/send",
   "httpMethod": "POST",
   "description": "Sends the specified, existing draft to the recipients in the To, Cc, and Bcc headers.",
   "parameters": {
    "userId": {
     "type": "string",
     "description": "The user's email address. The special value me can be used to indicate the authenticated user.",
     "default": "me",
     "required": true,
     "location": "path"
    }
   },
   "parameterOrder": [
    "userId"
   ],
   "request": {
    "$ref": "Draft"
   },
   "response": {
    "$ref": "Message"
   },
   "scopes": [
    "https://mail.google.com/",
    "https://www.googleapis.com/auth/gmail.compose",
    "https://www.googleapis.com/auth/gmail.modify"
   ],
   "supportsMediaUpload": true,
   "mediaUpload": {
    "accept": [
     "message/rfc822"
    ],
    "maxSize": "35MB",
    "protocols": {
     "simple": {
      "multipart": true,
      "path": "/upload/gmail/v1/users/{userId}/drafts/send"
     },
     "resumable": {
      "multipart": true,
      "path": "/resumable/upload/gmail/v1/users/{userId}/drafts/send"
     }
    }
   }
  },
like image 569
mgilson Avatar asked Feb 03 '16 00:02

mgilson


1 Answers

Looking at the Gmail API Python docs, it looks like the second parameter is the body of the request. According to the Gmail API reference, you need an id field in the body with the draftId of the draft you want to send:

service.users().drafts().send(
    userId='me', body={ 'id': draft_id }).execute(http=http)
like image 144
Tholle Avatar answered Oct 24 '22 06:10

Tholle