如何通过Gmail API复用现有草稿批量发送邮件给多个收件人
解决方案
要复用同一份Gmail草稿批量发送给不同收件人,核心思路是先获取目标草稿的完整内容,针对每个收件人修改邮件的「收件人(To)」字段,再通过API发送修改后的邮件内容。以下是修改后的完整代码:
完整代码
from googleapiclient.discovery import build from google.oauth2.credentials import Credentials import os import pickle from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import Request import pandas as pd import re SCOPES = ['https://mail.google.com/','https://www.googleapis.com/auth/gmail.modify','https://www.googleapis.com/auth/gmail.compose'] def get_credentials(): creds = None if os.path.exists('token.pickle'): with open('token.pickle', 'rb') as token: creds = pickle.load(token) if not creds or not creds.valid: if creds and creds.expired and creds.refresh_token: creds.refresh(Request()) else: flow = InstalledAppFlow.from_client_secrets_file( 'credential.json', SCOPES) creds = flow.run_local_server(port=0) with open('token.pickle', 'wb') as token: pickle.dump(creds, token) return creds def get_target_draft(service, user_id, draft_subject): """根据主题查找目标草稿""" drafts_list = service.users().drafts().list(userId=user_id).execute().get('drafts', []) for draft in drafts_list: draft_detail = service.users().drafts().get(userId=user_id, id=draft['id']).execute() message = draft_detail['message'] # 解析邮件主题 subject = next((h['value'] for h in message['payload']['headers'] if h['name'] == 'Subject'), None) if subject == draft_subject: return draft_detail return None def send_draft_to_recipient(service, user_id, draft_detail, recipient): """将指定草稿内容发送给单个收件人""" # 复制原始草稿的邮件内容,避免修改原草稿 message = draft_detail['message'].copy() headers = message['payload']['headers'] # 修改或添加收件人字段 to_header_idx = next((i for i, h in enumerate(headers) if h['name'] == 'To'), None) if to_header_idx is not None: headers[to_header_idx]['value'] = recipient else: headers.append({'name': 'To', 'value': recipient}) message['payload']['headers'] = headers # 构造发送请求 send_body = {'message': message} response = service.users().drafts().send(userId=user_id, body=send_body).execute() print(f"邮件已发送至 {recipient},消息ID: {response['id']}") return response # 初始化服务 creds = get_credentials() service = build('gmail', 'v1', credentials=creds) user_email = 'me' # -------------------------- 配置参数 -------------------------- # 你要复用的草稿主题(需与Gmail草稿箱中的主题完全一致) TARGET_DRAFT_SUBJECT = "请替换为你的草稿主题" # 收件人列表:可手动输入,或从Excel读取 recipients = [ 'recipient1@example.com', 'recipient2@example.com', # 更多收件人... ] # 若从Excel读取,可注释上面的列表,取消下面两行注释 # df = pd.read_excel('收件人列表.xlsx') # recipients = df['邮箱列名'].tolist() # ------------------------------------------------------------- # 执行批量发送 target_draft = get_target_draft(service, user_email, TARGET_DRAFT_SUBJECT) if not target_draft: print(f"未找到主题为「{TARGET_DRAFT_SUBJECT}」的草稿,请检查主题是否正确") else: for recipient in recipients: # 简单验证邮箱格式 if re.match(r"[^@]+@[^@]+\.[^@]+", recipient): send_draft_to_recipient(service, user_email, target_draft, recipient) else: print(f"无效邮箱地址:{recipient},已跳过")
关键说明
- 获取目标草稿:通过
get_target_draft函数根据主题匹配草稿,确保准确找到你要复用的那份草稿。 - 修改收件人:复制原始草稿的邮件内容后,修改「To」头部字段为当前收件人,不会改动Gmail草稿箱中的原草稿。
- 批量发送:循环遍历收件人列表,逐个发送修改后的邮件,同时保留原草稿的主题、正文、附件等所有内容。
内容的提问来源于stack exchange,提问作者Vinay Sharma
相关产品推荐
相关产品推荐

