以下是更加细化的 使用 Marketo REST API 批量修改邮件内容 的步骤,详细解释每个阶段的操作,包括 API 的请求、数据处理及潜在问题解决。
前期准备工作
确保 Marketo API 访问权限
- 你需要 Marketo REST API 用户 和 API Role,有权限访问邮件资产(Assets)。
- 获取 API 用户的 Client ID 和 Client Secret。
- Marketo Endpoint URL:这个在 Marketo 后台的 Admin > Web Services 页面可以找到。
获取访问令牌(Access Token)
要调用 Marketo API,首先需要获取一个Access Token
。请求示例:
POST https://<your-marketo-endpoint>/identity/oauth/token?grant_type=client_credentials&client_id=YOUR_CLIENT_ID&client_secret=YOUR_CLIENT_SECRET
返回示例:
{ "access_token": "abc123xyz", "token_type": "bearer", "expires_in": 3600 }
保存:记录返回的
access_token
,所有后续请求都要使用它。
步骤一:获取所有邮件的列表
API 端点
- GET /rest/asset/v1/emails.json:获取所有邮件及其
id
。
请求示例
GET https://<your-marketo-endpoint>/rest/asset/v1/emails.json?access_token=YOUR_ACCESS_TOKEN
关键参数
- access_token:认证用的访问令牌。
- offset 和 maxReturn(可选):用于分页,
maxReturn
最大为 200。
响应示例
{
"success": true,
"result": [
{
"id": 1234,
"name": "Holiday Promo Email",
"url": "https://app-xyz.marketo.com/#EM1234",
"status": "approved"
},
{
"id": 5678,
"name": "Newsletter Q4",
"url": "https://app-xyz.marketo.com/#EM5678",
"status": "approved"
}
]
}
记录结果
- 邮件 ID (
id
):后续获取内容时需要用到。 - 邮件名称 (
name
):方便管理和确认。
步骤二:逐个获取邮件的 HTML 内容
API 端点
- GET /rest/asset/v1/email/{id}/content.json:获取指定邮件的内容。
请求示例
GET https://<your-marketo-endpoint>/rest/asset/v1/email/1234/content.json?access_token=YOUR_ACCESS_TOKEN
响应示例
{
"success": true,
"result": [
{
"type": "Text",
"content": "<html><body>Click here: <a href='https://old-link.com'>Link</a></body></html>"
}
]
}
保存内容
- 解析返回的 HTML 内容,记录到本地文件或数据结构中。
步骤三:替换邮件 HTML 内容中的链接
使用脚本替换 HTML 中的旧链接为新链接,示例如下:
Python 替换脚本示例
import requests
import re
# API 基本信息
MARKETO_ENDPOINT = 'https://<your-marketo-endpoint>'
ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN'
OLD_LINK = 'https://old-link.com'
NEW_LINK = 'https://new-link.com'
# 获取邮件列表
def get_emails():
url = f"{MARKETO_ENDPOINT}/rest/asset/v1/emails.json?access_token={ACCESS_TOKEN}"
response = requests.get(url)
return response.json().get('result', [])
# 获取邮件内容
def get_email_content(email_id):
url = f"{MARKETO_ENDPOINT}/rest/asset/v1/email/{email_id}/content.json?access_token={ACCESS_TOKEN}"
response = requests.get(url)
return response.json().get('result', [])[0]['content']
# 更新邮件内容
def update_email_content(email_id, updated_content):
url = f"{MARKETO_ENDPOINT}/rest/asset/v1/email/{email_id}/content.json?access_token={ACCESS_TOKEN}"
payload = {'content': updated_content}
response = requests.post(url, json=payload)
return response.json()
# 替换链接
def replace_links():
emails = get_emails()
for email in emails:
email_id = email['id']
print(f"Processing Email ID: {email_id}")
# 获取当前内容
content = get_email_content(email_id)
# 替换旧链接
updated_content = re.sub(OLD_LINK, NEW_LINK, content)
# 更新邮件内容
update_response = update_email_content(email_id, updated_content)
print(f"Updated Email {email_id}: {update_response}")
# 执行替换
replace_links()
脚本执行流程:
- 获取邮件列表:调用
/emails.json
获取邮件 ID。 - 获取内容:逐一调用
/email/{id}/content.json
获取每封邮件的 HTML 内容。 - 替换链接:使用
re.sub
替换旧链接。 - 更新内容:调用
POST /email/{id}/content.json
上传新的 HTML 内容。 - 验证结果:检查 API 响应状态码,确保修改成功。
步骤四:批准修改后的邮件
更新邮件后,邮件会变为草稿状态,需要重新批准才能发送。
API 端点
- POST /rest/asset/v1/email/{id}/approveDraft.json:批准邮件。
请求示例
POST https://<your-marketo-endpoint>/rest/asset/v1/email/1234/approveDraft.json?access_token=YOUR_ACCESS_TOKEN
响应示例
{
"success": true,
"result": [
{ "id": 1234, "status": "approved" }
]
}
步骤五:验证更新结果
- 手动检查部分邮件:随机抽取几封邮件,检查链接是否正确替换。
- 发送测试邮件:确保邮件的 HTML 和链接在实际发送时显示正确。
- API 验证:再次调用
/email/{id}/content.json
确认更新后的内容。
潜在问题与解决方案
API 配额限制:Marketo 每日 API 调用次数有限,超出配额需等待重置。
- 解决:分批执行脚本,避免短时间内触发配额限制。
HTML 内容嵌套复杂:可能需要更复杂的正则表达式匹配。
- 解决:使用 HTML 解析库如
BeautifulSoup
代替简单字符串替换。
- 解决:使用 HTML 解析库如
邮件未批准:修改内容后未批准的邮件无法正常发送。
- 解决:确保调用
approveDraft
API。
- 解决:确保调用
旧链接遗漏:部分邮件可能含有不同格式或嵌套的链接。
- 解决:测试替换逻辑,覆盖所有可能的链接结构。
这样,通过细化的步骤,你可以使用 Marketo REST API 批量获取邮件内容,替换旧链接并重新批准邮件,确保所有邮件更新完成。