Mar*_* Dm 5 node.js sendgrid sendgrid-api-v3 sendgrid-templates
我正在将 Sendgrid 的新 API (v3) 与 Node js + 库@sendgrid/mail和@sendgrid/client.
我想要实现的目标:向我的所有联系人发送每周摘要(除了那些从该组取消订阅的人)。我使用通过 Sendgrid 创建的模板(得益于其 template_id)以及动态模板数据,以使用每周数据填充邮件。
问题:
我可以使用/v3/marketing/singlesends使用模板向所有联系人发送营销活动,但无法使用动态模板数据发送它。
我可以使用模板 + 动态模板数据一次发送一封电子邮件,但为此我需要先检索所有联系人,并且只能从此端点/v3/marketing/contacts检索最后 50 个联系人(他们禁用了分页) 。我可能已经能够从这个端点/contactdb/recipients检索它们,问题是我在他们发布新 API 后创建了我的 Sendgrid 帐户,所以我无法访问它。
关于如何执行此操作有任何想法吗?
当前代码:
1) 配置活动
const sgClient = require('@sendgrid/client')
var params={
'name': 'Weekly Digest #'+nb,
'sender_id': sg_sender_id,
'suppression_group_id': sg_unsub_group_id,
'template_id': id_template,
'dynamicTemplateData': template_params,
//also tried with 'dynamic_template_data' instead, not working
'filter': {'send_to_all': true}
}
let url='/v3/marketing/singlesends/' + campaign_id.toString('base64')
const request = {
method: 'PATCH',
url: url,
body: params
}
sgClient.setApiKey(config.sendgrid_key)
sgClient.request(request)
.then(([response, body]) => {
console.log('body:', body)
})
.catch(error => {
console.error('error:', error.toString())
})
Run Code Online (Sandbox Code Playgroud)
2) 发送活动
let url='/v3/marketing/singlesends/' + campaign_id.toString('base64') + '/schedule'
let params={'send_at': 'now'}
const request = {
method: 'PUT',
url: url,
body: params
}
sgClient.setApiKey(config.sendgrid)
sgClient.request(request)
.then(([response, body]) => {
console.log('body:', body)
})
.catch(error => {
console.error('error:', error.toString())
})
Run Code Online (Sandbox Code Playgroud)
我找到了 Mailchimp 问题的解决方案,因此现在这将准确回答该问题。截至 2020 年 9 月,无法通过 SendGrid API 实现此目的,但您可以像我一样执行类似的操作。我的答案基于这里的这篇文章:https ://stackoverflow.com/a/53096852/4163583
我的目标是在编辑器中设计某些部分,以及我想通过 API 用动态内容填充的某些区域。因此,我在不同的位置有几行,我将在其中添加动态代码。
export const sendOutDailyDigest = async () => {
const campaignDetails = {
// Details about your campagin e.g. subject or sender
};
try {
// I'm retrieving here my data from the DB
const data: any = await retrieveDataForDailyDigest();
// This is the data that I want to inject in the template
const dynamicData = {
producthunt: fillProducthuntProductTable(data.producthunt),
betalist: fillBetalistProductTable(data.betalist),
crunchbase: fillCrunchbaseTable(data.crunchbase),
yesterdayDate: `Yesterday's Highlights`,
};
// Sending out the campaign
await sendOutMailchimpCampaign(
campaignDetails,
MAILCHIMP_LIST,
MC_SEGMENT_DAILY_DIGEST,
DAILY_DIGEST_TEMPLATE_ID,
dynamicData
);
} catch (error) {
console.error("Error during sendOutDailyDigest ", error);
}
};Run Code Online (Sandbox Code Playgroud)
export const fillProducthuntProductTable = (products: any) => {
let tablebody = "";
products.forEach((p: any) => {
const productRow = `
<tr>
<td><a href="${p.url}" alt="">${p.title}</a></td>
<td>${p.description}</td>
<td>${p.category}</td>
<td>${p.upvotes}</td>
</tr>
`;
tablebody += productRow;
});
return `
<table style="width:100%">
<tr>
<th>Startup Name</th>
<th>Description</th>
<th>Category</th>
<th>Upvotes</th>
</tr>
${tablebody}
</table>`;
};Run Code Online (Sandbox Code Playgroud)
const sendOutMailchimpCampaign = async (
campaignDetails: any,
mailchimpList: string,
mailchimpSegment: number,
templateId: number,
dynamicData: any
) => {
try {
// Creating a campaign
const campaign: any = await createMailchimpCampaign(
mailchimpList,
mailchimpSegment,
campaignDetails
);
// Updating the campaign with the dynamic data that I fetched from the db
await updateCampaignContent(campaign.id, templateId, dynamicData);
// Sending out the campaign
return new Promise((resolve, reject) => {
mailchimp.campaigns
.send(campaign.id)
.then((_: any) => {
console.log("Successfully sent out daily digest.");
resolve();
})
.catch((error: any) => {
console.log("Error sending out daily digest: ", error);
reject();
});
});
} catch (error) {
console.error("Error during sendOutMailchimpCampaign ", error);
}
};
// Function for creating the above mentioned campaign like this:
export const createMailchimpCampaign = (
mailchimpList: string,
mailchimpSegment: number,
campaignDetails: any
) => {
return new Promise((resolve, reject) => {
mailchimp.campaigns
.create({
type: "regular",
recipients: {
list_id: mailchimpList,
segment_opts: {
saved_segment_id: mailchimpSegment,
},
},
settings: campaignDetails,
})
.then((response: any) => {
resolve(response);
})
.catch((error: any) => {
console.log(error);
reject(error);
});
});
};
// Function for updating the campaign with the dynamic content
const updateCampaignContent = async (
campaignId: number,
templateId: number,
dynamicData: any
) => {
return new Promise((resolve, reject) => {
mailchimp.campaigns
.setContent(campaignId, {
template: {
id: templateId,
sections: dynamicData,
},
})
.then((_: any) => {
resolve();
})
.catch((error: any) => {
console.log(error);
reject(error);
});
});
};Run Code Online (Sandbox Code Playgroud)
就是这样。代码是用 TypeScript 编写的,因此我向这里的所有 Javascript 朋友道歉,但我想你可以翻译它。我希望这可以帮助某人并节省他们一些时间,即使这不是 SendGrid 中的解决方案。
| 归档时间: |
|
| 查看次数: |
1853 次 |
| 最近记录: |