如何通过Gmail API获取草稿的原始SMTP内容?求转换方法
获取Gmail草稿原始SMTP内容的方法
Gmail API默认返回的users.drafts.Draft对象确实不包含message.raw字段,但你可以通过指定请求参数拿到完整的邮件结构化数据,再通过工具库转换为原始SMTP格式,具体方法如下:
1. 获取带完整内容的草稿邮件数据
调用users.drafts.get接口时,添加format=full参数,返回的draft.message会包含所有邮件头、正文及附件的结构化信息(如payload.headers、payload.parts等)。示例代码:
# 使用google-api-python-client的示例请求 service.users().drafts().get(userId='me', id='你的草稿ID', format='full').execute()
2. 将结构化数据转换为原始SMTP内容
方式1:用Python标准库email手动构建
从Gmail返回的结构化数据中提取头信息、正文,组装成MIME消息后生成原始SMTP格式:
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import base64 def draft_to_smtp_raw(draft_msg): # 根据邮件类型初始化MIME对象 if draft_msg['payload']['mimeType'].startswith('multipart/'): msg = MIMEMultipart() else: msg = MIMEText('', draft_msg['payload']['mimeType'].split('/')[1]) # 添加所有邮件头 for header in draft_msg['payload']['headers']: msg[header['name']] = header['value'] # 处理正文和附件部分 def process_part(part): if part['mimeType'] in ['text/plain', 'text/html']: # 解码正文内容 content = base64.urlsafe_b64decode(part['body']['data']).decode('utf-8') msg.attach(MIMEText(content, part['mimeType'].split('/')[1])) elif 'filename' in part: # 处理附件 attachment = MIMEBase(part['mimeType'].split('/')[0], part['mimeType'].split('/')[1]) attachment.set_payload(base64.urlsafe_b64decode(part['body']['data'])) encoders.encode_base64(attachment) attachment.add_header('Content-Disposition', f'attachment; filename="{part["filename"]}"') msg.attach(attachment) # 处理嵌套的子部分 if 'parts' in part: for sub_part in part['parts']: process_part(sub_part) process_part(draft_msg['payload']) # 生成原始SMTP格式内容 return msg.as_string()
方式2:借助第三方库简化操作
可以使用mailparser库辅助解析Gmail返回的结构化数据,再结合email库生成原始内容,核心逻辑仍基于MIME消息的组装,无需额外复杂配置。
注意事项
- Gmail返回的内容采用
urlsafe_base64编码,解码时需使用base64.urlsafe_b64decode而非普通base64解码。 - 若草稿包含嵌套的多部分内容(如带附件的HTML邮件),需递归处理
payload.parts中的子部分。
内容的提问来源于stack exchange,提问作者hawlkim
相关产品推荐
相关产品推荐

