Sendgrid API v3 发送带有模板和动态模板数据的营销活动

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)

Mat*_*k90 0

我找到了 Mailchimp 问题的解决方案,因此现在这将准确回答该问题。截至 2020 年 9 月,无法通过 SendGrid API 实现此目的,但您可以像我一样执行类似的操作。我的答案基于这里的这篇文章:https ://stackoverflow.com/a/53096852/4163583

  1. 注册并创建 Mailchimp 帐户
  2. 创建一个应该接收您的电子邮件的受众(他们稍后会在其 API 文档中调用此列表仅供参考)
  3. 转到营销活动 -> 电子邮件模板并使用“粘贴代码”创建一个新模板

在此输入图像描述

  1. 在模板编辑器中,您现在可以在此处添加一些使用 Mailchimp 自己的语言的部分。比较我的屏幕截图,但他们在这里有一个指南,进一步解释了这一点。

在此输入图像描述

我的目标是在编辑器中设计某些部分,以及我想通过 API 用动态内容填充的某些区域。因此,我在不同的位置有几行,我将在其中添加动态代码。

  1. 现在我们可以实际编写代码了。我所做的基本上如下:首先从数据库加载数据,然后将其引入正确的形式并创建 HTML 代码,我将在正确的位置将其注入 Mailchimp 模板中,然后使用动态创建和更新活动内容并发送出去。我们走吧:

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)

  1. 为了创建稍后注入的 HTML,我有一个像这样的函数:

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)

  1. 让我们看看我在做什么sendOutMailchimpCampaign。重要的调用是创建活动更新活动内容发送活动

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 中的解决方案。