Time to do some mailing! We'll need to install the
nodemailer package like so.
install --save nodemailer
This package handles transport for SMTP. We'll only require
nodemailer during this route.
app.jsapp.post("/process", (req, res)=> {
var nodemailer = require("nodemailer");
console.log(req.body);
res.redirect(303, "/thankyou");
});
Once we've assigned the resultant object to the variable
nodemailer, we call the
createTransport() method and assign the result to
transport.
app.jsapp.post("/process", (req, res)=> {
var nodemailer = require("nodemailer");
var transport = nodemailer.createTransport();
console.log(req.body);
res.redirect(303, "/thankyou");
});
When you run
createTransport(), you'll need to pass in a JSON object with the following properties. Inside it,
auth is an object as well with
user and
pass as properties.
app.jsapp.post("/process", (req, res)=> {
var nodemailer = require("nodemailer");
var transport = nodemailer.createTransport({
service: ,
host: ,
secure: ,
port: ,
auth: {
user: ,
pass:
}
});
console.log(req.body);
res.redirect(303, "/thankyou");
});
I'll be using Google's Gmail for this. If you'r also using Gmail, the
service,
host and
port properties are as follows. You need to look up the values for any other service you'd like to use.
secure will be set to
true in most (if not all) cases.
app.jsapp.post("/process", (req, res)=> {
var nodemailer = require("nodemailer");
var transport = nodemailer.createTransport({
service: "Gmail",
host: "smtp.gmail.com",
secure: true,
port: 465,
auth: {
user: ,
pass:
}
});
console.log(req.body);
res.redirect(303, "/thankyou");
});
For
auth, we'll use these values. Remember how we set the secret in the
auth.js file? Well, we'll be doing something similar here.
app.jsapp.post("/process", (req, res)=> {
var nodemailer = require("nodemailer");
var transport = nodemailer.createTransport({
service: "Gmail",
host: "smtp.gmail.com",
secure: true,
port: 465,
auth: {
user: auth.mail.user,
pass: auth.mail.password
}
});
console.log(req.body);
res.redirect(303, "/thankyou");
});
In here, I have the
mail object with user and password as properties.
user is the email address I want to use, and
password is the app password I obtained for this. Here's the procedure you need to follow for a Gmail account. The email service you eventually choose may have its own procedure.
auth.jsmodule.exports = {
secret: "thisisasecret",
mail: {
user: "teochewthunder@gmail.com",
password: "xxxx xxxx xxxx xxxx"
}
}
Now create the
options object. The properties
from and to are email addresses.
from will be the email address you send from, so I use my own email address.
to is the email address specified n the form submitted by the user.
app.jsapp.post("/process", (req, res)=> {
var nodemailer = require("nodemailer");
var transport = nodemailer.createTransport({
service: "Gmail",
host: "smtp.gmail.com",
secure: true,
port: 465,
auth: {
user: auth.mail.user,
pass: auth.mail.password
}
});
var options = {
from: "teochwthunder@gmail.com",
to: req.body.txtEmail,
subject: ,
text:
};
console.log(req.body);
res.redirect(303, "/thankyou");
});
subject can be any text. I'm just going to keep it simple. And
text is the content specified in the form.
app.jsvar options = {
from: "teochwthunder@gmail.com",
to: req.body.txtEmail,
subject: "A Christmas message from your friend has arrived!",
text: req.body.txtMessage
};
After that, we use the
sendMail() method of the
transport object. The first argument is
options, since this tells
nodemailer the particulars of who and what to send. The second is a callback with the parameter
error.
app.jsvar options = {
from: "teochwthunder@gmail.com",
to: req.body.txtEmail,
subject: "A Christmas message from your friend has arrived!",
text: req.body.txtMessage
};
transport.sendMail(options, (error) => {
});
console.log(req.body);
res.redirect(303, "/thankyou");
If
error exists, we handle it the way we've handled code 500 errors. Otherwise, we redirect to the
thankyou route. Which also means we will no longer be needing the code below that, so comment it off.
app.jstransport.sendMail(options, (error) => {
if (error) {
res.render("500", { errorMessage: error.code });
} else {
res.redirect(303, "/thankyou");
}
});
console.log(req.body);
//res.redirect(303, "/thankyou");
Let's try this.
This is the email!
HTML Email
Let's take this a step further. We've already nailed down the process of sending email. Now, we want to render the email in HTML. For this, we create a layout, emailtemplate.handlebars. This has a table-based layout and inline CSS - really retro stuff because that's the safest way in email browsers. Note that the style attributes have been left as blank strings.
views/emailtemplate.handlebars
<table border="0" width="500px" cellpadding="5" cellspacing="0" style="font-size:14px;text-align: center;">
<tr>
<td colspan = "2" style="">
<h1 style="">MERRY CHRISTMAS!</h1>
</td>
</tr>
<tr>
<td style="" width="70%">
<p style=""></p>
</td>
<td style="">
<table cellpadding="5" cellspacing="0">
<tr>
<td style=""></td>
<td style=""></td>
<td style=""></td>
<td style="">★</td>
<td style=""></td>
<td style=""></td>
<td style=""></td>
</tr>
<tr>
<td style=""></td>
<td style=""></td>
<td style=""></td>
<td style="">●</td>
<td style=""></td>
<td style=""></td>
<td style=""></td>
</tr>
<tr>
<td style=""></td>
<td style=""></td>
<td style="">●</td>
<td style="">●</td>
<td style="">●</td>
<td style=""></td>
<td style=""></td>
</tr>
<tr>
<td style=""></td>
<td style="">●</td>
<td style="">●</td>
<td style="">●</td>
<td style="">●</td>
<td style="">●</td>
<td style=""></td>
</tr>
<tr>
<td style="">●</td>
<td style="">●</td>
<td style="">●</td>
<td style="">●</td>
<td style="">●</td>
<td style="">●</td>
<td style="">●</td>
</tr>
<tr>
<td style=""></td>
<td style=""></td>
<td style=""></td>
<td style=""> </td>
<td style=""></td>
<td style=""></td>
<td style=""></td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan = "2" style="">
<p style="">- Teochew Thunder</p>
</td>
</tr>
</table>
Now let's add placeholders for content and variables such as
colors0,
colors1,
colors2,
colors3,
colors4.
views/emailtemplate.handlebars
<table border="0" width="500px" cellpadding="5" cellspacing="0" style="font-size:14px;text-align: center;">
<tr>
<td colspan = "2" style="background-color:{{ colors0 }};">
<h1 style="color:{{ colors4 }};">MERRY CHRISTMAS!</h1>
</td>
</tr>
<tr>
<td style="background-color:{{ colors1 }};" width="70%">
<p style="color:{{ colors4 }};">{{{ message }}}</p>
</td>
<td style="background-color:{{ colors4 }};text-align:center;">
<table cellpadding="5" cellspacing="0">
<tr>
<td style=""></td>
<td style=""></td>
<td style=""></td>
<td style="color:#FFFF00;">★</td>
<td style=""></td>
<td style=""></td>
<td style=""></td>
</tr>
<tr>
<td style=""></td>
<td style=""></td>
<td style=""></td>
<td style="color:{{ colors1 }};font-size:2em;">●</td>
<td style=""></td>
<td style=""></td>
<td style=""></td>
</tr>
<tr>
<td style=""></td>
<td style=""></td>
<td style="color:{{ colors1 }};font-size:2em;">●</td>
<td style="color:{{ colors2 }};font-size:2em;">●</td>
<td style="color:{{ colors1 }};font-size:2em;">●</td>
<td style=""></td>
<td style=""></td>
</tr>
<tr>
<td style=""></td>
<td style="color:{{ colors1 }};font-size:2em;">●</td>
<td style="color:{{ colors2 }};font-size:2em;">●</td>
<td style="color:{{ colors3 }};font-size:2em;">●</td>
<td style="color:{{ colors2 }};font-size:2em;">●</td>
<td style="color:{{ colors1 }};font-size:2em;">●</td>
<td style=""></td>
</tr>
<tr>
<td style="color:{{ colors1 }};font-size:2em;">●</td>
<td style="color:{{ colors2 }};font-size:2em;">●</td>
<td style="color:{{ colors3 }};font-size:2em;">●</td>
<td style="color:{{ colors2 }};font-size:2em;">●</td>
<td style="color:{{ colors3 }};font-size:2em;">●</td>
<td style="color:{{ colors2 }};font-size:2em;">●</td>
<td style="color:{{ colors1 }};font-size:2em;">●</td>
</tr>
<tr>
<td style=""></td>
<td style=""></td>
<td style=""></td>
<td style="background-color:{{ colors0 }};"> </td>
<td style=""></td>
<td style=""></td>
<td style=""></td>
</tr>
</table>
</td>
</tr>
<tr>
<td colspan = "2" style="background-color:{{ colors0 }};text-align: right;">
<p style="color:{{ colors4 }};">- Teochew Thunder</p>
</td>
</tr>
</table>
Back to the
process route, we define
layoutColors as an object with three properties -
red,
green and
blue. Each is an array containing hex values. Basically they are shades of
red,
green and
blue.
app.jsvar transport = nodemailer.createTransport({
service: "Gmail",
host: "smtp.gmail.com",
secure: true,
port: 465,
auth: {
user: auth.mail.user,
pass: auth.mail.password
}
});
var layoutColors = {
red: ["#440000", "#AA0000", "#FF0000", "#FFAAAA", "#FFCCCC"],
green: ["#004400", "#00AA00", "#00FF00", "#AAFFAA", "#CCFFCC"],
blue: ["#000044", "#0000AA", "#0000FF", "#AAAAFF", "#CCCCFF"],
};
var options = {
from: "teochwthunder@gmail.com",
to: req.body.txtEmail,
subject: "A Christmas message from your friend has arrived!",
text: req.body.txtMessage
};
We then use
render() to create the HTML using the template we defined earlier, with an object that we will fill in soon. After rendering, we have a callback, where
html is the HTML rendered. In it, we first check if
error exists, and handle it if so. Otherwise, we go to the code we wrote earlier.
app.jsvar layoutColors = {
red: ["#440000", "#AA0000", "#FF0000", "#FFAAAA", "#FFCCCC"],
green: ["#004400", "#00AA00", "#00FF00", "#AAFFAA", "#CCFFCC"],
blue: ["#000044", "#0000AA", "#0000FF", "#AAAAFF", "#CCCCFF"],
};
res.render("emailtemplate", {}, (error, html) => {
if (error) {
console.log(error);
res.render("500", { errorMessage: error.code });
} else {
var options = {
from: "teochwthunder@gmail.com",
to: req.body.txtEmail,
subject: "A Christmas message from your friend has arrived!",
text: req.body.txtMessage
};
transport.sendMail(options, (error) => {
if (error) {
console.log(error);
res.render("500", { errorMessage: error.code });
} else {
res.redirect(303, "/thankyou");
}
});
}
});
Then we fill in the object that will populate values in the template. Layout is
null, because there is no layout - we're using
emailtemplates.handlebars by itself. We determine
colors0,
colors1,
colors2,
colors3 and
colors4 based on the value of the drop-down list submitted in the form. And
message is the value of
txtMessage, with the line breaks replaced with HTML breaks.
app.jsvar layoutColors = {
red: ["#440000", "#AA0000", "#FF0000", "#FFAAAA", "#FFCCCC"],
green: ["#004400", "#00AA00", "#00FF00", "#AAFFAA", "#CCFFCC"],
blue: ["#000044", "#0000AA", "#0000FF", "#AAAAFF", "#CCCCFF"],
};
res.render("emailtemplate", {
layout: null,
colors0: layoutColors[req.body.ddlLayout][0],
colors1: layoutColors[req.body.ddlLayout][1],
colors2: layoutColors[req.body.ddlLayout][2],
colors3: layoutColors[req.body.ddlLayout][3],
colors4: layoutColors[req.body.ddlLayout][4],
message: req.body.txtMessage.split("\n").join("<br />")
}, (error, html) => {
if (error) {
console.log(error);
res.render("500", { errorMessage: error.code });
} else {
var options = {
from: "teochwthunder@gmail.com",
to: req.body.txtEmail,
subject: "A Christmas message from your friend has arrived!",
text: req.body.txtMessage
};
transport.sendMail(options, (error) => {
if (error) {
console.log(error);
res.render("500", { errorMessage: error.code });
} else {
res.redirect(303, "/thankyou");
}
});
}
});
Except that the mailing code now has HTML instead of text. And we use the html value instead of the text value of
txtMessage.
app.jsvar options = {
from: "teochwthunder@gmail.com",
to: req.body.txtEmail,
subject: "A Christmas message from your friend has arrived!",
html: html
};
Now let's send the form again.
Try the
green layout.
And the
blue.
Merry Christmas!
This wasn't my fanciest work, I'm afraid. Just wanted to feel my way around NodeJS. But we all have to start somewhere!
Try Nodemailer today. Yule love it!
T___T