Python中如何向Gmail API发送multipart/mixed格式的批量请求
实现方案
核心逻辑:无需依赖requests的multipart/form-data封装,手动构造符合Gmail API要求的multipart/mixed格式请求体即可,实现代码如下:
import requests from tqdm import tqdm # 存储所有message-id的列表 messages = tqdm(gmail.list_messages('me')) gmailUrl = "https://gmail.googleapis.com/batch/gmail/v1" # 自定义边界值,尽量特殊避免和请求内容冲突 BOUNDARY = "batch_gmail_request_20240520" # 构造请求头 request_header = { "Host": "www.googleapis.com", "Content-Type": f"multipart/mixed; boundary={BOUNDARY}" } # 构造请求体 request_body = "" # 每次取80个消息打包 for idx in range(0, min(80, len(messages))): msg_id = messages[idx]['id'] # 每个子请求前加分隔符 request_body += f"--{BOUNDARY}\r\n" # 子请求头 request_body += "Content-Type: application/http\r\n\r\n" # 子请求内容:GET方法+对应接口路径 request_body += f"GET /gmail/v1/users/me/messages/{msg_id}\r\n\r\n" # 整个请求结束的收尾分隔符 request_body += f"--{BOUNDARY}--" # 发送请求,用data参数传构造好的请求体,不要用files response = requests.post(url=gmailUrl, auth=creds, headers=request_header, data=request_body) # 输出返回结果,返回内容也是multipart/mixed格式,可按相同规则拆分每个子请求的返回 print(response.status_code) print(response.text)
注意事项
- 边界值可以自定义,只要保证不会出现在请求体的内容里即可,建议用带随机字符的字符串避免冲突
- 每个子请求的格式要严格遵循规则,
\r\n换行不能少,否则Gmail API会解析失败 - 单批请求最多支持100个子请求,你设置的80个符合官方限制
- 拿到返回结果后,按照同样的边界值拆分即可得到每个GET请求的返回内容,拆分时注意过滤掉分隔符和子请求头即可提取到json格式的消息数据
内容的提问来源于stack exchange,提问作者Mxngls
相关产品推荐
相关产品推荐

