当前位置: 首页 > news >正文

Nodemailer使用教程:在Node.js中发送电子邮件

目录

1. 简介

2. 安装

3. 基本配置

3.1 创建传输器

3.2 配置说明

4. 发送邮件

4.1 基本发送示例

4.2 发送验证码示例

5.?常见问题解决

5.1 “Greeting never received”?错误

5.2?安全建议

SMTP与邮件加密协议详解?

1. SMTP简介

1.1 基本特点

2. 加密协议对比

2.1 SSL/TLS (端口465)

?2.2?STARTTLS (端口587)

3. 端口使用建议

3.1 常用端口对比

3.2 选择建议

4. 安全性考虑

4.1?SSL/TLS (465端口)优势

4.2 STARTTLS (587端口)注意事项

5.?常见邮件服务商配置

5.1 Gmail

5.2?Outlook/Office365

5.3 QQ邮箱


1. 简介

Nodemailer是Node.js平台上最流行的电子邮件发送库,它提供了一个简单而强大的解决方案,支持Unicode内容、HTML内容、附件、图片嵌入等功能。

2. 安装

首先需要安装Nodemailer包:

npm install nodemailer

3. 基本配置

3.1 创建传输器

首先需要创建一个传输器(transporter),这是发送邮件的核心配置:

const nodemailer = require("nodemailer"); const transporter = nodemailer.createTransport({ host: "smtp.example.com", // SMTP服务器地址 port: 465, // SMTP端口 secure: true, // 使用SSL/TLS auth: { user: "your-email@example.com", // 邮箱账号 pass: "your-password" // 邮箱密码或应用专用密码 } });
3.2 配置说明

host: SMTP服务器地址

port: 常用端口

  • 465 (SSL/TLS)
  • 587 (STARTTLS)

secure:

  • true: 使用465端口
  • false: 使用其他端口

auth: 认证信息

4. 发送邮件

4.1 基本发送示例
async function sendEmail(to, subject, content) { const mailOptions = { from: '"发送者名称" <sender@example.com>', // 发件人 to: to, // 收件人 subject: subject, // 主题 text: content, // 纯文本内容 html: `<b>${content}</b>` // HTML内容 }; try { const info = await transporter.sendMail(mailOptions); console.log("邮件发送成功:", info.messageId); return info; } catch (error) { console.error("邮件发送失败:", error); throw error; } }
4.2 发送验证码示例

以下是一个完整的发送验证码的实现:

const nodemailer = require("nodemailer"); const transporter = nodemailer.createTransport({ host: MAIL_HOST, port: MAIL_PORT, secure: true, auth: { user: MAIL_USER, pass: MAIL_PWD, } }); const sendMail = async (to, subject, html) => { const mailOptions = { from: MAIL_USER, // 发送者 to, // 接收者 subject, // 主题 html, // HTML内容 }; return await transporter.sendMail(mailOptions); };

在控制器中使用:

async sendEmailCode(ctx, next) { const { email } = ctx.request.body; // 生成6位随机验证码 const code = Math.random().toString().slice(2, 8); // 构建HTML模板 const html = ` <p>你好!</p> <p>您正在注册社区账号</p> <p>你的验证码是:<strong style="color: #ff4e2a;">${code}</strong></p> <p>***该验证码5分钟内有效***</p> `; try { // 发送邮件 await sendMail(email, "验证码", html); // 存储验证码(使用Redis) const emailCodeKey = `email:${email}`; await Redis.set(emailCodeKey, code, 60 * 5); ctx.body = { code: 0, message: "发送邮箱验证码成功", result: "" }; } catch (error) { ctx.body = { code: -1, message: "发送邮箱验证码失败", error: error.message }; } }

5.常见问题解决

5.1 "Greeting never received"错误

如果遇到"Greeting never received"错误,通常有以下解决方案:

  • 检查端口配置:

    {
    port: 465, // SSL
    secure: true
    }
    // 或
    {
    port: 587, // STARTTLS
    secure: false
    }

  • 检查网络连接

  • 确认服务器设置是否正确

4. 验证认证信息是否正确

5.2安全建议
  • 使用环境变量存储敏感信息

  • 启用SSL/TLS加密

  • 使用应用专用密码而不是邮箱密码

  • 设置合理的超时时间

SMTP与邮件加密协议详解

1. SMTP简介

SMTP(Simple Mail Transfer Protocol,简单邮件传输协议) 是一个在互联网上发送电子邮件的标准协议。

1.1 基本特点
  • 默认使用25端口(未加密)

  • 以纯文本形式传输数据

  • 没有加密保护,容易被截获

2. 加密协议对比

2.1 SSL/TLS (端口465)
const transporter = nodemailer.createTransport({ host: "smtp.example.com", port: 465, secure: true, // 启用SSL/TLS auth: { user: "your-email@example.com", pass: "your-password" } });

特点:

  • 全程加密通信

  • 连接建立时就启用加密

  • 更安全,是推荐的加密方式

  • 适用于现代邮件系统

工作流程:

  • 客户端连接到服务器的465端口

  • 立即建立SSL/TLS加密通道

  • 所有后续通信都在加密通道中进行

2.2STARTTLS (端口587)
const transporter = nodemailer.createTransport({ host: "smtp.example.com", port: 587, secure: false, // 使用STARTTLS auth: { user: "your-email@example.com", pass: "your-password" } });

特点:

  • 先以明文方式建立连接

  • 通过STARTTLS命令升级为加密连接

  • 向后兼容性更好

  • 适用于一些旧的邮件系统

工作流程:

1. 客户端以明文方式连接到587端口

  • 服务器告知支持STARTTLS

  • 客户端发送STARTTLS命令

  • 连接升级为加密连接

  • 继续后续通信

3. 端口使用建议

3.1 常用端口对比

| 端口 | 协议| 加密方式 | 建议 |

|------|------|----------|------|

| 25 | SMTP | 无加密 | 不推荐使用|

| 465 | SMTPS | SSL/TLS | 推荐使用|

| 587 | SMTP | STARTTLS| 备选方案 |

3.2 选择建议
// 推荐配置(使用465端口) const secureConfig = { host: "smtp.example.com", port: 465, secure: true, auth: { user: "your-email@example.com", pass: "your-password" } }; // 备选配置(使用587端口) const starttlsConfig = { host: "smtp.example.com", port: 587, secure: false, requireTLS: true, // 强制要求TLS auth: { user: "your-email@example.com", pass: "your-password" } };

4. 安全性考虑

4.1SSL/TLS (465端口)优势
  • 全程加密,无明文传输风险

  • 连接建立更快

  • 现代邮件服务器普遍支持

  • 不存在降级攻击风险

4.2 STARTTLS (587端口)注意事项
  • 初始连接为明文

  • 可能受到降级攻击

  • 需要额外的STARTTLS协商过程

  • 配置时建议启用requireTLS选项

    // STARTTLS的安全配置
    const secureStartTLS = {
    host: “smtp.example.com”,
    port: 587,
    secure: false,
    requireTLS: true,
    tls: {
    rejectUnauthorized: true, // 验证服务器证书
    minVersion: “TLSv1.2” // 最低TLS版本
    }
    };

5.常见邮件服务商配置

5.1 Gmail
{ host: "smtp.gmail.com", port: 465, secure: true }
5.2Outlook/Office365
{ host: "smtp.office365.com", port: 587, secure: false, requireTLS: true }
5.3 QQ邮箱
{ host: "smtp.qq.com", port: 465, secure: true }

通过了解这些区别,你可以根据具体需求选择合适的配置。一般情况下,如果邮件服务器支持465端口的SSL/TLS,建议优先使用这种方式,因为它更安全且效率更高。

http://www.jsqmd.com/news/468808/

相关文章:

  • 3月12日(进阶4)
  • Redis 平替来了!SpringBoot 集成 Dragonfly,性能暴涨 25 倍
  • 今年NVIDIA GTC,将会是VLA、端到端和WAM的高光时刻
  • 请介绍下 C++ 模板中的 SFINAE?它的原则是什么?
  • Flutter 三方库 common_locale_data 的鸿蒙化适配指南 - 实现具备全球化区域元数据与多语言辅助能力的底层数据池、支持端侧国际化业务的精细化治理实战
  • 好奇Clawhub/Skillhub上的插件/Skills(案例一)
  • CMakeLists.txt配置详细介绍
  • openclaw使用笔记,如何启动
  • 图文手把手!小艺接入 OpenClaw 超简单
  • 0311晨间日记
  • 周鸿祎回应“龙虾安全”争议:它是好东西绝非病毒,不发展才是最大安全隐患
  • 搜维尔科技:使用Manus Pro数据手套在实验室远程操控22自由度机械手
  • Flutter 三方库 serial_csv 的鸿蒙化适配指南 - 实现极速的流式 CSV 数据编解码、支持端侧超大规模表格数据的高效序列化实战
  • Flutter 三方库 system_shortcuts 的鸿蒙化适配指南 - 实现快速触发系统级快捷功能、支持 WiFi 开关、亮度调节与系统设置一键直达
  • 小团队开发小 web 项目,使用 PHP 还是 next.js ?
  • python flask django美食短视频分享交流社区系统
  • Matplotlib:tick_params的用法
  • JAVA按模版导出Word文档(无需转换word格式)
  • 50个深蹲,就能练遍整个下半身!
  • 搜维尔科技:SenseGlove R1专为无缝控制人形机器人手而设计,融合了主动力反馈、毫米级手指追踪精度和振动触觉反馈
  • 2026年,济南联想信创服务器供应商究竟哪家强?最新评测为你揭晓答案!
  • the evilness of American English
  • 关于立交中辅助车道设置的探讨
  • PHP与C++:Web开发与系统编程的终极对决
  • python flask django露营研学基地服务管理系统
  • 自然语言处理实战与Ai辅助编程指南
  • # 发散创新:用CUDA+OpenMP实现异构计算在图像滤波中的高效加速 在现代高性能计
  • 营销智能体≠聊天机器人!搞清这三层,你的投入才不打水漂
  • linux 服务器设置 时 /etc/passwd设置为nologin时,登录SFTP会报 No supported authentication methods available
  • 简单绘制装修施工进度图在线画图工具操作便捷易上手