wait file to create before send mail - node.js

Im having some problems with a function with nodemailer, i need to create a pdf from body req, then attach it to a mail and send it, the problem here is i dont know how to wait to the file to finish saving before send the mail, and im having errors because the mails goes before the system can create the file or even attach the pdf file...
the idea will be: send post req -> get the req.body -> create pdf -> create mail options (nodemailer) -> send the mail.
but the code now is going like: send post req -> get the req.body -> create pdf -> create mail options (nodemailer) -> send the mail -> system
still making the pdf -> error
my current code is:
app.post('/send', function(req, res) {
if (req.body.email == "" || req.body.subject == "") {
res.send("Error: Email & Subject should not blank");
return false;
}
// Sending Emails with SMTP, Configuring SMTP settings
var smtpTransport = nodemailer.createTransport({
host: "mail.vyg.cl", // hostname
secureConnection: true, // use SSL
port: 465, // port for secure SMTP
auth: {
user: 'crm#vyg.cl',
pass: '******'
}
});
const pdfArchive = './server/' + req.body.subject + '.pdf';
if (fs.existsSync(pdfArchive)) {
fs.unlinkSync(pdfArchive);
}
pdf.create(req.body.description).toFile('./server/' + req.body.subject + '.pdf', function(err, res) {
if (err) {
console.log(err);
} else {
console.log(res)
}
});
const mailOptions = {
from: req.body.from, // sender address
to: req.body.to, // list of receivers
cc: req.body.cc,
subject: req.body.subject, // Subject line
//text: "Hello world ✔", // plaintext body
// html: req.body.description, // html body,
attachments: [{ // file on disk as an attachment
filename: req.body.subject + '.pdf',
path: './server/' + req.body.subject + '.pdf' // stream this file
}]
}
smtpTransport.sendMail(mailOptions, function(error, response) {
if (error) {
res.status(400).json({ message: "Email could not sent due to error: " + error });
} else {
res.status(200).json({ message: "Email has been sent successfully" });
}
});
if (fs.existsSync(pdfArchive)) {
fs.unlinkSync(pdfArchive);
}
});
i tryed to send the mail in the conditional when the pdf was created but i dont get the smtpTransport response....
any help will be appreciated

app.post('/send', async function(req, res) {
if (req.body.email == "" || req.body.subject == "") {
res.send("Error: Email & Subject should not blank");
return false;
}
// Sending Emails with SMTP, Configuring SMTP settings
var smtpTransport = nodemailer.createTransport({
host: "mail.vyg.cl", // hostname
secureConnection: true, // use SSL
port: 465, // port for secure SMTP
auth: {
user: 'crm#vyg.cl',
pass: '*******'
}
});
const mailOptions = {
from: req.body.from, // sender address
to: req.body.to, // list of receivers
cc: req.body.cc,
subject: req.body.subject, // Subject line
//text: "Hello world ✔", // plaintext body
// html: req.body.description, // html body,
attachments: [{ // file on disk as an attachment
filename: req.body.subject + '.pdf',
path: './server/' + req.body.subject + '.pdf' // stream this file
}]
}
const pdfArchive = './server/' + req.body.subject + '.pdf';
if (fs.existsSync(pdfArchive)) {
await fs.unlinkSync(pdfArchive);// Add wait here
}
try{
var result = await pdf.create(req.body.description).toFile('./server/' + req.body.subject + '.pdf') // capture result if you need to
try{
await smtpTransport.sendMail(mailOptions) // wrap this in a try catch if you want to capture email sending specific erorrs else outer try catch will work
res.status(200).json({ message: "Email has been sent successfully" });
}
catch(error)
{
res.status(400).json({ message: "Email could not sent due to error: " + error });
}
}
catch(error)
{
console.log(err);
res.send(error)
}
});

Related

Sending an email to a user after submitting an enquiry

