如何用TypeScript实现通过SendGrid API删除列表全部联系人
使用TypeScript通过SendGrid API删除指定联系人列表的所有联系人
问题原因说明
你遇到的403错误是因为调用的是Legacy Marketing Campaigns相关端点,这类端点已被SendGrid弃用或限制权限,现在需要使用最新的v3 Contacts API来操作联系人列表。
实现步骤与代码
1. 准备工作
- 确保你的SendGrid API密钥拥有
contact_list.read和contact_list.write权限 - 安装HTTP请求库(比如
axios):
npm install axios @types/axios
2. TypeScript实现代码
import axios from 'axios'; const SENDGRID_API_KEY = '你的SendGrid API密钥'; const SENDGRID_BASE_URL = 'https://api.sendgrid.com/v3'; /** * 获取指定联系人列表的所有联系人ID * @param listId 目标联系人列表ID * @returns 所有联系人ID数组 */ async function getAllContactIdsInList(listId: string): Promise<string[]> { let allContactIds: string[] = []; let page = 1; const pageSize = 1000; // SendGrid API单次最大返回1000条 while (true) { try { const response = await axios.get(`${SENDGRID_BASE_URL}/marketing/contacts/lists/${listId}/contacts`, { headers: { Authorization: `Bearer ${SENDGRID_API_KEY}` }, params: { page_size: pageSize, page } }); const contacts = response.data.result || []; const contactIds = contacts.map((contact: { id: string }) => contact.id); allContactIds = [...allContactIds, ...contactIds]; // 检查是否还有下一页 if (contacts.length < pageSize) { break; } page++; } catch (error) { console.error('获取联系人列表失败:', error); throw error; } } return allContactIds; } /** * 批量删除指定ID的联系人 * @param contactIds 要删除的联系人ID数组 */ async function deleteContacts(contactIds: string[]): Promise<void> { if (contactIds.length === 0) { console.log('没有需要删除的联系人'); return; } // SendGrid API单次最多删除1000个联系人,所以分片处理 const chunks = []; for (let i = 0; i < contactIds.length; i += 1000) { chunks.push(contactIds.slice(i, i + 1000)); } try { await Promise.all(chunks.map(async (chunk) => { await axios.delete(`${SENDGRID_BASE_URL}/marketing/contacts`, { headers: { Authorization: `Bearer ${SENDGRID_API_KEY}`, 'Content-Type': 'application/json' }, data: { ids: chunk } }); })); console.log(`成功删除${contactIds.length}个联系人`); } catch (error) { console.error('删除联系人失败:', error); throw error; } } /** * 主函数:删除指定联系人列表的所有联系人 * @param listId 目标联系人列表ID */ async function deleteAllContactsInList(listId: string): Promise<void> { try { const contactIds = await getAllContactIdsInList(listId); await deleteContacts(contactIds); } catch (error) { console.error('删除列表所有联系人失败:', error); } } // 使用示例 // deleteAllContactsInList('你的联系人列表ID');
3. 关键说明
- 分页处理:SendGrid的联系人列表接口单次最多返回1000条数据,所以需要循环分页获取所有联系人ID
- 批量删除限制:删除接口单次最多接受1000个ID,需要将ID数组分片处理
- 权限验证:确保API密钥的权限包含联系人列表的读写权限,否则会出现403错误
内容的提问来源于stack exchange,提问作者Qed Soku
相关产品推荐
相关产品推荐

