SendGrid
2026-03-31
新闻来源:网淘吧
围观:17
电脑广告
手机广告
SendGrid
通过托管的OAuth认证访问SendGrid API。发送交易和营销邮件,管理联系人、模板、退订,并分析邮件性能。
快速开始
# Get user profile
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/sendgrid/v3/user/profile')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
基础URL
https://gateway.maton.ai/sendgrid/{native-api-path}
将{native-api-path}替换为实际的SendGrid API端点路径。网关将请求代理到api.sendgrid.com并自动注入您的OAuth令牌。

认证
所有请求都需要在Authorization头部中包含Maton API密钥:
Authorization: Bearer $MATON_API_KEY
环境变量:将您的API密钥设置为MATON_API_KEY:
export MATON_API_KEY="YOUR_API_KEY"
获取您的API密钥
复制您的API密钥
在https://ctrl.maton.ai管理您的 SendGrid OAuth 连接。
列出连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections?app=sendgrid&status=ACTIVE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
创建连接
python <<'EOF'
import urllib.request, os, json
data = json.dumps({'app': 'sendgrid'}).encode()
req = urllib.request.Request('https://ctrl.maton.ai/connections', data=data, method='POST')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Content-Type', 'application/json')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
获取连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
响应:
{
"connection": {
"connection_id": "943c6cd5-9a56-4f5b-8adf-ecd4a140049f",
"status": "ACTIVE",
"creation_time": "2026-02-11T10:53:41.817938Z",
"last_updated_time": "2026-02-11T10:54:05.554084Z",
"url": "https://connect.maton.ai/?session_token=...",
"app": "sendgrid",
"metadata": {}
}
}
在浏览器中打开返回的URL以完成 OAuth 授权。
删除连接
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections/{connection_id}', method='DELETE')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
指定连接
如果您有多个 SendGrid 连接,请使用Maton-Connection请求头来指定要使用哪一个:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://gateway.maton.ai/sendgrid/v3/user/profile')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
req.add_header('Maton-Connection', '943c6cd5-9a56-4f5b-8adf-ecd4a140049f')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
如果省略,网关将使用默认的(最早的)活动连接。
API 参考
所有 SendGrid API 端点都遵循此模式:
/sendgrid/v3/{resource}
邮件发送
发送邮件
POST /sendgrid/v3/mail/send
Content-Type: application/json
{
"personalizations": [
{
"to": [{"email": "recipient@example.com", "name": "Recipient"}],
"subject": "Hello from SendGrid"
}
],
"from": {"email": "sender@example.com", "name": "Sender"},
"content": [
{
"type": "text/plain",
"value": "This is a test email."
}
]
}
使用 HTML 内容:
POST /sendgrid/v3/mail/send
Content-Type: application/json
{
"personalizations": [
{
"to": [{"email": "recipient@example.com"}],
"subject": "HTML Email"
}
],
"from": {"email": "sender@example.com"},
"content": [
{
"type": "text/html",
"value": "<h1>Hello</h1><p>This is an HTML email.</p>"
}
]
}
使用模板:
POST /sendgrid/v3/mail/send
Content-Type: application/json
{
"personalizations": [
{
"to": [{"email": "recipient@example.com"}],
"dynamic_template_data": {
"first_name": "John",
"order_id": "12345"
}
}
],
"from": {"email": "sender@example.com"},
"template_id": "d-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
用户资料
获取用户资料
GET /sendgrid/v3/user/profile
响应:
{
"type": "user",
"userid": 59796657
}
获取账户详情
GET /sendgrid/v3/user/account
营销联系人
列出联系人
GET /sendgrid/v3/marketing/contacts
响应:
{
"result": [],
"contact_count": 0,
"_metadata": {
"self": "https://api.sendgrid.com/v3/marketing/contacts"
}
}
搜索联系人
POST /sendgrid/v3/marketing/contacts/search
Content-Type: application/json
{
"query": "email LIKE '%@example.com%'"
}
添加/更新联系人
PUT /sendgrid/v3/marketing/contacts
Content-Type: application/json
{
"contacts": [
{
"email": "contact@example.com",
"first_name": "John",
"last_name": "Doe"
}
]
}
响应:
{
"job_id": "2387e363-4104-4225-8960-4a5758492351"
}
注意:联系人操作是异步的。请使用任务状态端点来检查进度。
获取导入任务状态
GET /sendgrid/v3/marketing/contacts/imports/{job_id}
响应:
{
"id": "2387e363-4104-4225-8960-4a5758492351",
"status": "pending",
"job_type": "upsert_contacts",
"results": {
"requested_count": 1,
"created_count": 1
},
"started_at": "2026-02-11T11:00:14Z"
}
删除联系人
DELETE /sendgrid/v3/marketing/contacts?ids=contact_id_1,contact_id_2
按ID获取联系人
GET /sendgrid/v3/marketing/contacts/{contact_id}
按邮箱获取联系人
POST /sendgrid/v3/marketing/contacts/search/emails
Content-Type: application/json
{
"emails": ["contact@example.com"]
}
营销列表
列出所有列表
GET /sendgrid/v3/marketing/lists
响应:
{
"result": [],
"_metadata": {
"self": "https://api.sendgrid.com/v3/marketing/lists?page_size=100&page_token="
}
}
创建列表
POST /sendgrid/v3/marketing/lists
Content-Type: application/json
{
"name": "My Contact List"
}
响应:
{
"name": "My Contact List",
"id": "b050f139-4231-47c8-bf32-94ad76376d3b",
"contact_count": 0,
"_metadata": {
"self": "https://api.sendgrid.com/v3/marketing/lists/b050f139-4231-47c8-bf32-94ad76376d3b"
}
}
按ID获取列表
GET /sendgrid/v3/marketing/lists/{list_id}
更新列表
PATCH /sendgrid/v3/marketing/lists/{list_id}
Content-Type: application/json
{
"name": "Updated List Name"
}
删除列表
DELETE /sendgrid/v3/marketing/lists/{list_id}
将联系人添加到列表
PUT /sendgrid/v3/marketing/contacts
Content-Type: application/json
{
"list_ids": ["list_id"],
"contacts": [
{"email": "contact@example.com"}
]
}
分段
列出分段
GET /sendgrid/v3/marketing/segments
创建分段
POST /sendgrid/v3/marketing/segments
Content-Type: application/json
{
"name": "Active Users",
"query_dsl": "email_clicks > 0"
}
通过ID获取分段
GET /sendgrid/v3/marketing/segments/{segment_id}
删除分段
DELETE /sendgrid/v3/marketing/segments/{segment_id}
模板
列出模板
GET /sendgrid/v3/templates
带生成过滤器:
GET /sendgrid/v3/templates?generations=dynamic
创建模板
POST /sendgrid/v3/templates
Content-Type: application/json
{
"name": "My Template",
"generation": "dynamic"
}
响应:
{
"id": "d-ffcdb43ed8a04beba48a702e1717ddb5",
"name": "My Template",
"generation": "dynamic",
"updated_at": "2026-02-11 11:00:20",
"versions": []
}
通过ID获取模板
GET /sendgrid/v3/templates/{template_id}
更新模板
PATCH /sendgrid/v3/templates/{template_id}
Content-Type: application/json
{
"name": "Updated Template Name"
}
删除模板
DELETE /sendgrid/v3/templates/{template_id}
创建模板版本
POST /sendgrid/v3/templates/{template_id}/versions
Content-Type: application/json
{
"name": "Version 1",
"subject": "{{subject}}",
"html_content": "<html><body><h1>Hello {{name}}</h1></body></html>",
"active": 1
}
响应:
{
"id": "54230a99-1e89-4edf-821d-d4925b40c64b",
"template_id": "d-ffcdb43ed8a04beba48a702e1717ddb5",
"active": 1,
"name": "Version 1",
"html_content": "<html><body><h1>Hello {{name}}</h1></body></html>",
"plain_content": "Hello {{name}}",
"generate_plain_content": true,
"subject": "{{subject}}",
"editor": "code",
"thumbnail_url": "//..."
}
发件人
列出发件人
GET /sendgrid/v3/senders
创建发件人
POST /sendgrid/v3/senders
Content-Type: application/json
{
"nickname": "My Sender",
"from": {"email": "sender@example.com", "name": "Sender Name"},
"reply_to": {"email": "reply@example.com", "name": "Reply To"},
"address": "123 Main St",
"city": "San Francisco",
"country": "USA"
}
响应:
{
"id": 8513177,
"nickname": "My Sender",
"from": {"email": "sender@example.com", "name": "Sender Name"},
"reply_to": {"email": "reply@example.com", "name": "Reply To"},
"address": "123 Main St",
"city": "San Francisco",
"country": "USA",
"verified": {"status": false, "reason": null},
"updated_at": 1770786031,
"created_at": 1770786031,
"locked": false
}
注意:使用前需要进行发件人验证。请检查已验证状态。
通过ID获取发件人
GET /sendgrid/v3/senders/{sender_id}
更新发件人
PATCH /sendgrid/v3/senders/{sender_id}
Content-Type: application/json
{
"nickname": "Updated Sender Name"
}
删除发件人
DELETE /sendgrid/v3/senders/{sender_id}
退订列表
退信
# List bounces
GET /sendgrid/v3/suppression/bounces
# Get bounce by email
GET /sendgrid/v3/suppression/bounces/{email}
# Delete bounces
DELETE /sendgrid/v3/suppression/bounces
Content-Type: application/json
{
"emails": ["bounce@example.com"]
}
拦截
# List blocks
GET /sendgrid/v3/suppression/blocks
# Get block by email
GET /sendgrid/v3/suppression/blocks/{email}
# Delete blocks
DELETE /sendgrid/v3/suppression/blocks
Content-Type: application/json
{
"emails": ["blocked@example.com"]
}
无效邮箱
# List invalid emails
GET /sendgrid/v3/suppression/invalid_emails
# Delete invalid emails
DELETE /sendgrid/v3/suppression/invalid_emails
Content-Type: application/json
{
"emails": ["invalid@example.com"]
}
垃圾邮件举报
# List spam reports
GET /sendgrid/v3/suppression/spam_reports
# Delete spam reports
DELETE /sendgrid/v3/suppression/spam_reports
Content-Type: application/json
{
"emails": ["spam@example.com"]
}
全局退订
# List global unsubscribes
GET /sendgrid/v3/suppression/unsubscribes
# Add to global unsubscribes
POST /sendgrid/v3/asm/suppressions/global
Content-Type: application/json
{
"recipient_emails": ["unsubscribe@example.com"]
}
退订组 (ASM)
列表组
GET /sendgrid/v3/asm/groups
创建组
POST /sendgrid/v3/asm/groups
Content-Type: application/json
{
"name": "Weekly Newsletter",
"description": "Weekly newsletter updates"
}
响应:
{
"name": "Weekly Newsletter",
"id": 122741,
"description": "Weekly newsletter updates",
"is_default": false
}
按ID获取组
GET /sendgrid/v3/asm/groups/{group_id}
更新组
PATCH /sendgrid/v3/asm/groups/{group_id}
Content-Type: application/json
{
"name": "Updated Group Name"
}
删除组
DELETE /sendgrid/v3/asm/groups/{group_id}
向组添加退订项
POST /sendgrid/v3/asm/groups/{group_id}/suppressions
Content-Type: application/json
{
"recipient_emails": ["user@example.com"]
}
列出组内退订项
GET /sendgrid/v3/asm/groups/{group_id}/suppressions
统计
获取全局统计
GET /sendgrid/v3/stats?start_date=2026-02-01
结束日期:
GET /sendgrid/v3/stats?start_date=2026-02-01&end_date=2026-02-28
响应:
[
{
"date": "2026-02-01",
"stats": [
{
"metrics": {
"blocks": 0,
"bounce_drops": 0,
"bounces": 0,
"clicks": 0,
"deferred": 0,
"delivered": 0,
"invalid_emails": 0,
"opens": 0,
"processed": 0,
"requests": 0,
"spam_report_drops": 0,
"spam_reports": 0,
"unique_clicks": 0,
"unique_opens": 0,
"unsubscribe_drops": 0,
"unsubscribes": 0
}
}
]
}
]
分类统计
GET /sendgrid/v3/categories/stats?start_date=2026-02-01&categories=category1,category2
邮箱提供商统计
GET /sendgrid/v3/mailbox_providers/stats?start_date=2026-02-01
浏览器统计
GET /sendgrid/v3/browsers/stats?start_date=2026-02-01
API密钥
列出API密钥
GET /sendgrid/v3/api_keys
创建API密钥
{
"result": [
{
"name": "MatonTest",
"api_key_id": "WJBgv5EKR8y0nn2F8Qfk5w"
}
]
}
通过ID获取API密钥
POST /sendgrid/v3/api_keys
Content-Type: application/json
{
"name": "New API Key",
"scopes": ["mail.send", "alerts.read"]
}
更新API密钥
GET /sendgrid/v3/api_keys/{api_key_id}
删除API密钥
PATCH /sendgrid/v3/api_keys/{api_key_id}
Content-Type: application/json
{
"name": "Updated Key Name"
}
分页
DELETE /sendgrid/v3/api_keys/{api_key_id}
SendGrid为营销端点使用基于令牌的分页:
响应包括:
GET /sendgrid/v3/marketing/lists?page_size=100&page_token={token}
对于抑制端点,使用
{
"result": [...],
"_metadata": {
"self": "https://api.sendgrid.com/v3/marketing/lists?page_size=100&page_token=",
"next": "https://api.sendgrid.com/v3/marketing/lists?page_size=100&page_token=abc123"
}
}
limit和offset:代码示例
GET /sendgrid/v3/suppression/bounces?limit=100&offset=0
JavaScript
Python
// Send an email
const response = await fetch(
'https://gateway.maton.ai/sendgrid/v3/mail/send',
{
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.MATON_API_KEY}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
personalizations: [{
to: [{email: 'recipient@example.com'}],
subject: 'Hello'
}],
from: {email: 'sender@example.com'},
content: [{type: 'text/plain', value: 'Hello World'}]
})
}
);
注意事项
import os
import requests
# Get email stats
response = requests.get(
'https://gateway.maton.ai/sendgrid/v3/stats',
headers={'Authorization': f'Bearer {os.environ["MATON_API_KEY"]}'},
params={'start_date': '2026-02-01'}
)
data = response.json()
for day in data:
metrics = day['stats'][0]['metrics']
print(f"{day['date']}: {metrics['delivered']} delivered, {metrics['opens']} opens")
所有请求使用JSON内容类型
- 日期格式为YYYY-MM-DD
- 动态模板的模板ID以
- d-
开头 - 邮件发送成功时返回202 Accepted(而非200)
- 营销联系人操作是异步的 - 请使用任务状态端点
- 抑制端点支持通过
start_time和end_time(Unix时间戳)进行日期过滤 - 重要提示:使用curl命令时,如果URL包含方括号,请使用
curl -g以禁用通配符解析 - 重要提示:当通过管道将curl输出传递给
jq或其他命令时,某些shell环境中可能无法正确展开环境变量,例如$MATON_API_KEY错误处理
状态码
| 含义 | 400 |
|---|---|
| 请求错误或验证失败 | 401 |
| Maton API密钥无效或缺失 | 403 |
| 权限不足 | 404 |
| 资源未找到 | Resource not found |
| 429 | 请求频率受限 |
| 500 | 内部服务器错误 |
故障排除:API 密钥问题
- 检查是否已设置
MATON_API_KEY环境变量:
echo $MATON_API_KEY
- 通过列出连接来验证 API 密钥是否有效:
python <<'EOF'
import urllib.request, os, json
req = urllib.request.Request('https://ctrl.maton.ai/connections')
req.add_header('Authorization', f'Bearer {os.environ["MATON_API_KEY"]}')
print(json.dumps(json.load(urllib.request.urlopen(req)), indent=2))
EOF
故障排除:无效的应用名称
- 请确保您的 URL 路径以
sendgrid开头。例如:
- 正确示例:
https://gateway.maton.ai/sendgrid/v3/user/profile - 错误示例:
https://gateway.maton.ai/v3/user/profile
资源
文章底部电脑广告
手机广告位-内容正文底部
上一篇:BrainRepo
下一篇:Reve AI Image Generation


微信扫一扫,打赏作者吧~