curl调用Gmail API发邮件返回400 Recipient address required错误
错误原因
- 你对
users.messages.send接口的入参格式理解有误,该接口不会解析请求体中传入的payload字段内容,你当前传入的raw字段为空字符串,接口无法从请求中提取到收件人地址,因此返回400错误。 - 该接口的固定规则是:仅识别请求体中的
raw字段,该字段需要传入符合RFC 2822标准的完整邮件内容经base64url编码后的字符串。你额外传入的payload、headers等结构,是查询邮件详情、创建草稿类接口使用的结构,不会被send接口解析处理。 - 两个GET接口调用正常是因为这类接口本身就是返回结构化的邮件对象,你的鉴权参数、路径参数符合要求即可正常返回,和send接口的入参校验规则没有关联。
解决方案
按以下步骤调整请求即可:
- 先构造符合RFC 2822规范的原始邮件内容,注意邮件头部和正文之间必须保留一个空行,示例如下:
From: email1@gmail.com To: email2@gmail.com, email3@gmail.com Subject: Subject test MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 这里填写你的邮件正文内容
- 将上述完整的原始邮件字符串做base64url编码:编码规则为使用标准base64编码后,将结果中的
+替换为-、/替换为_,同时删除末尾的=填充字符。 - 调整curl请求体,仅保留
raw字段传入编码结果,删除无效的payload相关内容,正确请求示例:
curl --request POST \ 'https://gmail.googleapis.com/gmail/v1/users/me/messages/send?key=[YOUR_API_KEY]' \ --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \ --header 'Accept: application/json' \ --header 'Content-Type: application/json' \ --data '{"raw":"替换为你上一步得到的base64url编码结果"}' \ --compressed
内容的提问来源于stack exchange,提问作者yvon
相关产品推荐
相关产品推荐

