I am trying to make a small dashboard where i can send bulk email using my own SMTP servers. I want to use node for this, can anyone guide from where to start i want to send mails from different SMTP servers.
A most common way to send email in Node is using Nodemailer. It has an excellent documentation.
You can use it to send email using any SMTP servers and there are a lot of preconfigured ways to send using Gmail or other specialized transports.
The available transports are - from the README:
nodemailer-mailgun-transport for sending messages through Mailgun's Web API
nodemailer-mandrill-transport for sending messages through Mandrill's Web API
nodemailer-pickup-transport for storing messages to pickup folders
nodemailer-sailthru-transport for sending messages through Sailthru's Web API
nodemailer-sendgrid-transport for sending messages through SendGrid's Web API
nodemailer-sendmail-transport for piping messages to the sendmail command
nodemailer-ses-transport for sending messages to AWS SES
nodemailer-sparkpost-transport for sending messages through SparkPost's Web API
nodemailer-stub-transport is just for returning messages, most probably for testing purposes
nodemailer-wellknown for sending messages through one of those many supported services
nodemailer-postmark-transport for sending messages through Postmark's Web API
add yours (see transport api documentation here)
Here is a simple usage example in the Nodemailer GitHub repo
var nodemailer = require('nodemailer');
// create reusable transporter object using the default SMTP transport
var transporter = nodemailer.createTransport('smtps://user%40gmail.com:pass#smtp.gmail.com');
// setup e-mail data with unicode symbols
var mailOptions = {
from: '"Fred Foo 👥" <foo#blurdybloop.com>', // sender address
to: 'bar#blurdybloop.com, baz#blurdybloop.com', // list of receivers
subject: 'Hello ✔', // Subject line
text: 'Hello world 🐴', // plaintext body
html: '<b>Hello world 🐴</b>' // 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);
});
See:
https://nodemailer.com/
https://github.com/nodemailer/nodemailer
For bulk mailing it's much better to use a service like Mailgun or Mandrill because doing bulk mailing yourself using SMTP it's a lot of hassle to make sure that your emails are going through spam filters and that you are not blacklisted for sending too much email, that you don't exceed any limits of your ISP etc. Sending emails is more complicated than people usually think and with prices like $0.0001 per email in Mailgun it's also dirt cheap.
Related
I am trying to create a local SMTP server. I configured everything according to this: Link to set-up hmailserver
After that, I ran my diagnostics thing and it said host(in my case, noreply#bufferoverflow.com) cannot be resolved. I googled and read the documentation and question section of hmailserver Docs and found that I am missing a DNS configuration on my machine.
I followed this article to set-up the DNS ip to name: How to add ip domain mapping in windows
127.0.0.1 bufferoverflow.com
on my
C:\Windows\System32\drivers\etc>notepad hosts.ics
It still said host cannot be resolved to a type. I tried to see if the port was actually open and listening. So I did this command in CMD:
netstat -a
It's listening. I doubled checked everything but coudn't found where I was going wrong. I created a simple nodejs server and hosted it on port 80 at localhost and typed "bufferoverflow.com" in my browser it opened 127.0.0.1 aka localhost which is because it has an ip domain mapping I have given.
Now I am lost as why the hostname can't be resolved. My DNS is cool. Everthing is configured as docs says and the port is also open and listening. Please help me.
So based on what you said you created your own SMTP server which is nice and all to learn, but I would recommend using SendinBlue 3rd party service FREE and gives you 300 mails/day
Getting Started with sendinblue:
Link: https://www.sendinblue.com/
Go make and an account free of charge till you decide to pay you'll read there
Once your account is all set, and activated often SMTP service for ones account is not automatically activate so you'd have to email them and they literally respond within 24hr I LOVE THE SERVICE(I am not promoting nor sponsored to hype them or anything just saying the truth of what I have experienced).
So now at this point your account and SMTP service is activated, now question is how do you use sendinBlue?
In your dashboard on your Top right you will see your username
Click on that and a dropdown menu should appear
Then you want to go to SMTP & API
Once you then you will see a menu with API Keys on the left and SMTP on the right
You want to click on the SMTP.
Once you the you will see Login that would be the email you registered with and you will see Master password now that is what you use to authenticate yourself.
Implementation: Now you have everything sorted you know where you keys are and login
In .env file
sendinBlue__login=<Your email that your saw in that smtp tab>
sendinBlue__key= <Key you saw in that smtp tab>
In your file where you want to send email
const nodemailer = require('nodemailer');
router.post('/api/email', (request, response)=>{
const transporter = nodemailer.createTransport({
service:'SendinBlue',
auth:{
user:process.env.sendinBlue__login,
pass:process.env.sendinBlue__key
}
})
const mailOptions = {
from:process.env.sendinBlue__login
to:'example#gmail.com',
subject:'Order confirmation',
html:`
<h1>Confirmation of your received order</h1>
`
}
transporter.sendMail(mailOptions, (error, info)=>{
if (error){
console.log(error);
return response.status(500).json({msg:"Email failed to send probably network problems or SMTP not activated"});
}
return reponse.status(200).json({msg:'Email sent'});
})
})
Now this is how easy sendinBlue works just simple signup and account activation also SMTP activation if not activated from get go by email customer support
If that guide above did not make sense to you: Shameless plug
You can go checkout my video that I did and I was using sendinBlue with nodemailer for emailing it's a bit at the end
Link: https://youtu.be/5vWXbGIdDQw
Now If you want to send an email using noreply#domain.com with sendinBlue you do not even have to have the email activated but still can send
How you go about this is the way you craft your mailOptions
router.get("/api/test", (request, response) => {
const transpoter = nodemailer.createTransport({
service: "SendinBlue",
auth: {
user: process.env.sendinBlue__email,
pass: process.env.sendinBlue__key,
},
});
const mailOptions = {
from: "noreply#Test.com",
to: "juniorWebProjects#gmail.com",
subject: "Confirmation Order",
html: `
<h1>Order Received</h1>
`,
};
transpoter.sendMail(mailOptions, (err, info) => {
if (err) {
return console.log(err);
}
return console.log("Message sent");
});
});
See on my mailOptions I explicitly wrote myself the email that I want and when sendinBlue sends that email the receiver will see that is coming from noreply#Test.com
I have followed the following steps from https://www.twilio.com/docs/sms/whatsapp/quickstart/node which works great with my the number I have registered with custom messages.
Now I changed the number with another WhatsApp number I had but it's not sending messages to that. How do I send without registering?
Please note that I have a trial account.
// This works
const whatsappMessage = await textTransport.messages
.create({
from: 'whatsapp:+14155238886',
body: 'Hello there!',
to: 'whatsapp:+91888888888' // registered number to twilin
});
// This doesnt work
const whatsappMessage = await textTransport.messages
.create({
from: 'whatsapp:+14155238886',
body: 'Hello there!',
to: 'whatsapp:+91999999999' // not registered
});
Twilio developer evangelist here.
The Twilio API for WhatsApp allows you to test using our sandbox. However, to send messages to your users without the sandbox restrictions you need to request your own WhatsApp enabled number.
To receive message to new number must send join [KEY-WORD] from the new number to the WhatsApp number, as you do with the first number
I am sending messages from my domain account but they are not showing in user(from options of nodemailer) sent box.But when sending messages from gmail service messages are showing in sent box of user.Am I missing something in below code?
var transport = nodemailer.createTransport({
host: "xxxx.domain.com",
auth: {
user: 'xyx',
pass: '123'
}
});
transport.sendMail(options, function (err, info) {
if (err) {
console.log(err)
}
console.log(info);
});
When you send a mail using a regular mail client, such as Thunderbird, it will send the mail to your SMTP server, which then relays the message to the receiving mail server (also via SMTP). The copy in your sent folder, however, is additionally saved on your mail server via IMAP. So your mail is actually send twice, once to the receivers mail server, and a copy is "send" to your own mail server.
When using nodemailer you only provide the credentials for your SMTP server, so the mail is only send without storing a copy in your sent directory. So this is basically working as intended.
I can think of two ways to save a copy of the mail in the sent directory:
Use an additional library, such as node-imap to imitate the behavior of a regular mail client and manually save a copy of the mail (e.g., node-imap has an append method to save new mails).
Add your own mail address as BCC to all outgoing mails and use some type of server side filtering to automatically move them to the sent folder. This is computationally less expensive for your application, but has the additional filtering requirement for the mail server.
all. In my nodejs-sails app i'm need to send very big amount of email notifications (>1kk in month) fast. What most efficient and cheap way of doing this? I'm not know very good how all this mailing stuff work, so please show me the way for further googling.
Do i'm need to rent smtp server, use software like Haraka or anything else? Or maybe i need to use Amazon SES?
Thank for your answers.
Yes the most efficient way is going to be a third party email service.
As Jeff Atwood (co-founder of SO) puts it "Email sucks;"
http://blog.codinghorror.com/so-youd-like-to-send-some-email-through-code/
As an example, I use Mandrill's SMTP service over Nodemailer:
var nodemailer = require('nodemailer');
var transporter = nodemailer.createTransport({
service: 'Mandrill',
auth: {
user: process.env.MANDRILL_USER,
pass: process.env.MANDRILL_API_KEY
}
});
transporter.sendMail({
from: 'sender#address',
to: 'receiver#address',
subject: 'hello',
text: 'hello world!'
});
Nodemailer supports all sorts of transports and services out of the box. Docs here: https://github.com/andris9/Nodemailer
I tried to use nodemailer to send emails using my gmail account.
However, Google rejects my login as suspicious and thinks I am a hacker.
I tried Yahoo which does send the email.
My questions are:
1) How can I configure nodemailer to send emails thru gmail
2) Standard/Reliable email library in node.js community with good support that can be used in production.
I was recently playing around with this as well, and the error I received from Google was simply stating that I needed to create an application specific password. Try following the instructions here.
As for your second question, I do not know of any reasons as to why nodemailer can't be used in production.
I used emailjs, and haven't had that issue. Not sure if that's because it's email.js or because it's Google Apps vs Gmail, or maybe Google is just less suspicious with this app for some reason. Maybe useful to try to triangulate:
$> npm install emailjs
emailjs = require('emailjs');
...
var server = emailjs.server.connect({
user:"myname#mygoogleapp.com",
password:"Secret#!1",
host:"smtp.gmail.com",
ssl:true
});
server.send({
text: message
from:"Display name <return#mydomain.com>",
to:email,
subject:"Subject"
},
function (err, message) { ... }