我需要向阵列中的所有用户发送电子邮件

时间:2019-05-18 12:03:36

标签: javascript node.js typescript

我正在开发一种向用户发送电子邮件的功能,我已经具有发送邮件功能,并且可以将其发送给单个用户。我正在尝试发送给数组中的多个用户。

我正在用Typescript写作,并且使用mailgun作为我的电子邮件服务提供商

这是一个示例发送邮件功能:

const data = {
  from: 'example@from.com',
  to: 'example@reciever.com',
  subject: 'Sample subject',
  html: await email(), // I am getting the email template here
}
await mailgun.messages().send(data)

使用上面的代码,我正在向单个用户发送电子邮件。下面的json显示了我如何接收电子邮件列表:

[
  {
    "name": "User 1",
    "email": "user1@gmail.com"
  },
  {
    "name": "user 2",
    "email": "user2@gmail.com"
  }
]

我希望能够发送给多个用户,并且我想以一种聪明的方式做到这一点。如果可能的话,请使用代码提出最佳解决方案。

谢谢。

4 个答案:

答案 0 :(得分:1)

我假设您使用的是mailgun-js,您似乎可以使用mailing list这个东西。如果不是,那么我建议,不要简单地遍历用户列表并一次发送一封电子邮件(与await同步),而是触发所有电子邮件异步发送,然后使用Promise.all知道何时发送了所有电子邮件。下面的示例未经测试(因为我从未使用过mailgun),但它应该为您提供实现方法的想法。

const users = [
  {
    "name": "User 1",
    "email": "user1@gmail.com"
  },
  {
    "name": "user 2",
    "email": "user2@gmail.com"
  }
];


const sendEmailToUser = async (user) => {
   const data = {
      from: 'example@from.com',
      to: 'example@reciever.com',
      subject: 'Sample subject',
      html: 'await email()'
   };
   await mailgun.messages().send(data);              
};

(async () => {
    const sendEmailPromises = [];

    for(const user of users) {
        // Start sending all emails
        sendEmailPromises.push(sendEmailToUser(user));
    }

    // Wait for all emails to be sent
    await Promise.all(sendEmailPromises);

    // Do something
})()

答案 1 :(得分:0)

假设send函数为async并返回一个promise:

async function sendMail(){
    const myRecipients = [
      {
        "name": "User 1",
        "email": "user1@gmail.com"
      },
      {
        "name": "user 2",
        "email": "user2@gmail.com"
      }
    ]
    const fromAddress = "my@email.address"
    // map our recipient array to the message format expected by `send`
    const myMessages = myRecipients.map(r => ({
        from: fromAddress,
        to: r.email,
        subject: "somesubject",
        html: "some html"
    }))
    // map our messages to a bunch of "in-flight" promises
    const promises = myMessages.map(m => mailgun.messages().send(m))
    // wait for all the promises to complete
    await Promise.all(promises)
}

答案 2 :(得分:-1)

您仍然必须迭代数据结构。

var users = [
    {
      "name": "User 1",
      "email": "user1@gmail.com"
    },
    {
      "name": "user 2",
      "email": "user2@gmail.com"
    }
  ];

users.forEach(function(user){
    name = user.name;
    email = user.email;

var data = {
    from: 'example@from.com',
    to: email,
    subject: 'Sample subject',
    html: await email(),
}    

await mailgun.messages().send(data);

});

答案 3 :(得分:-2)

使用数组映射

我不知道打字稿。

您可以获得所有类似的元素

对于ES6

select p.product_id, c.category_id, p.name, c.description
from category_product cp join
     product p
     on p.product_id = cp.product_id join
     category c
     on c.category_id = cp.category_id;