how to send mails using nodemailer after a sucessful purchase in stripe

Issue

i’m trying to send an email after successfully making a payment , but i’m find it hard to add my nodemailer code in stripe,

this is my stripe code


router.post("/pay", verifyToken, (req, res) => {
  let totalPrice = Math.round(req.body.totalPrice * 100);
  stripe.customers
    .create({
      email: req.decoded.email
    })
    .then(customer => {
      return stripe.customers.createSource(customer.id, {
        source: "tok_visa"
      });
    })
    .then(source => {
      return stripe.charges.create({
        amount: totalPrice,
        currency: "usd",
        customer: source.customer
      });
    })
    .then(async charge => {
      console.log("charge>", charge);
      let order = new Order();
      let cart = req.body.cart;

      cart.map(product => {
        order.products.push({
          productID: product._id,
          quantity: parseInt(product.quantity),
          price: product.price
        });
      });

      order.owner = req.decoded._id;
      order.estimatedDelivery = req.body.estimatedDelivery;
      await order.save();

      res.json({
        success: true,
        message: "Successfully made a payment"
      });
    })
    .catch(err => {
      res.status(500).json({
        success: false,
        message: err.message
      });
    });
});

this is my email template

 var emailTemplate = `Hello ${req.decoded.name}, \n
        thank you for your order! \n
        Engraving: ${newCharge.description} \n
        Amount: ${newCharge.amount / 100 } \n
        Your full order details are available at ecart.io/#/order-complete/${
          charge.id
        } \n
        For questions contact [email protected] \n 
        Thank you!`;
        let mailTransporter = nodemailer.createTransport({
          service: "gmail",
          auth: {
            user: "[email protected]",
            pass: "sq"
          }
        });

        let details = {
          from: "[email protected]",
          to: `${req.decoded.email}`,
          subject: "shipping",
          text: emailTemplate
        };
        mailTransporter.sendMail(details, err => {
          if (err) {
            console.log(err);
          } else {
            console.log("email sent");
          }
        });

tried adding it in my .then function but i’m not getting a good response I expected either an error message or the email sent to be logged but that is not happening.

Solution

do these

 .then(source => {
      return stripe.charges.create({
        amount: totalPrice,
        currency: "usd",
        customer: source.customer
      },
function(err, charge) {
          if (err) {
            console.log(err);
          } else {
            var emailTemplate = `Hello ${req.decoded.name}, \n
          thank you for your order! \n
        
          Amount: ${charge.amount / 100} \n
          Your full order details are available at ecart.io/#/order-complete/${
            charge.id
          } \n
          For questions contact [email protected] \n 
          Thank you!`;
            let mailTransporter = nodemailer.createTransport({
              service: "gmail",
              auth: {
                user: "[email protected]",
                pass: "sq"
              }
            });

            let details = {
              from: "[email protected]",
              to: `${req.decoded.email}`,
              subject: "shipping",
              text: emailTemplate
            };
            mailTransporter.sendMail(details, err => {
              if (err) {
                console.log(err);
              } else {
                console.log("email sent");
              }
            });
          }
        },
);
    })

Answered By – Tolu Arejibadey

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0

Leave a Reply

(*) Required, Your email will not be published