I'm trying to find a way to set up a contact us form, when a user is submitting an enquiry I should receive an email, also the user should receive an email telling that the enquiry reached us, I figured out that I should use nodemailer to send mails, now the first step is done which I receive an email whenever the user submitted an enquiry, the question is how can I send him an email after submitting the enquiry? excuse my bad English
Nodemailer setup
//email from the contact form using the nodemailer
router.post('/send', async(req, res) => {
console.log(req.body);
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.EMAIL_USERNAME, //email resposible for sending message
pass: process.env.EMAIL_PASSWORD
}
});
const mailoptions = {
from: process.env.FROM_EMAIL,
to: process.env.EMAIL_USERNAME, //email that recives the message
subject: 'New Enquiry',
html: `<html><body><p>Name: ${req.body.name}</p><p> Email: ${req.body.email}</p><p>message: ${req.body.content}</p></body></html>`
}
transporter.sendMail(mailoptions, (err, info) => {
if (err) {
console.log('error');
res.send('message not sent'); //when its not ent
} else {
console.log('message sent' + info.response);
res.send('sent'); //when sent
}
})
});
module.exports = router;
So I tried some codes and code worked for me, it's sending to the admin and the client, hope it helps
router.post('/send', async(req, res, next) => {
console.log(req.body);
if (!req.body.name) {
return next(createError(400, "ERROR MESSAGE HERE"));
} else if (!req.body.email) {
return next(createError(400, "ERROR MESSAGE HERE"));
} else if (!req.body.email || !isEmail(req.body.email)) {
return next(createError(400, "ERROR MESSAGE HERE"));
} else if (!req.body.content) {
return next(createError(400, "ERROR MESSAGE HERE"));
}
const transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: process.env.EMAIL_USERNAME, //email resposible for sending message
pass: process.env.EMAIL_PASSWORD
}
});
const mailOptionsAdmin = {
from: process.env.FROM_EMAIL,
to: process.env.EMAIL_USERNAME, //email that recives the message
subject: 'New Enquiry',
html: `<html><body><p>Name: ${req.body.name}</p><p> Email: ${req.body.email}</p><p>message: ${req.body.content}</p></body></html>`
}
const mailOptionsClient = {
from: process.env.FROM_EMAIL,
to: req.body.email, //email that recives the message
subject: 'Recivied',
html: `<html><body><p>message: We recived your enquiry</p></body></html>`
}
transporter.sendMail(mailOptionsAdmin, (err, info) => {
if (err) {
console.log('error');
res.send('message not sent'); //when its not ent
} else {
console.log('message sent' + info.response);
res.send('sent'); //when sent
transporter.sendMail(mailOptionsClient)
}
})
});

Node.js + Express

I was creating a contact form using nodemailer. I implemented it and it was working fine, but some time later I came back to do a final test in postman it started to give me the following error"message": Not Found - /contact and "stack": "Error: Not Found - /contact\n . I am not sure what's causing the error.
this is code:
const transport = {
host: 'smtp.gmail.com', // Don’t forget to replace with the SMTP host of your provider
port: 587,
secure: false, // use SSL
auth: {
user: process.env.GMAIL,
pass: process.env.PASSWORD
}
}
const transporter = nodemailer.createTransport(transport)
transporter.verify((error, success) => {
if (error) {
console.log(error);
} else {
console.log('Server is ready to take messages');
}
});
app.post('/contact', (req, res, next) => {
const name = req.body.name
const email = req.body.email
const message = req.body.message
const content = ` name: ${name} \n email: ${email} \n message: ${message} `
const mail = {
from: name,
// to: 'RECEIVING_EMAIL_ADDRESS_GOES_HERE', // Change to email address that you want to receive messages on
to: 'xxx#gmail.com', // Change to email address that you want to receive messages on
subject: 'New Message from Contact Form',
text: content
}
transporter.sendMail(mail, (err, data) => {
if (err) {
res.json({
status: 'fail'
})
} else {
res.json({
status: 'success'
})
}
})
})

