背景
之前做了一个 Chrome 扩展,有用户提出的需求需要登陆了才能实现。于是就需要使用邮件服务来发送验证码做注册和找回。其实按照目前的情况,使用个人 163 邮箱配置一下 POP3/SMTP 然后通过 nodemailer 发送足够了。毕竟用户也不多,但是吧 还是想找个更好点的方案 😂。
之前正好看到有其他的开发者推荐过的一个邮件发送服务,Brevo app.brevo.com/ 之前应该也叫做 Sendinblue。试用了一下感觉非常不错,免费 Plan 每天 300 封邮件,简直太香了。所以给大家推荐一下同时记录一下使用的过程,希望可以帮助到有需要的同学。
使用个人邮箱推送邮件的缺点
-
发送数量限制:大多数个人邮箱都有每日或每小时的发送限制,一旦超出这个限制,邮件可能会被暂停发送或者直接被退回。而且限制通常比专业邮件服务平台要严格,不能满足增长中的用户需求。
-
反垃圾邮件机制:使用个人邮箱发送大量邮件可能会被邮件服务器标记为垃圾邮件。这不仅会导致邮件无法送达,还可能影响到发送方的信誉,降低邮件投递的成功率。
-
缺乏专业功能:个人邮箱缺乏营销邮件或交易邮件所需的高级功能,如邮件追踪、自动化工作流、A/B 测试、统计分析等。
-
邮件可扩展性差:一旦用户量增加,个人邮箱难以支持大量邮件的发送,邮件的可扩展性和服务的可靠性会受到影响,导致用户体验下降。
-
安全性问题:个人邮箱通常没有针对大规模邮件发送的安全防护措施,例如防止滥用、保护用户数据、合规性等。这可能会带来隐私和安全问题。
个人邮箱配合 nodemailer 发送邮件【不推荐】
这里以 163 邮箱为例,说一下 nodejs 如何用个人邮箱发送邮件。
配置邮箱 POP3/SMTP
-
登录 163 邮箱,点击“设置”选择 POP3/SMTP/IMAP 配置项。
-
开启服务,通过验证后复制授权密码。
node 安装 nodemailer
pnpm i nodemailer
发送邮件
const nodemailer = require("nodemailer");
// 配置 SMTP 传输服务
const transporter = nodemailer.createTransport({
host: "smtp.163.com", // 163 邮箱的 SMTP 服务器地址
port: 465, // 端口号(163 邮箱用的是 465)
secure: true, // 如果为 true 则使用 SSL 加密
auth: {
user: "example@163.com", // 你的 163 邮箱账号
pass: "***************", // 你的邮箱 SMTP 授权码,而不是邮箱的登录密码
},
});
// 设置邮件选项
const mailOptions = {
from: '"酸菜鱼和地锅鸡" <example@163.com>', // 发件人
to: "username@gmail.com", // 收件人
subject: "Test Email", // 邮件标题
text: "Hello world?", // 邮件正文(文本格式)
html: "<b>Hello world?</b>", // 邮件正文(HTML 格式)
};
// 发送邮件
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
return console.log(error);
}
console.log("Message sent: %s", info.messageId);
});
使用 Brevo 邮件推送平台【推荐】
使用 Brevo 需要有一个域名或者企业邮箱,这里我使用的是域名,以前在阿里云买的。哪个平台的域名都行,只要能配置域名解析就可以。
注册登录
注册登录没啥说的,填写基本信息就好了,也没有实名认证之类的。
配置 Sender 与 Domain
进入发件人和域名配置页面
配置域名
这里可以使用子域名,比如 email.baidu.com。记住这个域名,后面要用到。
添加域名后会生成三条解析配置,分别将其配置在域名解析中。我的是在阿里云购买的域名,需要去阿里云进行配置。
登录阿里云控制台,解析可能有一点点的延迟,有时需要稍微等几分钟。
配置发件人
From name 随便填,没有影响。From email 就是发邮件时用到的邮箱,邮箱名称根据自己的喜好定义,但是服务地址就要跟上面解析的域名保持一致。
获取 api-key
点击右上角的个人名称,进入到配置页面,创建一个 api-key.
发送邮件
安装 npm 依赖
pnpm i sib-api-v3-sdk
sib-api-v3-sdk 依赖包安装后控制台会提示这个包废弃了不再维护,不过不影响使用。也可以按照 github 使用他们团队开发的新的包 github.com/getbrevo/br…
const SibApiV3Sdk = require("sib-api-v3-sdk");
class Email {
apiInstance;
constructor() {
this.apiInstance = new SibApiV3Sdk.TransactionalEmailsApi();
SibApiV3Sdk.ApiClient.instance.authentications['api-key'].apiKey =
process.env.SIB_KEY;
}
send() {
// 定义邮件内容
const sendSmtpEmail = {
to: [{ email: '****@****.com', name: 'RecipientName' }], // 直接指定收件人
sender: {
email: '****@****.com', // 这个地方替换为在平台配置的 email
name: 'SenderName',
},
subject: 'Test Email',
htmlContent:
'<p>Hello, this is a test email sent using Sendinblue API.</p>',
};
// 发送邮件
this.apiInstance.sendTransacEmail(sendSmtpEmail).then(
(data) => {
console.log('邮件发送成功: ' + JSON.stringify(data));
},
(error) => {
console.error('邮件发送失败: ', error);
},
);
}
}
const email = new Email()
email()
大功告成,这样就可以通过 nodejs 发送邮件了。如果后期有大量的需求,也可以升级为付费计划。