【问题标题】:Gmail Api Create Draft ReplyGmail Api 创建草稿回复
【发布时间】:2018-02-20 13:36:40
【问题描述】:

我正在使用谷歌 API 文档中的创建草稿功能:

https://developers.google.com/gmail/api/v1/reference/users/drafts/create

每当我发送消息时,当我进入 gmail 时,我的电子邮件消息文本中都会显示以下内容:

hello world
Date: Mon, 11 Sep 2017 15:31:19 +0200
Message-Id: <CAKPeGO69TbbigNFrK8T37fYgPzCfZwVf=p0gkvJbZF6duwWsdw@mail.gmail.com>
From: myemailaddress@gmail.com

我不知道为什么我会收到所有这些文本。

我要做的是创建一个草稿电子邮件回复现有电子邮件,但我似乎得到的只是一个带有上述文本的新草稿(没有填充收件人/发件人/主题字段)。

这是我正在使用的功能:

import base64
from email.mime.audio import MIMEAudio
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import mimetypes
import os

def CreateDraft(service, user_id, message_body):
   """Create and insert a draft email. Print the returned draft's message and id.

  Args:
    service: Authorized Gmail API service instance.
    user_id: User's email address. The special value "me"
    can be used to indicate the authenticated user.
    message_body: The body of the email message, including headers.

  Returns:
    Draft object, including draft id and message meta data.
  """
    try:


        draft = service.users().drafts().create(userId=user_id, body=message_body).execute()

        print('Draft id: %s\nDraft message: %s' % (draft['id'], draft['message']))

        return draft

    except errors.HttpError as error:
        print('An error occurred: %s' % error)
        return None

我是这样称呼它的:

 gdraft.CreateDraft(service, user_id='me', message_body=
    {
        'message':
            {'raw': 'aGVsbG8gd29ybGQ=',
             'threadId': '15e5bdc650b1a068',
             'payload': {
                 "mimeType": "multipart/alternative",
                 "headers": [
                     {
                         "name": "In-Reply-To",
                         "value": "<16DCF6644C054E39B1F7F901BDD08EA2@466209web4@mail.gmail.com>"
                     },
                     {
                         "name": "References",
                         "value": '<16DCF6644C054E39B1F7F901BDD08EA2@466209web4@mail.gmail.com>'
                     },
                     {
                         "name": "Message-ID",
                         "value": "<16DCF6644C054E39B1F7F901BDD08EA2@466209web4@mail.gmail.com"
                     },
                     {
                         "name": "Subject",
                         "value": "Re: Software Developer - Hertford"
                     }
                 ]
             }
             }
    })

我已经尝试了四天没有成功,所以我非常感谢任何帮助。

更新:

所以看来我可能需要使用 createmessage 函数(基于下面的 cmets);但是这似乎在 Python3 中不起作用。

我变了:

return {'raw': base64.urlsafe_b64encode(message.as_string())}

到:

 return {'raw': str(base64.urlsafe_b64encode(message.as_string().encode("utf-8")))}

试图让它工作,但我收到错误:

An error occurred: <HttpError 400 when requesting https://www.googleapis.com/gmail/v1/users/me/drafts?alt=json returned "Missing draft message">

【问题讨论】:

  • 我认为您没有对消息进行编码。文档似乎正在使用 MimeText 类来包装消息正文,然后对其进行编码。您使用的字段似乎也有误。
  • 作为 body_message 你拥有所有的 json 值。这就是为什么您将所有信息都作为正文消息获取的原因。您必须使用 CreateMessage 方法来创建包含信息的草稿:to、from、Subject
  • 我尝试使用创建消息功能...但它没有正确形成消息。我得到:发生错误:googleapis.com/gmail/v1/users/me/drafts?alt=json returned "Missing draft message"> - 似乎创建消息函数尝试对整个消息进行 base64 编码,而不仅仅是原始部分。话虽如此,我确实修改了函数以使用 Python3。也许我做错了。
  • 正如post 中的建议,您需要将base64.urlsafe_b64encode(message.as_string())url-safe base64 字母一起使用,否则您的raw 字段中将包含无效字符。请参阅:developers.google.com/gmail/api/v1/reference/users/messages/… 了解更多信息。
  • @abielita 这不是我在上面的代码中所做的吗?

标签: python gmail-api


【解决方案1】:

感谢大家留下的cmets。你在不同的点上都是对的。

问题是我使用的示例与文档页面上的示例略有不同。

我发现这里的代码有效:https://developers.google.com/gmail/api/guides/drafts

可以这样使用:

msg = create_message('YOU@gmail.com','THEM@company.com','Re: Some Subject','This is a test')

create_draft(service,'me',  msg)

【讨论】:

    猜你喜欢
    • 2014-10-19
    • 2017-06-17
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2017-11-29
    • 1970-01-01
    • 2018-02-26
    相关资源
    最近更新 更多