在某些情况下,开发人员可能希望直接从服务器上向应用程序的用户发送电子邮件,如欢迎信息或帐户设置链接。Nodemailer是一个零依赖性的Node.js模块,它通过抽象出将应用程序连接到电子邮件服务时出现的一些复杂情况,使从服务器发送电子邮件变得容易。
在本教程中,我们将介绍如何为Nodemailer配置一个电子邮件地址,从应用程序内部发送电子邮件,在电子邮件中附加文件,为抄送和密送添加字段,最后,为电子邮件模板添加CSS和HTML样式。
要跟上这篇文章,你将需要。
- 在你的机器上全面安装Node.js v6.0.0或更新的版本
- 在你的机器上全局安装npm
- Node.js和JavaScript的基本知识
如果你想继续学习,你可以在我的GitHub repo中查看这个演示的代码。让我们开始吧!
为Nodemailer配置一个电子邮件地址
如果你还没有一个你想用来跟随的电子邮件地址,那就先设置一个新的。你可以使用任何电子邮件服务,然而,如果你使用的是Gmail帐户,有一些重要的步骤你需要遵循,以配置你的帐户。
Gmail配置
默认情况下,Gmail防止机器人访问谷歌服务器上托管的电子邮件。Gmail会进行多项检查,以确保每个电子邮件账户是由公认的用户在公认的地点访问。
如果你的Gmail账户设置了2FA,你可能无法跟上。你需要禁用2FA,或者创建一个禁用2FA的新账户。
在下图的屏幕上,通过切换按钮ON ,允许不太安全的应用程序访问你的Gmail账户。
设置Node.js服务器
现在我们的电子邮件账户已经正确设置,让我们开始编写我们的代码。
首先,创建一个新的目录。我把我的目录称为fassstmail 。
mkdir fassstmail
cd fassstmail
在fassstmail 目录中,创建一个新的Node.js项目。
npm init -y
接下来,我们将安装Express Handlebars,这是一个模板引擎,允许我们创建HTML电子邮件模板。
npm i nodemailer-express-handlebars nodemailer
创建一个电子邮件模板
现在我们已经安装了所需的依赖项,让我们来设置一个模板来发送电子邮件。
在你项目的根目录下,创建一个名为views 的文件夹。在里面,创建一个叫email.handlebars 的文件,它将保存我们的电子邮件的HTML代码和样式。
Handlebars是一种模板语言,所以我们可以在我们的HTML中添加变量,然后用变量代替我们在最终的电子邮件中想要的值。在Handlebars中,变量的结构是用两个开头和结尾的括号围绕着变量文本,如{{variable}} 。
在email.handlebars 文件中,让我们为一个简单的欢迎邮件创建一个HTML模板。
// email.handlebars
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<title>Welcome Email</title>
</head>
<body>
<h2>Hello {{name}}! </h2>
<p>We're glad to have you on board at {{company}}. </p>
</body>
</html>
在上面的HTML模板中,我们有两个变量,{{name}} 和{{company}} 。稍后,我们将学习如何用实际值替换这个模板中的变量。
在Nodemailer中发送电子邮件
现在我们已经建立了我们的电子邮件模板,让我们来创建一个条目文件。在你的fassstmail 项目的根部创建一个名为server.js 的文件。在server.js ,添加以下代码,这将触发发送电子邮件。
const hbs = require('nodemailer-express-handlebars')
const nodemailer = require('nodemailer')
const path = require('path')
// initialize nodemailer
var transporter = nodemailer.createTransport(
{
service: 'gmail',
auth:{
user: 'adebola.rb.js@gmail.com',
pass: 'password_for_your_email_address'
}
}
);
// point to the template folder
const handlebarOptions = {
viewEngine: {
partialsDir: path.resolve('./views/'),
defaultLayout: false,
},
viewPath: path.resolve('./views/'),
};
// use a template file with nodemailer
transporter.use('compile', hbs(handlebarOptions))
var mailOptions = {
from: '"Adebola" <adebola.rb.js@gmail.com>', // sender address
to: 'adebola.rb.js@gmail.com', // list of receivers
subject: 'Welcome!',
template: 'email', // the name of the template file i.e email.handlebars
context:{
name: "Adebola", // replace {{name}} with Adebola
company: 'My Company' // replace {{company}} with My Company
}
};
// trigger the sending of the E-mail
transporter.sendMail(mailOptions, function(error, info){
if(error){
return console.log(error);
}
console.log('Message sent: ' + info.response);
});
在mailOptions 对象中,template 指的是我们要用Nodemailer的模板文件。在我们的例子中,我们希望使用email.handlebars 文件。context 对象持有我们想要使用的实际值,以代替我们Handlebar模板文件中的变量。
我将用Adebola 替换变量{{name}} ,用My Company 替换变量{{company}} 。
最后,为了触发发送电子邮件,调用transporter.sendMail 函数并将其传递给mailOptions 对象。
为了测试你的代码,在你的终端运行命令node server.js 。你应该得到一个写着 "消息已发送 "的响应。你应该在你的收件箱中看到我们的最终邮件!
这就是了!你已经成功地使用Nodemailer发送了一封邮件。你可以按照上面的步骤来发送其他类型的邮件,你甚至可以使用Nodemailer来通知自己,如果你的服务器出了问题。
现在,让我们学习如何向我们的电子邮件添加附件。
添加附件到你的电子邮件
在你的项目的根目录下,创建一个名为attachments 的文件夹,其中将包含我们想作为附件添加到电子邮件的文件。我将添加一个名为pic-1.jpeg 的图片,将其添加到attachments 文件夹中。
接下来,在mailOptions 对象中添加以下一行。
var mailOptions = {
...,
attachments: [{ filename: "pic-1.jpeg", path: "./attachments/pic-1.jpeg" }],
}
在mailOptions 对象中,attachments 需要一个数组,这意味着你可以将任何类型的文件附加到你要发送的电子邮件中。现在,当我们发送电子邮件时,图像就被附上了。
要在你的电子邮件中附加其他类型的文件,如PDF或文档,只需遵循同样的过程。
在你的电子邮件模板中添加抄送和密送的内容
让我们为抄送和密送添加字段,以便一次将你的邮件转发给多个电子邮件地址。添加以下代码到你的mailOptions 对象。
var mailOptions = {
...,
cc: 'onedebos@gmail.com',
bcc: 'adebola.rb.js@gmail.com'
}
在下面的图片中,你可以看到有一个带有第二个电子邮件地址的抄送字段。
给你的电子邮件模板添加样式
你可以用向HTML文件添加样式的方式向你的电子邮件添加样式。在你的email.handlebars 文件中的<head> 块中,创建一个style 块,在那里你可以添加所有你需要的样式。
<style>
h2 {
color: #c4c4c4;
}
</style>
我给我的邮件添加了一个标题,以浅灰色显示。我将使用这个字段来发送一条个性化的信息,如下图所示。
总结
现在,你已经拥有了所有你需要的工具,可以开始用Nodemailer和Node.js创建和发送电子邮件。
Nodemailer是一个优秀的工具,它可以使你很容易地从一个应用程序中安全地发送电子邮件。在本教程中,我们学习了如何在Nodemailer中制作我们自己的电子邮件模板,添加附件,以及添加自定义样式。你可以在任何时候按照这个过程与你的应用程序的用户沟通。