/** * @fileoverview 使用 API 批量管理 Mailgun 发件域 * @author Mark * @version 1.0.0 * @date 创建日期 (2024-05-24) * @lastModified 最后修改日期 (2024-05-24) */ const username = '%USERNAME%' const password = '%PASSWORD%' function getAuth() { return `Basic ${ btoa(`${ username }:${ password }`) }` } function getDomainPath(url, domain) { return url.replace('{domain}', domain) } function request(method, path, formData) { let headers = new Headers(); headers.append('Authorization', getAuth()) return fetch(`https://api.mailgun.net/${ path }`, { method: method, headers, body: formData, }).then(r => r.json()) .then(data => { console.log(data) return data }) } async function updateDomainTracking(domain, trackingType, activeValue) { const formData = new FormData() formData.append('active', activeValue) await request('PUT', getDomainPath(`v3/domains/{domain}/tracking/${ trackingType }`, domain), formData) } async function createWebhooks(domain, id, ...urls) { const form = new FormData() form.append('id', id) urls.forEach(url => form.append('url', url)) const data = await request('POST', getDomainPath('v3/domains/{domain}/webhooks', domain), form) console.log(data) } function initiateX509Certificate(domain) { return request('POST', getDomainPath(`v2/x509/{domain}`, domain)) } function getX509CertificateStatus(domain) { return request('GET', getDomainPath(`v2/x509/{domain}/status`, domain)) } function updateDomain(domain, data) { var form = new FormData(); for (var key in data) { form.append(key, data[key]); } return request('PUT', getDomainPath(`v4/domains/{domain}`, domain), form) } async function getDomains() { const data = await request('GET', 'v4/domains') } async function getDomainDetails(domain) { return await request('GET', getDomainPath('v4/domains/{domain}', domain)) } async function activeHttpsTracking(webPrefix, domain) { const x509Domain = `${webPrefix}.${domain}` initiateX509Certificate(x509Domain) await delay(2000) getX509CertificateStatus(x509Domain) updateDomain(domain, {web_scheme: 'https'}) } function delay(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } //////////////////////////////////// //////////////////////////////////// //////////////////////////////////// ////// 以下是执行批量管理发送域的示例 ////// const mailgunWebhookUrl = [ 'https://test.parcelpanel.com/mailgun/openAndClick', 'https://prod.parcelpanel.com/mailgun/openAndClick', ] const domainList = [ 'x1.parcelpanel.net', 'x2.parcelpanel.com', ] domainList.forEach(async domain => { await updateDomain(domain, {web_scheme: 'https'}) }) domainList.forEach(async domain => { // 开启 https tracking const {web_prefix, web_scheme} = (await getDomainDetails(domain)).domain if (web_scheme !== 'https') { await activeHttpsTracking(web_prefix, domain) } await updateDomainTracking(domain, 'open', 'true') await updateDomainTracking(domain, 'click', 'true') await createWebhooks(domain, 'clicked', ...mailgunWebhookUrl) await createWebhooks(domain, 'opened', ...mailgunWebhookUrl) })