Nodemailer not sending the mail to the address i specify

I'm trying to send a mail to an email address with nodemailer + mailtrap, but i'm receving the mail in the mailtrap account... why is this happening?
here's my code:
const transport = nodemailer.createTransport({
host: "smtp.mailtrap.io",
port: 2525,
auth: {
user: "79a422a4c8485b",
pass: "492900f98e999e",
},
});
app.get("/sendMail", function (req, res) {
const rand = Math.floor(Math.random() * 100 + 54);
const link = `http://localhost:5000/verify?id=${rand}`;
const mailOptions = {
from: "sender#server.com",
to: req.query.to, // DESTINY MAIL, BUT NO MATTER WHAT I PUT IN HERE, I ONLY RECEIVE THE MAIL
// ON THE MAILTRAP ACCOUNT!
subject: "Hello ✔",
text: "Hello world ✔",
html: `Hello,<br> Please Click on the link to verify your email.<br><a href=${link}>Click here to verify</a>`,
};
console.log(mailOptions);
// smtpTransport.sendMail();
transport.sendMail(mailOptions, function (error: any, response: any) {
if (error) {
console.log("no se pudo mandar el mail porque ->", error);
res.end("error");
} else {
console.log("response", response);
console.log(`Message sent: ${response.message}`);
res.send("done");
}
});
});
What am i doing wrong?

{"msg":"invalid_request"} getting Error when i am Using nodemailer in Nodejs to send mail from Gmail

When I am trying to send mail from Gmail. I am getting "{"msg":"invalid_request"}" error in response.
Below is the code.
var transporter = nodemailer.createTransport(
smtpTransport({
service: 'Gmail',
auth: {
xoauth2: xoauth2.createXOAuth2Generator({
user: 'pathareshekhar29#gmail.com',
pass: 'XYZ'
})
}
})
);
var mailOptions = {
from: 'pathareshekhar29#gmail.com',
to: user.empEmail,
subject: 'User Account Approval',
text: 'Demo Mail'
};
transporter.sendMail(mailOptions, function (err) {
console.log('ygcasyhgbavsdbahvbdb '+ err);
if (err) {
return res.status(500).send({ msg: err.message });
} else {
res.status(200).send('A verification email has been sent to ' + user.empEmail + '.');
}
});
Could anyone please help me to fix this error.

send email via nodemailer

