在 JavaScript (Node.js) 中发送电子邮件:Nodemailer、SendGrid、Mailgun

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 JavaScript (Node.js) 中发送电子邮件:完整指南



在现代 Web 开发中,能够以编程方式发送电子邮件是任何严肃应用程序的关键功能。无论是注册确认、密码重置、通知还是营销邮件——Node.js 都提供了多种强大的解决方案来集成邮件功能。在本文中,我们将详细解析三种最流行的方法:内置库 nodemailer、云服务 SendGrid 和灵活的 API Mailgun。



为什么需要单独的库来发送电子邮件?

Node.js 没有内置处理 SMTP 协议或邮件服务 REST API 的功能。因此,开发者使用专门的库来处理以下任务:

  • 生成正确的 MIME 消息(包括 HTML、附件、内嵌图像);
  • 管理队列和在网络错误时进行重试;
  • 安全存储和传输凭证;
  • 支持流行的邮件提供商(Gmail、Yandex、Mail.ru、企业服务器)。


1. Nodemailer——通用 SMTP 客户端

Nodemailer 是 Node.js 中发送电子邮件的事实标准。它既支持传统的 SMTP,也支持 OAuth2 集成。该库无需额外依赖即可工作,并允许通过任何 SMTP 服务器发送邮件。



安装

npm install nodemailer


通过 Gmail SMTP 发送的基本示例

const nodemailer = require('nodemailer');

const transporter = nodemailer.createTransport({ host: 'smtp.gmail.com', port: 587, secure: false, // true 用于 465 端口,false 用于其他端口 auth: { user: 'your-email@gmail.com', pass: 'your-app-password' // 请使用应用专用密码,而非主密码! }});

const mailOptions = { from: '"Sender Name" <your-email@gmail.com>', to: 'recipient@example.com', subject: '来自 Node.js 的问候', text: '这是一封简单的纯文本邮件。', html: '<b>这是 HTML 中的粗体文本</b>'};

transporter.sendMail(mailOptions, (error, info) => { if (error) { return console.log('错误:', error); } console.log('邮件已发送:%s', info.messageId);});


处理附件

mailOptions.attachments = [    {   // 磁盘上的文件        filename: 'document.pdf',        path: '/path/to/document.pdf'    },    {   // 字符串内容        filename: 'notes.txt',        content: '即时创建的文本文件'    }];


2. SendGrid——用于事务性邮件的云服务

SendGrid(现为 Twilio 的一部分)提供了强大的 REST API,并保证了高送达率。@sendgrid/mail 库简化了集成过程。适用于重视打开率、点击率和退订分析的项目。



安装

npm install @sendgrid/mail


发送示例

const sgMail = require('@sendgrid/mail');sgMail.setApiKey(process.env.SENDGRID_API_KEY);

const msg = { to: 'recipient@example.com', from: 'sender@yourdomain.com', // 域名必须在 SendGrid 中验证 subject: '服务通知', text: '邮件的纯文本版本', html: '<h1>你好!</h1><p>这封邮件是通过 SendGrid 发送的。</p>',};

sgMail.send(msg) .then(() => console.log('邮件发送成功')) .catch((error) => console.error(error.toString()));


使用动态模板发送

const msg = {    to: 'user@example.com',    from: 'test@example.com',    templateId: 'd-xxxxxxxxxxxxxxxxxxxx', // 来自 SendGrid 的模板 ID    dynamicTemplateData: {                    

推荐