python - 使用 googleapiclient 通过 Id 发送电子邮件草稿

标签 python gmail-api google-api-client

我正在使用谷歌的 API 客户端与 Gmail API 进行交互。假设我有一个草稿的不可变 ID,我想发送相关的草稿。

我试过:

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

这里draft_id是我要发送的草稿ID,httpHttp 的一个实例适用于其他请求(因此它已正确验证)。

尝试以上操作,我得到了 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"

该文档有一个 Java example ,但没有python示例。

我尝试过的其他变体:
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)

最后一个实际上给出了一个不同的错误:
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">

这让我觉得它可能朝着正确的方向发展......(注意,我已经能够使用 ID 从上面链接的 API 资源管理器发送消息,所以我相信我正在使用有效的身份证)

发送这些数据的正确方法是什么?

我不确定这有多相关,但可以在 https://www.googleapis.com/discovery/v1/apis/gmail/v1/rest 上找到 GMAIL Api 的发现 API 表示。

具体来说,我认为我正在使用的方法由以下 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"
     }
    }
   }
  },

最佳答案

看着Gmail API Python docs ,看起来第二个参数是 body的请求。根据Gmail API reference ,您需要一个 id域中的 body 与 draftId您要发送的草稿:

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

关于python - 使用 googleapiclient 通过 Id 发送电子邮件草稿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35166327/

相关文章:

python - .extend() 方法返回 'None' 而不是我打算返回的所需列表组合

java - Gmail api 范围和格式不匹配

google-cloud-platform - 如何使用 API key 或用户名密码访问 GMail API?

javascript - Gmail JS API - OAuth2 错误 invalid_scope

python - Google pydrive 将文件上传到特定文件夹

email - 使用 Google API 获取用户的所有电子邮件地址

python - 将 numpy 数组的切片替换为另一个数组中的值

javascript - 未捕获的语法错误 : Unexpected end of JSON input error when i try to take data from mysql

python - 在 macOS 中安装 pip mininet

google-app-engine - 使用 @Named 和未命名参数从 Javascript 客户端库进行调用是没有意义的