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

server/2024/11/27 10:48:16/

目录

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/TLSauth: {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,  // SSLsecure: true
}
// 或
{port: 587,  // STARTTLSsecure: 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/TLSauth: {user: "your-email@example.com",pass: "your-password"}
});

特点:

  • 全程加密通信
  • 连接建立时就启用加密
  • 更安全,是推荐的加密方式
  • 适用于现代邮件系统

工作流程:

  • 客户端连接到服务器的465端口
  • 立即建立SSL/TLS加密通道
  • 所有后续通信都在加密通道中进行

 2.2 STARTTLS (端口587)

const transporter = nodemailer.createTransport({host: "smtp.example.com",port: 587,secure: false,  // 使用STARTTLSauth: {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,  // 强制要求TLSauth: {user: "your-email@example.com",pass: "your-password"}
};

 

4. 安全性考虑

4.1 SSL/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.2 Outlook/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.ppmy.cn/server/145317.html

相关文章

DAMODEL丹摩|基于丹摩算力的可图(Kolors)的部署与使用

Kolors是一个以生成图像为目标的人工智能系统&#xff0c;可能采用了类似于OpenAI的DALLE、MidJourney等文本生成图像的技术。通过自然语言处理&#xff08;NLP&#xff09;和计算机视觉&#xff08;CV&#xff09;相结合&#xff0c;Kolors能够根据用户提供的文本描述生成符合…

技术文档,they are my collection!

工作 今天这篇文章&#xff0c;献给一直撰写技术文档的自己。我自认为是公司中最爱写文档的人了&#xff0c;我们是一个不到40人的小公司&#xff0c;公司作风没有多么严谨&#xff0c;领导也不会要求我们写技术文档。但是从入职初至今&#xff0c;我一直保持着写技术文档…

【算法一周目】滑动窗口(2)

目录 水果成篮 解题思路 代码实现 找到字符串中所有字母异位词 解题思路 代码实现 串联所有单词的子串 解题思路 代码实现 最小覆盖子串 解题思路 代码实现 水果成篮 题目链接&#xff1a;904. 水果成篮 题目描述&#xff1a; 你正在探访一家农场&#xff0c;农场…

《AI大模型开发笔记》——Prompt提示词最佳实践

为什么需要提示词优化 什么是 Prompt enginnering&#xff1f; 提示词&#xff1a;解释一下什么是大语言模型的Prompt enginnering 图1. 什么是Prompt Enginnering&#xff1f; 通过上面ChatGPT的说明&#xff0c;我们可以看到&#xff0c;prompt工程化就是如何写prompt提示…

Linux系统三剑客之SED

sed的使用方法 sed文本处理&#xff1a;正则选定文本 -> sed进行处理 sed处理后并不会改变其内容 格式 命令行格式 sed [options] command file(s)主要参数&#xff1a; options: -e,-ncommand: 行定位&#xff08;正则&#xff09; sed命令&#xff08;操作&#xff…

C++11特性(详解)

目录 1.C11简介 2.列表初始化 3.声明 1.auto 2.decltype 3.nullptr 4.范围for循环 5.智能指针 6.STL的一些变化 7.右值引用和移动语义 1.左值引用和右值引用 2.左值引用和右值引用的比较 3.右值引用的使用场景和意义 4.右值引用引用左值及其一些更深入的使用场景分…

老旧前端项目如何升级工程化的项目

因为历史的原因存在着大量的老旧前端项目&#xff0c;而在今天的开发环境中已经不再适应了&#xff0c;于是产生了升级到新的环境的需求。比如笔者当前的一个登录页面项目&#xff0c;就是以下面为技术栈的老旧项目。 基于 jQuery包管理基于 require.js&#xff0c;甚至有的没…

Error: Invalid version flag: if 问题排查

问题描述&#xff1a; 国产化系统适配&#xff0c;arm架构的centos 在上面运行docker 启动后需要安装数据库 依赖perl 在yum install -y perl 时提示&#xff1a; “Error: Invalid version flag: if”