I try to send email via nodemailer but getting error - TypeError: Cannot read property 'method' of undefined. It looks like sendMail function is not defined. Any advise please?
P.S. This code for chatbot hosted on AWS
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
module.exports = function someName() {
// create reusable transporter object using the default SMTP transport
var transporter = nodemailer.createTransport(smtpTransport({
service: 'gmail',
auth: {
user: '7384093#gmail.com',
pass: '*******'
}
}))
// setup e-mail data with unicode symbols
var mailOptions = {
from: '"nerd studio" <7384093#gmail.com>', // sender address
to: '7384093#gmail.com', // list of receivers
subject: 'Подтверждение запроса \\ разработак чат-ботов \\ nerd studio', // Subject line
text: 'Добрый день! Вы оставили нашему Валере запрос и мы с радостью подтверждаем его получение. В ближайшее время с вами свяжется наш менелдер', // plaintext body
html: '<b>Добрый день! Вы оставили нашему Валере запрос и мы с радостью подтверждаем его получение. В ближайшее время с вами свяжется наш менелдер</b>' // html body
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
console.log(mailOptions);
console.log(info);
if(error){
return console.log(error);
}
console.log('Message sent: ' + info.response);
});
}
You don't need to install npm nodemailer-smtp-transport, only nodemailer is enough to send email to gmail. But first, go to the https://myaccount.google.com/security google account and scroll down and check Allow less secure apps: ON and keep ON. you will send your gmail email. Here, is the full code -
var nodemailer = require('nodemailer');
app.post('/contactform', function (req, res) {
var mailOpts, smtpTrans;
//Setup Nodemailer transport, I chose gmail. Create an application-specific password to avoid problems.
smtpTrans = nodemailer.createTransport(smtpTransport({
service: 'gmail',
// host:'smtp.gmail.com',
// port:465,
// secure:true,
auth: {
user: "xxxxxx#gmail.com",
pass: "xxxxxx"
}
}));
var mailoutput = "<html>\n\
<body>\n\
<table>\n\
<tr>\n\
<td>Name: </td>" + req.body.form_name + "<td></td>\n\
</tr>\n\
<tr>\n\
<td>Email: </td><td>" + req.body.form_email + "</td>\n\
</tr>\n\
<tr>\n\
<td>MN: </td>" + req.body.form_phone + "<td></td>\n\
</tr>\n\
<tr>\n\
<td>Messge: </td>" + req.body.form_message + "<td></td>\n\
</tr>\n\
</table></body></html>";
//Mail options
mailOpts = {
to: "Your_App_Name <xxxxxxxx#gmail.com>",
subject: req.body.form_subject,
html: mailoutput
};
smtpTrans.sendMail(mailOpts, function (error, res) {
if (error) {
// res.send("Email could not send due to error" +error);
return console.log(error);
}
});
console.log('Message sent successfully!');
res.render('contact.ejs');
});
//console.log(query.sql);
});
I have nodemailer currently working this way: Create a file config/mail.js:
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
host: 'yourHost',
port: 2525, //example
auth: {
user: 'yourUser',
pass: 'yourPass'
}
});
module.exports = function(params) {
this.from = 'yourEmail';
this.send = function(){
var options = {
from : this.from,
to : params.to,
subject : params.subject,
text : params.message
};
transporter.sendMail(options, function(err, suc){
err ? params.errorCallback(err) : params.successCallback(suc);
});
}
}
And then, anytime I want to send an email:
var Mail = require(path.join(__dirname, '..', '..', 'config', 'mail.js'));
var options = {
to: 'example#example.com',
subject: 'subject',
message: 'your message goes here'
}
var mail = new Mail({
to: options.to,
subject: options.subject,
message: options.message,
successCallback: function(suc) {
console.log('success');
},
errorCallback: function(err) {
console.log('error: ' + err);
}
});
mail.send();
Try this code.First you have to create an app in Google Cloud Console and Enable Gmail API from library.Get the credentials of your app.For that click on Credentials and in the place of Authorized redirect URIskeep this link https://developers.google.com/oauthplayground and save it.Next in another tab open this link https://developers.google.com/oauthplayground/ click on settings symbol on right side.And make a tick on check box(i.e,Use your own OAuth credentials) after this You have to give your clientId and clientSecret.And at the sametime on left side there is a text box with placeholder like Input Your Own Scopes there keep this link https://mail.google.com/
and click on Authorize APIs then click on Exchange authorization code for tokens then you will get your refreshToken and accessToken keep these two in your code.Hope this hepls for you.
const nodemailer=require('nodemailer');
const xoauth2=require('xoauth2');
var transporter=nodemailer.createTransport({
service:'gmail',
auth:{
type: 'OAuth2',
user:'Your_Email',
clientId:'Your_clientId',//get this from Google Cloud Console
clientSecret:'Your_clientSecret',
refreshToken:'Your_refreshToken',//get this from https://developers.google.com/oauthplayground/
accessToken:'Your_accessToken'
},
});
var mailOptions={
from:'<Your_email>',
to:'Your firends mail',
subject:'Sample mail',
text:'Hello !!!!!!!!!!!!!'
}
transporter.sendMail(mailOptions,function(err,res){
if(err){
console.log('Error');
}
else{
console.log('Email Sent');
}
})
I find solution for ,
How to send email from="userEmail" to="myEmail"?
THIS IS TRICK
var nodemailer = require('nodemailer'); router.post('/contacts-variant-2', (req, res, next) => { var name=req.body.name; var email=req.body.email; var message=req.body.message; const output=`
<h3>Contact Details</h3>
<ul>
<li>Name is : ${req.body.name}</li>
<li>Email is : ${req.body.email}</li>
</ul>
<h3>Message</h3>
<p>${req.body.message}</p>
`; var transporter = nodemailer.createTransport({ service: 'yahoo', auth: { user: 'create_new_email#yahoo.com', pass: 'password' } }); var mailOptions = { from:'create_new_email#yahoo.com', to:'myFriend#gmail.com', subject: name, text: 'Your have a new
contact request', html:output }; transporter.sendMail(mailOptions, function(error, info){ if (error) { console.log("errors is somthing "+error); res.send(404); } else { console.log('Email sent: ' + info.response); res.send(200); } }); });
Using Gmail
var nodemailer = require('nodemailer');
// Create the transporter with the required configuration for Gmail
// change the user and pass !
var transporter = nodemailer.createTransport({
host: 'smtp.gmail.com',
port: 465,
secure: true, // use SSL
auth: {
user: 'myemail#gmail.com',
pass: 'myPassword'
}
});
// setup e-mail data
var mailOptions = {
from: '"Our Code World " <myemail#gmail.com>', // sender address (who sends)
to: 'mymail#mail.com, mymail2#mail.com', // list of receivers (who receives)
subject: 'Hello', // Subject line
text: 'Hello world ', // plaintext body
html: '<b>Hello world </b><br> This is the first email sent with Nodemailer in Node.js' // html body
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
if(error){
return console.log(error);
}
console.log('Message sent: ' + info.response);
});
Using Hotmail
var nodemailer = require('nodemailer');
// Create the transporter with the required configuration for Outlook
// change the user and pass !
var transporter = nodemailer.createTransport({
host: "smtp-mail.outlook.com", // hostname
secureConnection: false, // TLS requires secureConnection to be false
port: 587, // port for secure SMTP
tls: {
ciphers:'SSLv3'
},
auth: {
user: 'mymail#outlook.com',
pass: 'myPassword'
}
});
// setup e-mail data, even with unicode symbols
var mailOptions = {
from: '"Our Code World " <mymail#outlook.com>', // sender address (who sends)
to: 'mymail#mail.com, mymail2#mail.com', // list of receivers (who receives)
subject: 'Hello ', // Subject line
text: 'Hello world ', // plaintext body
html: '<b>Hello world </b><br> This is the first email sent with Nodemailer in Node.js' // html body
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
if(error){
return console.log(error);
}
console.log('Message sent: ' + info.response);
});
Alternatively, if your account is hotmail instead of outlook, you can use the buil-in hotmail service using the following transport:
var transport = nodemailer.createTransport("SMTP", {
service: "hotmail",
auth: {
user: "user#hotmail.com",
pass: "password"
}
});
Using Zoho
var nodemailer = require('nodemailer');
// Create the transporter with the required configuration for Gmail
// change the user and pass !
var transporter = nodemailer.createTransport({
host: 'smtp.zoho.com',
port: 465,
secure: true, // use SSL
auth: {
user: 'myzoho#zoho.com',
pass: 'myPassword'
}
});
// setup e-mail data, even with unicode symbols
var mailOptions = {
from: '"Our Code World " <myzoho#zoho.com>', // sender address (who sends)
to: 'mymail#mail.com, mymail2#mail.com', // list of receivers (who receives)
subject: 'Hello ', // Subject line
text: 'Hello world ', // plaintext body
html: '<b>Hello world </b><br> This is the first email sent with Nodemailer in Node.js' // html body
};
// send mail with defined transport object
transporter.sendMail(mailOptions, function(error, info){
if(error){
return console.log(error);
}
console.log('Message sent: ' + info.response);
});

Resources