用 Nodemailer 为你的 Next.js 项目添加邮件通讯功能

本文为翻译作品,原文链接:Automate 200+ emails daily: Nodemailer + Next.js 13 integration.

你认为任何 web 应用程序都必须具备的功能是什么?

如果你说"交流",那你就完全正确了。

Nodemailer 一个能帮你实现自动化电子邮件通讯的强大工具。

在本文中,我们将在 Next.js 13 中无缝集成 Nodemailer,向你展示如何利用 Nodemailer 的功能从 Next.js 应用程序中轻松发送电子邮件。

那么,让我们开始这次编码探险,提升 web 应用的用户体验吧!

设置 Next.js 13 项目环境

要设置 Next.js 项目,请查看这里的说明。安装过程通常包括在终端运行以下命令。

bash 复制代码
npx create-next-app@latest

安装依赖

在项目目录下打开终端,执行以下命令之一即可开始:

bash 复制代码
# 注意:@types/nodemailer 包
# 仅适用于 TS 项目。

npm install nodemailer @types/nodemailer
yarn add nodemailer @types/nodemailer
pnpm add nodemailer @types/nodemailer

设置 Gmail

在本教程中,我将使用 Gmail 作为 SMTP 服务器,但如果你有足够的信心,也可以使用其他 SMTP 服务器。

  1. 访问这个 URL,并确保在你的谷歌账户上激活了 2FA,然后继续进行第二步。我个人推荐使用验证器应用程序,因为它很容易进行验证和配置。
  2. 返回这个 URL,并滚动到页面底部,你会找到一个名为应用密码的部分。
  3. 创建一个应用程序密码,将应用程序设置为邮件,将设备设置为你喜欢的设备,我个人设置为 Windows 计算机。
  4. 点击 "生成 "并将应用密码复制到安全的地方,我们很快就会用到。

创建 Nodemailer API 路由

在创建 API 端点之前,请在 Next.js 13 项目根目录下创建一个名为 .env.local 的文件,并复制以下内容:

ini 复制代码
NODEMAILER_EMAIL=<你的谷歌邮箱>
NODEMAILER_PASSWORD=<你的应用密码>

请务必使用之前生成的应用程序密码,因为您的个人密码将无法使用。

  1. 在应用程序 app/ 目录下创建一个名为 api/ 的文件夹,其中包含一个名为 email 的子文件夹和一个名为 route.ts 的文件;结构如下:app/api/email/route.ts

  2. 复制以下代码:

javascript 复制代码
import { NextResponse, type NextRequest } from "next/server"
import nodemailer from "nodemailer"
import Mail from "nodemailer/lib/mailer"

export async function POST(request: NextRequest) {
  const { email, message } = await request.json()

  const transport = nodemailer.createTransport({
    service: "gmail",
    auth: {
      user: process.env.NODEMAILER_EMAIL,
      pass: process.env.NODEMAILER_PASSWORD,
    },
  })

  const mailOptions: Mail.Options = {
    from: process.env.NODEMAILER_EMAIL,
    to: process.env.NODEMAILER_EMAIL,
    subject: `Message from (${email})`,
    text: message,
  }

  try {
    await transport.sendMail(mailOptions)
    return NextResponse.json({ message: "成功!", status: 200 })
  } catch (err) {
    return NextResponse.json({ message: "失败!", status: 500 })
  }
}

我们等待从客户端发送的电子邮件和消息;我们将很快实现客户端。 接下来我们定义一个 transport,它在底层配置了你的 Gmail SMTP 服务器。 接下来我们配置 mailOptions(邮件选项)以发送一封电子邮件给你自己,以用户的电子邮件作为主题,以邮件内容作为正文。 最后,我们执行 sendMail 操作,并使用 try-catch 块适当地处理成功或失败。

创建联系表单

现在 API 端点已经就绪,我们需要编写客户端代码与该端点通信,从而通过 nodemailer 发送电子邮件。

app/page.tsx 中,复制以下代码:

javascript 复制代码
import ContactForm from "@/components/ContactForm"

const page = () => {
  return (
    <main className="flex grow flex-col items-center justify-center">
      <div className="space-y-4">
        <h1 className="text-4xl">联系我们</h1>
        <ContactForm />
      </div>
    </main>
  )
}

export default page
  1. 在与 app/ 目录同一级别上,创建一个名为 components/ 的文件夹,并在其中创建一个名为 ContactForm.tsx 的文件。

  2. ContactForm.tsx 复制以下代码:

javascript 复制代码
"use client"

import { useState } from "react"

function ContactForm() {
  const [email, setEmail] = useState("")
  const [message, setMessage] = useState("")

  const handleSubmit = async (e: React.FormEvent) => {
    e.preventDefault()

    await fetch("/api/email", {
      method: "POST",
      body: JSON.stringify({ email, message }),
    })
  }

  return (
    <div>
      <h2>联系我们</h2>
      <form onSubmit={handleSubmit} className="space-y-10">
        <div>
          <label>电子邮件:</label>
          <input
            type="email"
            value={email}
            onChange={(e) => setEmail(e.target.value)}
            required
          />
        </div>
        <div>
          <label>消息:</label>
          <textarea
            value={message}
            onChange={(e) => setMessage(e.target.value)}
            required
          ></textarea>
        </div>
        <button type="submit">提交</button>
      </form>
    </div>
  )
}

export default ContactForm
  • 这是一个基本表单,接收用户的电子邮件和消息。
  • 当用户提交表单时,电子邮件和消息被发送到 api/email 端点,执行 route.ts 内的代码,从而发送电子邮件。

下面是它的实际效果:

结论

就是这样!现在,您可以通过电子邮件每天自动发送邮件了。

相关推荐
小红的布丁5 分钟前
单线程 Redis 的高性能之道
redis·后端
GetcharZp10 分钟前
Go 语言只能写后端?这款 2D 游戏引擎刷新你的认知!
后端
cyclv21 分钟前
无网络地图展示轨迹,地图瓦片下载,绘制管线
前端·javascript
土豆125042 分钟前
Tauri 入门与实践:用 Rust 构建你的下一个桌面应用
前端·rust
宁瑶琴2 小时前
COBOL语言的云计算
开发语言·后端·golang
普通网友2 小时前
阿里云国际版服务器,真的是学生党的性价比之选吗?
后端·python·阿里云·flask·云计算
小陈工2 小时前
2026年4月2日技术资讯洞察:数据库融合革命、端侧AI突破与脑机接口产业化
开发语言·前端·数据库·人工智能·python·安全
IT_陈寒3 小时前
Vue的这个响应式问题,坑了我整整两小时
前端·人工智能·后端
C澒3 小时前
AI 生码:A 类生码方案架构升级
前端·ai编程
前端Hardy3 小时前
前端必看!LocalStorage这么用,再也不踩坑(多框架通用,直接复制)
前端·javascript·面试