如何使用 Node.js 发送电子邮件:Email API或 Nodemailer (SMTP)(通过)
Node.js 是一个功能强大的 JavaScript 运行环境,以其无阻塞、事件驱动的架构和出色的异步操作能力(包括电子邮件处理)而著称。
它能够同时处理多个电子邮件请求而不影响性能,这使得 Node.js 成为将事务性电子邮件传送集成到 Web 应用程序中的理想选择。此解决方案易于扩展,即使面对大量电子邮件流量也能应对自如。
在本文中,您将学习如何在 Node.js 后端使用电子邮件 API 和 SMTP(简单邮件传输协议)来发送电子邮件。我们将提供代码示例,并探讨这两种方法的优缺点。此外,我们还将分享一些最佳实践,以确保您的 Node.js 实施既可靠又安全。
您应该使用哪个:API 还是 Nodemailer (SMTP)?
选择Email API还是将 Nodemailer 与 SMTP 服务器一起使用,很大程度上取决于您的设置所需的特性和功能,以及您的技术能力。
如果您希望利用电子邮件模板、分析功能、抑制管理、入站路由等高级特性,那么Email API 无疑是更好的选择。而如果您更愿意自行配置和管理 SMTP 服务器(并且您有时间这样做),或者您需要一个更简洁的电子邮件发送解决方案,那么 Nodemailer 可能是您的最佳选择。
以下是对两者进行比较的快速概述。
特征 | Email API | Nodemailer |
易用性 | 易于实施,但需要技术知识 | 易于实施,但需要一些技术知识。如果使用自己的 SMTP 服务器,则需要相当多的配置。 |
可靠性 | 非常好的第三方服务可确保高送达率并处理重试 | 如果使用第三方服务,则非常好,如果使用自己的 SMTP 服务器设置,则可能难以管理 |
可扩展性 | 旨在无缝处理大量电子邮件 | 各不相同,如果使用第三方服务,通常非常好,否则,它取决于 SMTP 服务器的能力 |
成本 | 变量和基于使用情况 | 如果管理自己的 SMTP 服务器,则为低到中,如果使用第三方服务,则为可变和基于使用情况 |
特征 | 分析、模板和列表管理等高级功能 | 专注于发送没有高级功能的电子邮件 |
安全 | 内置对 DKIM、SPF 和 DMARC 等安全协议的支持 | 安全性取决于 SMTP 服务器配置,如果使用第三方服务,则通常很好 |
屬地 | 依赖第三方服务的正常运行时间和性能 | 依赖第三方服务的正常运行时间和性能,如果管理自己的服务器,则依赖更多控制 |
定制 | 取决于 API 提供商的功能和限制 | 取决于 SMTP 服务提供商的功能和限制。如果管理自己的服务器,可以提供完全控制 |
设置复杂性 | 与提供的 SDK 和 API 轻松集成 | 与 SMTP 提供商的凭据简单集成,自我管理的 SMTP 服务器需要对 SMTP 设置进行更多设置和配置 |
社区支持 | 来自 API 提供商的大型社区和广泛的文档 | 广泛使用,提供广泛的文档和社区支持 |
如何使用 Node.js 发送电子邮件
无论您选择使用 Email API 还是 Nodemailer,都需要先熟悉 Node.js 以及一些基础编码。本教程将介绍如何使用 MailerSend email API 和 SMTP 服务来发送电子邮件,因此您需要先注册一个 MailerSend 帐户。
以下是快速执行此操作的方法:
1. 注册一个 MailerSend 帐户。该服务是免费加入的,您将获得 100 封免费电子邮件以及一个试用域,让您能够迅速开始设置。如果您对服务满意,还可以订阅 Free 计划,每月最多可发送 3,000 封电子邮件,且无需支付任何费用。
2.注册并验证您的电子邮件地址后,接下来需要创建一个 API 令牌(如果您计划使用电子邮件 API)或 SMTP 用户和凭证(如果您计划使用 Nodemailer 和 SMTP)。
要创建 API 令牌:
在控制面板中,单击左侧菜单中的 Integrations,然后单击 API 令牌旁边的 Manage。
在 API 令牌页面上,单击 Generate new token(生成新令牌),将出现一个用于创建令牌的弹出窗口。输入可识别的名称,选择要为其创建令牌的域,并允许适当的访问权限。然后单击 Create token(创建令牌)。
将生成您的 API 令牌。复制并保存或下载令牌。关闭此弹出窗口后,出于安全原因,您将无法再次查看此令牌。
要创建新的 SMTP 用户和凭证:
在控制面板中,单击 Domains (域) 中的左侧菜单。如果您想使用自己的域,可以通过单击 Add domain (添加域) 来添加一个域,也可以使用试用域。
在要使用的域旁边,单击 Manage(管理)。向下滚动到 SMTP 部分,然后单击 Generate new user(生成新用户)。将出现一个弹出窗口,为您的新 SMTP 用户输入一个可识别的名称,然后单击 Save user(保存用户)。
然后,您将获得 SMTP 凭据,其中包括用户名、密码、服务器地址和端口。单击 Save user(保存用户)。然后,您可以将凭证保存在某个位置,或稍后通过单击 Manage (管理) 来访问它们。
使用电子邮件 API 在 Node.js 中发送电子邮件
现在,让我们转向在 Node.js 中使用电子邮件 API 发送电子邮件。使用 Email API 是发送电子邮件的强大且功能丰富的方式。尽管与 SMTP 一起使用某个软件包仍需要一些技术知识,但使用 Email API 可以获得更高级的功能和特性,这是值得的。
使用 MailerSend 的 API,您将获得个性化、动态电子邮件模板、黑名单管理、分析、使用 SPF、DKIM 和 DMARC 安全协议的发件人身份验证等功能。
如何开始使用:
1. 通过在系统上安装 Node.js,确保您已准备好 Node.js 环境。
然后,在项目目录中运行“npm init”命令,并按照提示设置 package.json 文件,以创建一个新的 Node.js 项目。
2. 接下来,使用以下命令安装 MailerSend 包:
npm install mailersend
要在代码中使用 env 变量,请安装 Dotenv 模块:
npm install dotenv --save
在以下代码示例中,我们将对 API 令牌使用此方法。要为您的 API 令牌定义变量,请在 Node.js 项目的根目录中创建一个名为 .env 的 .env 文件,并将 MAILERSEND_API_TOKEN 变量添加到该文件中。该文件应如下所示:
API_KEY=Your_API_Key_Here
如何发送 HTML 电子邮件
让我们看一下使用 MailerSend API 发送带有 Node.js 的简单 HTML 电子邮件所需的代码。在此示例中,我们将发送一封试用注册确认电子邮件,以确认用户的试用订阅,并向他们提供任何相关信息。
import 'dotenv/config';
import {
MailerSend,
EmailParams,
Sender,
Recipient
} from "mailersend";
const mailerSend = new MailerSend({
apiKey: process.env.API_KEY,
});
const sentFrom = new Sender("bob@yourbusiness.com", "Bob");
const recipients = [
new Recipient("pam@theoffice.com", "Pam")
];
const htmlContent = `
<p>Hey there!</p>
<p>Welcome to Your Business, we're happy to have you here!</p>
<p>You'll be happy to know that your free trial awaits, all you need to do is head to your account, log in and start playing.</p>
<p>Remember to check out our guides and contact support if you need anything.</p>
<br>
<p>Regards,</p>
<p>The Your Business Team</p>
`;
const emailParams = new EmailParams()
.setFrom(sentFrom)
.setTo(recipients)
.setReplyTo(sentFrom)
.setSubject("Welcome! Your free trial is ready.")
.setHtml(htmlContent)
.setText("Hey there! Welcome to Your Business, we're happy to have you here! You'll be happy to know that your free trial awaits, all you need to do is head to your account, log in and start playing. Remember to check out our guides and contact support if you need anything. Regards, The Your Business Team");
mailerSend.email.send(emailParams)
.then(response => {
console.log("Email sent successfully:", response);
})
.catch(error => {
console.error("Error sending email:", error);
})
如果需要添加任何 CC 或 BCC 收件人,则需要修改 emailParams 对象以包含这些收件人。以下是添加的 CC 和 BCC 收件人的代码:
import 'dotenv/config';
import {
MailerSend,
EmailParams,
Sender,
Recipient
} from "mailersend";
const mailerSend = new MailerSend({
apiKey: process.env.API_KEY,
});
const sentFrom = new Sender("bob@yourbusiness.com", "Bob");
const recipients = [
new Recipient("pam@theoffice.com", "Pam")
];
const ccRecipients = [
new Recipient("john@yourbusiness.com", "John")
];
const bccRecipients = [
new Recipient("sales@yourbusiness.com", "Sales")
];
const htmlContent = `
<p>Hey there!</p>
<p>Welcome to Your Business, we're happy to have you here!</p>
<p>You'll be happy to know that your free trial awaits, all you need to do is head to your account, log in and start playing.</p>
<p>Remember to check out our guides and contact support if you need anything.</p>
<br>
<p>Regards,</p>
<p>The Your Business Team</p>
`;
const emailParams = new EmailParams()
.setFrom(sentFrom)
.setTo(recipients)
.setCc(ccRecipients) // Adding CC recipients
.setBcc(bccRecipients) // Adding BCC recipients
.setReplyTo(sentFrom)
.setSubject("Welcome! Your free trial is ready.")
.setHtml(htmlContent)
.setText("Hey there! Welcome to Your Business, we're happy to have you here! You'll be happy to know that your free trial awaits, all you need to do is head to your account, log in and start playing. Remember to check out our guides and contact support if you need anything. Regards, The Your Business Team");
mailerSend.email.send(emailParams)
.then(response => {
console.log("Email sent successfully:", response);
})
.catch(error => {
console.error("Error sending email:", error);
})
如何发送基于模板的电子邮件
使用电子邮件API的一个主要优势在于能够轻松发送专业设计的电子邮件模板。在MailerSend平台上,通过模板构建器,您可以非常便捷地创建模板——无论是使用拖放编辑器、富文本编辑器,还是直接从HTML编辑器开始构建。之后,您只需获取模板的ID,并将其整合到您的代码中即可。
以下是我们使用模板时免费试用电子邮件的代码:
import 'dotenv/config';
import {
MailerSend,
EmailParams,
Sender,
Recipient
} from "mailersend";
const mailerSend = new MailerSend({
apiKey: process.env.API_KEY,
});
const sentFrom = new Sender("bob@yourbusiness.com", "Bob");
const recipients = [
new Recipient("pam@theoffice.com", "Pam")
];
const emailParams = new EmailParams()
.setFrom(sentFrom)
.setTo(recipients)
.setReplyTo(sentFrom)
.setSubject("Welcome! Your free trial is ready.")
.setTemplateId('templateId');
mailerSend.email.send(emailParams)
.then(response => {
console.log("Email sent successfully:", response);
})
.catch(error => {
console.error("Error sending email:", error);
})
如何发送个性化电子邮件
个性化变量能够帮助您根据导入的数据(例如收件人的姓名)为不同的收件人定制电子邮件内容。在使用 MailerSend 时,您可以通过 {{var}} 的格式来定义变量,并将它们嵌入到电子邮件内容中。
以下是一个示例代码,展示了如何发送一封包含个性化内容的电子邮件,通知用户他们的试用期即将结束。
import 'dotenv/config';
import {
MailerSend,
EmailParams,
Sender,
Recipient
} from "mailersend";
const mailerSend = new MailerSend({
apiKey: process.env.API_KEY,
});
const sentFrom = new Sender("bob@youbusiness.com", "Bob");
const recipients = [
new Recipient("pam@theoffice.com", "Pam")
];
const personalization = [{
email: "pam@theoffice.com",
data: {
name: 'Pam'
},
}];
const htmlContent = `
<p>Hi {{name}}.</p>
<p>We wanted to remind you that your free trial will expire in 3 days.</p>
<p>If you like what you see and would like to continue using Your Business, you can purchase a Premium plan by clicking Upgrade in your dashboard.</p>
<p>If you choose not to upgrade, you’ll lose access to premium features and your data, which will be permanently deleted after 30 days.</p>
<br>
<p>Regards,</p>
<p>The Your Business Team</p> `;
const emailParams = new EmailParams()
.setFrom(sentFrom)
.setTo(recipients)
.setReplyTo(sentFrom)
.setPersonalization(personalization)
.setSubject("{{name}}, your free trial is about to expire.")
.setHtml(htmlContent)
.setText("Hi {{name}}. We wanted to remind you that your free trial will expire in 3 days. If you like what you see and would like to continue using Your Business, you can purchase a Premium plan by clicking Upgrade in your dashboard. If you choose not to upgrade, you’ll lose access to premium features and your data, which will be permanently deleted after 30 days. Regards, The Your Business Team");
mailerSend.email.send(emailParams)
.then(response => {
console.log("Email sent successfully:", response);
})
.catch(error => {
console.error("Error sending email:", error);
})
如何发送带有附件的电子邮件
当Pam决定购买订阅时,就到了发送她第一张发票的时候。为了发送带有附件的电子邮件,我们将使用attachment类,并通过设置content、filename和type属性来定义该附件。
import 'dotenv/config';
import {
MailerSend,
EmailParams,
Sender,
Recipient
} from "mailersend";
const mailerSend = new MailerSend({
apiKey: process.env.API_KEY,
});
const sentFrom = new Sender("bob@youbusiness.com", "Bob");
const recipients = [
new Recipient("pam@theoffice.com", "Pam")
];
const attachmentContent = fs.readFileSync('/path/to/invoice.pdf', {
encoding: 'base64'
});
const attachment = new Attachment({
content: attachmentContent,
filename: 'invoice.pdf',
type: 'application/pdf',
disposition: 'attachment' // Optional: Specifies that it's an attachment
});
]
const personalization = [{
email: "pam@theoffice.com",
data: {
name: 'Pam'
},
}];
const htmlContent = `
<p>Hi {{name}}.</p>
<p>Thanks for using Your Business!</p>
<p>Your subscription has been renewed for 1 month. The details of your invoice are below and a downloadable copy has been attached</p>
<br>
<p>Regards,</p>
<p>The Your Business Team</p> `;
const emailParams = new EmailParams()
.setFrom(sentFrom)
.setTo(recipients)
.setReplyTo(sentFrom)
.setPersonalization(personalization)
.setSubject("{{name}}, here’s your Your Business invoice.")
.setHtml(htmlContent)
.setText("Hi {{name}}. Thanks for using Your Business! Your subscription has been renewed for 1 month. The details of your invoice are below and a downloadable copy has been attached Regards, The Your Business Team");
// Assign the attachment to emailParams
emailParams.attachments = [attachment];
mailerSend.email.send(emailParams)
.then(response => {
console.log("Email sent successfully:", response);
})
.catch(error => {
console.error("Error sending email:", error);
})
如何批量发送电子邮件
MailerSend提供的批量电子邮件功能,能够通过一个单一的API调用,方便地实现个性化电子邮件的批量发送。这一功能帮助您规避了速率限制,并显著提升了发送效率。
在此示例中,我们计划向Pam和Dwight发送反馈请求。此类交易性电子邮件非常适合进行批量发送,因为其对时间的要求并不严格,可以随时进行。
import 'dotenv/config';
import {
MailerSend,
EmailParams,
Sender,
Recipient
} from "mailersend";
const mailerSend = new MailerSend({
apiKey: process.env.API_KEY,
});
const sentFrom = new Sender("bob@yourbusiness.com", "Bob");
const bulkEmails = [];
const personalization = [{
email: "pam@theoffice.com",
data: {
name: 'Pam'
},
},
{
email: "dwight@theoffice.com",
data: {
name: 'Dwight'
},
}
];
const htmlContent = `
<p>Hi {{name}}.</p>
<p>Thanks for using Your Business!</p>
<p>As you’ve been using the app for a while now, we’d love to hear your thoughts.</p>
<p>Our customer feedback survey takes just a few minutes to complete and will help us to make our offering even better.</p>
<p><a href="url to your survey" target="_blank">Take survey</a></p>
<p>Thanks for your participation!</p>
<br>
<p>Regards,</p>
<p>The Your Business Team</p>`;
const textContent = `
Hi {{name}}.
Thanks for using Your Business!
As you’ve been using the app for a while now, we’d love to hear your thoughts.
Our customer feedback survey takes just a few minutes to complete and will help us to make our offering even better.
Take survey: url to your survey
Thanks for your participation!
Regards,
The Your Business Team`;
const emailParams1 = new EmailParams()
.setFrom(sentFrom)
.setTo([new Recipient("pam@theoffice.com", "Pam")])
.setSubject("Let us know what you think.")
.setHtml(htmlContent)
.setText(textContent)
.setPersonalization([personalization[0]]);
bulkEmails.push(emailParams1);
const emailParams2 = new EmailParams()
.setFrom(sentFrom)
.setTo([new Recipient("dwight@theoffice.com", "Dwight")])
.setSubject("Let us know what you think.")
.setHtml(htmlContent)
.setText(textContent)
.setPersonalization([personalization[1]]);
bulkEmails.push(emailParams2);
mailerSend.email.send(emailParams)
.then(response => {
console.log("Email sent successfully:", response);
})
.catch(error => {
console.error("Error sending email:", error);
})
如何安排电子邮件发送
如果您需要在特定时间或日期发送电子邮件,则可以使用 .setSendAt 参数和 Unix 时间戳来安排它。以下是我们发送给 Pam 和 Dwight 的维护通知电子邮件的代码示例。
import 'dotenv/config';
import {
MailerSend,
EmailParams,
Sender,
Recipient
} from "mailersend";
const mailerSend = new MailerSend({
apiKey: process.env.API_KEY,
});
const sentFrom = new Sender("bob@yourbusiness.com", "Bob");
const recipients = [
new Recipient("pam@theoffice.com", "Pam"),
new Recipient("Dwight@theoffice.com", "Dwight")
];
const htmlContent = `
<p>We would like to inform you that the Your Business app is scheduled for maintenance on Tuesday, 25th June 2024 at 3 AM.</p>
<p>This will result in some downtime between the hours of 3 AM and 3:30 AM, after which services will resume as usual.</p>
<p>If you have any questions, please contact support.</p>
<br>
<p>Regards,</p>
<p>The Your Business Team</p>`;
const textContent = `
We would like to inform you that the Your Business app is scheduled for maintenance on Tuesday, 25th June 2024 at 3 AM.
This will result in some downtime between the hours of 3 AM and 3:30 AM, after which services will resume as usual.
If you have any questions, please contact support.
Regards,
The Your Business Team
const emailParams = new EmailParams()
.setFrom(sentFrom)
.setTo(recipients)
.setReplyTo(sentFrom)
.setSubject("Notice of scheduled maintenance on Tuesday, 25th June")
.setHtml(htmlContent)
.setText(textContent)
.setSendAt(Math.floor((new Date(Date.now()+ 30*60*1000)).getTime() / 1000)); //send in 30mins NB:param has to be a Unix timestamp e.g 2443651141
mailerSend.email.send(emailParams)
.then(response => {
console.log("Email sent successfully:", response);
})
.catch(error => {
console.error("Error sending email:", error);
})
在此示例中,Date.now()
方法用于获取当前时间(以毫秒为单位)。接着,通过向当前时间添加 30 * 60 * 1000
毫秒,计算出从当前时刻起30分钟后的时间点。
Date
对象的 getTime()
方法返回自 Unix 纪元以来的毫秒数。为了将其转换为以秒为单位的 Unix 时间戳,我们将毫秒数除以 1000
。
Math.floor()
函数用于将得到的时间戳向下舍入到最接近的整数,因为 Unix 时间戳必须是整数。最后,使用 EmailParams
的 setSendAt
方法来设置计划发送时间,而该时间是通过前面计算出的 Unix 时间戳来确定的。
使用 SMTP 和 Nodemailer 以 Node.js 发送电子邮件
如果您想使用 SMTP,Nodemailer 无疑是一个很好的解决方案。Node.js 模块允许您以简单有效的方式将电子邮件发送集成到 Node.js 应用程序中,同时支持身份验证机制以确保与 SMTP 服务器的连接安全。
简而言之:
- 它大大简化了在 Node.js 应用程序中集成电子邮件发送功能的过程。
- 通过它,您可以轻松地发送附带附件和 HTML 内容的电子邮件。
- 它为您提供了一种既简单又安全的,使用 Node.js 和 SMTP 发送电子邮件的方法。
注意:
虽然您可以直接使用 SMTP 服务器在 Node.js 中发送电子邮件,但这种方法缺少了像 Nodemailer 这样的库所能提供的丰富安全功能,可能会使您的应用程序面临网络攻击和数据泄露的风险。
所以让我们开始吧。
1. 首先,请确保您的系统上已经安装了 Node.js,这是进行后续操作的基础。
然后,在您的项目目录中运行 npm init 命令,并根据提示完成 package.json 文件的设置,从而创建一个新的 Node.js 项目。
2. 安装 Nodemailer 模块:
npm install nodemailer
3. 在项目根目录中为您的 MailerSend SMTP 凭证创建一个 .env 文件 — 如果您需要复习如何创建 SMTP 用户和检索凭证,请跳回本节的开头或阅读我们的指南如何使用 SMTP 发送电子邮件。
您需要添加 SMTP 服务器地址、端口、用户名和密码:
SMTP_HOST=smtp.mailersend.net
SMTP_PORT=587
SMTP_USER=your_mailersend_username
SMTP_PASS=your_mailersend_password
4. 安装 dotenv 包以从 .env 文件加载 SMTP 凭证:
npm install dotenv
5. 发送电子邮件!以下是使用我们的试用确认电子邮件的代码示例:
import 'dotenv/config';
import nodemailer from 'nodemailer';
// Load environment variables from .env file
import dotenv from 'dotenv';
dotenv.config();
// Create a transporter object using SMTP transport
const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST,
port: process.env.SMTP_PORT,
secure: false, // true for 465, false for other ports
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
// Setup email data
const mailOptions = {
from: '"Bob" <bob@yourbusiness.com>', // sender address
to: 'pam@theoffice.com', // list of receivers
subject: 'Welcome! Your free trial is ready.', // Subject line
text: 'Hey there! Welcome to Your Business, we\'re happy to have you here! You\'ll be happy to know that your free trial awaits, all you need to do is head to your account, log in and start playing. Remember to check out our guides and contact support if you need anything. Regards, The Your Business Team', // plain text body
html: `
<p>Hey there!</p>
<p>Welcome to Your Business, we're happy to have you here!</p>
<p>You'll be happy to know that your free trial awaits, all you need to do is head to your account, log in and start playing.</p>
<p>Remember to check out our guides and contact support if you need anything.</p>
<br>
<p>Regards,</p>
<p>The Your Business Team</p>
`, // html body
};
// Send email
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error);
}
console.log('Message sent: %s', info.messageId);
});
就是这样!
如果你想在电子邮件中添加附件,你只需要在 mailOptions 中包含一个 attachments 数组:
attachments: [
{
filename: 'invoice.pdf',
path: '/path/to/invoice.pdf',
},
]
还可以通过修改电子邮件内容并定义收件人的个性化数据,在电子邮件中包含个性化。这是该反馈请求,其中为收件人的姓名设置了个性化变量:
import 'dotenv/config';
import nodemailer from 'nodemailer';
import dotenv from 'dotenv';
dotenv.config();
// Create a transporter object using SMTP transport
const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST,
port: process.env.SMTP_PORT,
secure: false, // true for 465, false for other ports
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
// Define your list of recipients and their personalization data
const recipients = [{
email: 'pam@theoffice.com',
name: 'Pam',
},
{
email: 'dwight@theoffice.com',
name: 'Dwight',
},
];
const sendPersonalizedEmails = async (recipients) => {
for (const recipient of recipients) {
// Personalize the email content
const textContent = `Hi ${recipient.name},\nThanks for using Your Business! As you’ve been using the app for a while now, we’d love to hear your thoughts. Our customer feedback survey takes just a few minutes to complete and will help us to make our offering even better. Take survey: url to your survey\nThanks for your participation!\nRegards,\nThe Your Business Team`;
const htmlContent = `
<p>Hi ${recipient.name}.</p>
<p>Thanks for using Your Business!</p>
<p>As you’ve been using the app for a while now, we’d love to hear your thoughts.</p>
<p>Our customer feedback survey takes just a few minutes to complete and will help us to make our offering even better.</p>
<p><a href="url to your survey" target="_blank">Take survey</a></p>
<p>Thanks for your participation!</p>
<br>
<p>Regards,</p>
<p>The Your Business Team</p>
`;
const mailOptions = {
from: '"Bob" <bob@yourbusiness.com>', // sender address
to: recipient.email, // recipient address
subject: 'Let us know what you think.', // Subject line
text: textContent, // plain text body
html: htmlContent, // html body
};
// Send the email
try {
let info = await transporter.sendMail(mailOptions);
console.log('Message sent: %s', info.messageId);
} catch (error) {
console.error('Error sending email:', error);
}
}
};
sendPersonalizedEmails(recipients);
在 Node.js 中发送电子邮件的最佳实践
若操作得当并遵循最佳实践,Node.js 将成为一种高效、可靠且安全的电子邮件发送方式。如果您已准备好开始使用,请牢记以下最佳实践,以确保顺利实施并提升电子邮件发送体验。
1. 选择正确的发送方式
尽管我们因Email API的灵活性和高级功能而对其青睐有加,但我们深知它并非适用于所有人。SMTP和电子邮件API在易用性、功能性、可靠性和安全性方面各有千秋。若您寻求一种简洁且经济高效的解决方案,SMTP可能是您的理想之选。然而,若您期望获得更多功能、高级工作流程及跟踪能力,那么API将是您的最佳选择。
此外,管理自己的SMTP服务器要复杂得多,需要您自行实施安全措施以确保发送安全。与诸如MailerSend这样的第三方提供商合作,则意味着送达率、安全性及其他所有问题都将得到妥善处理。
MailerSend的Email API和SMTP均构建于同一强大、安全且可靠的发送基础设施之上,并提供对活动和分析的访问权限。因此,无论您选择使用我们的API还是保持简单的SMTP方式,都可以放心,您的电子邮件将得到妥善处理。
2. 使用环境变量
为了集成电子邮件发送功能,您需要使用一些敏感数据,比如 API 密钥和 SMTP 凭据。这些数据若直接暴露在代码中,会带来安全风险!通过将它们保存在 .env
文件中,您可以在代码中隐藏这些数据,从而避免泄露。此外,这也使得管理电子邮件发送变得更加便捷,因为您无需在每个电子邮件发送的脚本中硬编码 API 密钥或 SMTP 凭据,只需在 .env
文件中更新相关数据即可。
3. 实施充分的错误处理
为可能出现的故障做好准备是构建任何优秀系统的关键一环。在电子邮件发送的场景中,您需要确保应用程序能够妥善处理任何错误,避免崩溃或出现意外的响应。为此,您可以使用 try-catch 块或 promise 错误处理机制来捕获并记录任何错误。这样做不仅能提升应用程序的可靠性,还能让故障排除工作变得更加轻松。
4. 使用速率限制
速率限制涉及使用 Bottleneck 等软件包来限制电子邮件发送。下面是一个示例:
import Bottleneck from 'bottleneck';
const limiter = new Bottleneck({
minTime: 100 / maxEmailsPerSecond,
});
limiter.schedule(() => transporter.sendMail(mailOptions));
这样做可以防止你的应用压垮你的电子邮件服务器,并避免你的电子邮件服务提供商设置的任何速率限制。
5. 验证电子邮件地址
对电子邮件地址进行实时验证,能够优化您的收件人列表,使其保持高效且持久,进而帮助您维持较高的电子邮件送达率。尽管您可以通过 JavaScript 中的正则表达式来检查电子邮件地址的格式是否正确,但这仅仅停留在表面层面。为了更深入地检查不存在的邮箱、拼写错误以及一次性电子邮件等问题,推荐使用电子邮件验证服务。
您可以查阅相关文章,了解如何借助 MailerSend 开始进行实时电子邮件验证。
6. 使用模板
电子邮件模板能够助您发送符合品牌调性的专业设计邮件。同时,它们还简化了电子邮件内容的管理流程,并有助于保持代码的清晰与简洁。您只需构建模板,并将其单独存储,随后在发送电子邮件时将其加载即可。
在使用 MailerSend 时,这一过程尤为简便。MailerSend 提供了三个电子邮件构建器选项,包括拖放、丰富文本以及 HTML。构建模板后,您只需检索模板 ID,并将其添加到您的代码中即可。
7. 监控电子邮件的送达率和性能
或许您会认为电子邮件分析仅仅是业务负责人关注的事项,用以查看电子邮件的转化次数。但实际上,分析能够为您提供关键的性能洞察,帮助您识别送达率方面存在的问题。
更重要的是,借助MailerSend,您可以轻松利用webhook设置通知,这样一旦有任何异常情况发生,您就能实时了解,而无需亲自查看分析仪表板。
简单、高效且可靠的电子邮件发送方案
利用 Email API 或 Nodemailer 是通过 Node.js 发送电子邮件的常用且明智之选,这背后有着充分的理由。当您选择与可靠的电子邮件服务提供商合作时,几乎可以确保不会出错。而且,作为 JavaScript 运行时的一部分,这种方式是将电子邮件发送功能集成到 JavaScript 应用程序中的最为简便的方法。
若您正在寻找一个既能保证卓越送达率又强大且安全的 Email API,那么 MailerSend 无疑是一个值得尝试的选择。