Home > Software engineering >  How to make Nodemailer trigger a seperate .js script
How to make Nodemailer trigger a seperate .js script

Time:08-24

So i have the main nodejs server file (myserver.js)

const express = require("express");
const app = express();

const nodemailer = require("nodemailer");
const port = 80; 
const vectorExpress = require("./node_modules/@smidyo/vectorexpress-nodejs/index");
const fs = require("fs");
var cors = require("cors");
app.use(cors());

app.use(express.json())

var randomnum = require('./randomnum.js');
var number = randomnum.number;


app.post('/mail', (req, res)=>{
  console.log(req.body)
  

  let transporter = nodemailer.createTransport({
    service: 'Gmail', 
    auth: {
        user: '',
        pass: ''
    }
});

  
const mailOptions = {
from: req.body.email,
to: '[email protected]', 
subject: `Order from ${req.body.name}`,
text: 
`${req.body.name}  
${req.body.street}
${req.body.postcode} ${req.body.town}
${req.body.country}

Quantity: ${req.body.quantity}
Additional information:
${req.body.message}

Shipping address:
${req.body.name2}  
${req.body.street2}
${req.body.postcode2} ${req.body.town2}
${req.body.country2}
${req.body.phone2}

Email: ${req.body.email}
Phone number: ${req.body.phone}

File number: ${number}

    `,
    attachments: [{   // utf-8 string as an attachment
      path: `${number}.svg`,
      },
      {
      path: `${number}.dxf`,
      },
    ]
  }
  
  transporter.sendMail(mailOptions, (error, info)=>{
    if(error){
      console.log(error);
      res.send('error');
    }else{
      console.log('Email sent:'   info.response);
      res.send('success');
    }
  })
})
 

var bodyParser = require("body-parser");

and a seperate script file (randomnum.js)

function randomnumber() {
  return Math.floor(100000   Math.random() * 900000);
}

var number = randomnumber();
exports.number = number;
console.log(number);

i would like to have it so that everytime nodemailer sends an email the main script would run the randomnum.js so that i would get a new random number generated. been trying for a few days now but i think im in over my head with my limited knowledge.

CodePudding user response:

Put Nodemailer code in separate file and export in main.js file and use with pass your data from main.js file

Hope this code will help to you

const nodemailer = require("nodemailer");
import * as dotenv from "dotenv";
dotenv.config({});

export class SendEmail {
  public static send(data) {
    const transport = nodemailer.createTransport({
      name: process.env.SMTP_HOST,
      host: process.env.SMTP_HOST,
      port: process.env.SMTP_PORT,
      auth: {
        user: process.env.SMTP_USER_NAME,
        pass: process.env.SMTP_PASSWORD,
      },
      pool: true, // use pooled connection
      rateLimit: true, // enable to make sure we are limiting
      maxConnections: 1, // set limit to 1 connection only
      maxMessages: 3, // send 3 emails per second
    });

    var mailOptions = {
      from: process.env.FROM,
      html: data.html,
      replyTo: process.env.REPLY_TO,
      to: data.to,
      subject: data.subject,
      text: data.text,
    };
    transport.sendMail(mailOptions, (error, info) => {
      if (error) {
        return console.log(error);
      }
      console.log("Message sent: %s", info.messageId);
      return;
    });
  }
}

CodePudding user response:

Based on code you provided, I see one obvious issue. In randomnum.js you are calling the function and exporting only the random number. Try to export it this way

function randomnumber() {
  return Math.floor(100000   Math.random() * 900000);
}

exports.number = randomnumber;

Then call it in myserver.js

var randomnum = require('./randomnum.js');
var number = randomnum();

To be fair I would not bother with separate file for such simple task and would assign the random number value in myserver.js instead.

var number = Math.floor(100000   Math.random() * 900000)
  • Related