You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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},已跳过")

关键说明

  1. 获取目标草稿:通过get_target_draft函数根据主题匹配草稿,确保准确找到你要复用的那份草稿。
  2. 修改收件人:复制原始草稿的邮件内容后,修改「To」头部字段为当前收件人,不会改动Gmail草稿箱中的原草稿。
  3. 批量发送:循环遍历收件人列表,逐个发送修改后的邮件,同时保留原草稿的主题、正文、附件等所有内容。

内容的提问来源于stack exchange,提问作者Vinay Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 10:35:06