使用 Node.js 和 163 邮箱发送邮件

使用 Node.js 和 163 邮箱发送邮件:从零开始的教程

准备工作

在开始之前,你需要做几件事:

  1. 安装 Node.js : 如果你还没装,可以去 Node.js 官网 下载安装。
  2. 安装 Nodemailer: 这是我们用来发送邮件的利器,后面会详细介绍。
  3. 163 邮箱配置: 你需要一个 163 邮箱账号,并且开启 SMTP 服务,获取授权码。
163 邮箱 SMTP 配置
  • 登录你的 163 邮箱(网页版)。
  • 进入「设置」->「POP3/SMTP/IMAP」。
  • 勾选开启 SMTP 服务,系统会提示你设置一个授权码(不是邮箱密码),记下来,一会儿要用。
动手写代码

好了,准备工作就绪,我们开始写代码吧!

步骤 1: 初始化项目

创建一个新文件夹(比如 email-demo),然后在终端运行以下命令初始化 Node.js 项目:

bash 复制代码
mkdir email-demo
cd email-demo
npm init -y

这会生成一个 package.json 文件。

步骤 2: 安装 Nodemailer

在同一目录下,安装 Nodemailer:

bash 复制代码
npm install nodemailer
步骤 3: 编写发送邮件的代码

新建一个文件,比如 sendEmail.js,然后输入以下代码:

javascript 复制代码
const nodemailer = require('nodemailer');

// 配置 SMTP 传输器
const transporter = nodemailer.createTransport({
    host: 'smtp.163.com',       // 163 邮箱 SMTP 服务器
    port: 465,                  // SSL 端口
    secure: true,               // 使用 SSL
    auth: {
        user: 'your_email@163.com',  // 你的 163 邮箱地址
        pass: 'your_auth_code'       // 前面获取的授权码
    }
});

// 发送邮件的函数
async function sendMail() {
    try {
        const info = await transporter.sendMail({
            from: '"博主小助手" <your_email@163.com>', // 发件人显示名和邮箱
            to: 'recipient@example.com',               // 收件人邮箱
            subject: '来自 Node.js 的问候',             // 邮件主题
            text: '你好!这是一封用 Node.js 发送的测试邮件!', // 纯文本内容
            html: '<p>你好!这是一封用 <b>Node.js</b> 发送的测试邮件!</p>' // HTML 内容
        });
        console.log('邮件发送成功:', info.response);
    } catch (error) {
        console.log('邮件发送失败:', error);
    }
}

// 执行发送
sendMail();
代码解析
  • SMTP 配置 : host 是 163 的 SMTP 服务器地址,port: 465 表示使用 SSL 加密,auth 里填入你的邮箱和授权码。
  • 邮件内容 : from 是发件人,to 是收件人,subject 是主题,text 和 html 分别定义纯文本和 HTML 格式的邮件内容。
  • 异步发送 : 使用 async/await 确保邮件发送过程清晰且易于处理错误。
步骤 4: 运行代码

在终端运行:

bash 复制代码
node sendEmail.js

如果一切正常,你会看到"邮件发送成功"的消息,收件人也会收到邮件!

加点料:发送验证码

假如你想发送验证码(比如注册验证),可以稍微改一下代码:

javascript 复制代码
const nodemailer = require('nodemailer');

// 生成 6 位验证码
function generateCode() {
    return Math.floor(100000 + Math.random() * 900000).toString();
}

const transporter = nodemailer.createTransport({
    host: 'smtp.163.com',
    port: 465,
    secure: true,
    auth: {
        user: 'your_email@163.com',
        pass: 'your_auth_code'
    }
});

async function sendVerificationEmail(toEmail) {
    const code = generateCode();
    try {
        const info = await transporter.sendMail({
            from: '"验证码服务" <your_email@163.com>',
            to: toEmail,
            subject: '你的验证码',
            html: `
                <h2>验证码</h2>
                <p>你的验证码是:<strong style="color: #ff4d4f;">${code}</strong></p>
                <p>5 分钟内有效,请尽快使用!</p>
            `
        });
        console.log('验证码邮件发送成功:', info.response);
        return code; // 返回验证码用于后续验证
    } catch (error) {
        console.log('发送失败:', error);
        return null;
    }
}

// 测试发送
(async () => {
    const result = await sendVerificationEmail('recipient@example.com');
    if (result) {
        console.log('生成的验证码:', result);
    }
})();

运行后,收件人会收到一个带验证码的邮件,控制台也会显示生成的验证码。

注意事项
  1. 授权码安全 : 不要把邮箱和授权码直接写在代码里,建议用环境变量(比如 dotenv 包)管理。

    • 安装 dotenv: npm install dotenv

    • 创建 .env 文件:

      复制代码
      EMAIL_USER=your_email@163.com
      EMAIL_PASS=your_auth_code
    • 修改代码:

      javascript 复制代码
      require('dotenv').config();
      const transporter = nodemailer.createTransport({
          host: 'smtp.163.com',
          port: 465,
          secure: true,
          auth: {
              user: process.env.EMAIL_USER,
              pass: process.env.EMAIL_PASS
          }
      });
  2. 发送频率: 163 邮箱有发送限制,大量发送可能被暂时封禁,建议用于测试或小规模应用。

  3. 错误排查: 如果发送失败,检查邮箱、授权码是否正确,或者网络是否被防火墙拦截。

总结

通过 Node.js 和 Nodemailer,我们可以轻松利用 163 邮箱的 SMTP 服务发送邮件。无论是简单的测试邮件,还是带验证码的动态邮件,这个方法都非常实用。希望这篇教程能帮到你,快去试试吧!有问题欢迎留言交流~

相关推荐
PegasusYu24 分钟前
Node.js使用nedb轻量级数据库测试脚本
数据库·electron·node.js·脚本·测试·轻量级·nedb
WebInfra3 小时前
Rsdoctor 2.0 发布:Agent 驱动的全自动优化工具
前端·javascript·node.js
DevUp16 小时前
标着 JavaScript 的 Wiki 与知识库:既不是 CMS 也不是 SSG(番外三)
javascript·node.js·cms
毕业设计70317 小时前
(免费领源码)基于node的学生公寓管理系统06412- java、PHP、python、C#、小程序、大数据、单片机、网络工程等)
vue.js·mysql·node.js·maven·mybatis·express·b/s
damoluomu1 天前
SSG 的后台怎么补:Node.js 生态里的三条路(番外二)
javascript·css·typescript·node.js·html
花开富贵城1 天前
使用fnm安装node.js包管理器
node.js
濮水大叔2 天前
NestJS Dynamic Providers 与 Cabloy/Vona Provider Scene:同接口多实现的两种装配哲学
typescript·node.js·nestjs
silvamux_2 天前
Node.js 调用大模型 API 排错实录
node.js
Amumu121382 天前
NodeJs介绍
前端·node.js
孟陬2 天前
利用 TypeScript `asserts` function 语法定制一个类型缩窄的 `assertIncludes`
typescript·node.js