在 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: {