用 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 内的代码,从而发送电子邮件。

下面是它的实际效果:

结论

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

相关推荐
骑着bug的coder4 分钟前
第10讲:并发场景优化——锁机制与死锁解决
后端·mysql
青梅主码4 分钟前
CB Insights最新发布《人工智能编程代理市场份额报告:2025 年 12 月》:Cursor 被誉为当下最强的 AI 代码编辑器 Claude Code
后端
hongkid5 分钟前
React Native 如何打包正式apk
javascript·react native·react.js
李少兄8 分钟前
简单讲讲 SVG:前端开发中的矢量图形
前端·svg
这是程序猿8 分钟前
基于java的SpringBoot框架医院药品管理系统
java·开发语言·spring boot·后端·spring·医院药品管理系统
前端小万9 分钟前
告别 CJS 库加载兼容坑
前端·前端工程化
恋猫de小郭9 分钟前
Flutter 3.38.1 之后,因为某些框架低级错误导致提交 Store 被拒
android·前端·flutter
JarvanMo13 分钟前
Flutter 需要 Hooks 吗?
前端
武子康15 分钟前
大数据-203 scikit-learn 决策树剪枝参数:max_depth/min_samples_leaf 到 min_impurity_decrease
大数据·后端·机器学习
回家路上绕了弯20 分钟前
Resilience4j全面指南:轻量级熔断限流框架的实战与落地
分布式·后端