4

我将 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())
})

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())
})
4

1 回答 1

0

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

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

在此处输入图像描述

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

在此处输入图像描述

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

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

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);
  }
};

  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>`;
};

  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);
      });
  });
};

而已。代码在 TypeScript 中,因此我向这里的所有 Javascript 朋友道歉,但我想你可以翻译它。我希望这可以帮助某人并为他们节省一些时间,即使这不是 SendGrid 中的解决方案。

于 2020-09-28T02:19:29.627 回答