You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AstroJS联系表单调用Nodemailer接口报错:无效URL

解决Astro项目中Nodemailer接口URL解析错误问题

你的问题核心是Astro的API端点规则没搞对,src/lib是工具函数目录,不能直接作为后端接口访问,Astro只认src/pages/api/下的文件作为API端点。

修复步骤:

1. 调整Nodemailer文件位置

把src/lib/nodemailer.ts移动到src/pages/api/目录下,重命名为比如send-email.ts(文件名决定了接口路由)。

确保文件导出Astro要求的APIRoute函数,示例代码:

import type { APIRoute } from 'astro';
import nodemailer from 'nodemailer';

export const POST: APIRoute = async ({ request }) => {
  // 获取表单提交的数据
  const formData = await request.formData();
  const userEmail = formData.get('email') as string;
  const userMessage = formData.get('message') as string;

  // 配置Nodemailer传输器
  const transporter = nodemailer.createTransport({
    // 替换成你的邮箱服务配置,比如QQ邮箱、Gmail等
    host: 'smtp.qq.com',
    port: 587,
    secure: false,
    auth: {
      user: 'your-qq-email@qq.com',
      pass: 'your-qq-authorization-code',
    },
  });

  // 邮件内容配置
  const mailOptions = {
    from: `"用户反馈" <${userEmail}>`,
    to: 'your-receive-email@example.com',
    subject: '来自联系表单的新消息',
    text: `用户邮箱:${userEmail}\n消息内容:${userMessage}`,
  };

  try {
    await transporter.sendMail(mailOptions);
    return new Response(JSON.stringify({ success: true }), { status: 200 });
  } catch (err) {
    return new Response(JSON.stringify({ success: false, error: (err as Error).message }), { status: 500 });
  }
};

2. 修改表单的提交地址

在contact_us.astro里,把表单的action属性改成对应API路由,比如上面的文件是send-email.ts,路由就是/api/send-email:

<form action="/api/send-email" method="POST">
  <label>邮箱:<input type="email" name="email" required /></label>
  <label>消息:<textarea name="message" rows="5" required></textarea></label>
  <button type="submit">提交</button>
</form>

错误原因说明

你之前用../lib/nodemailer作为提交地址,Astro无法识别这个路径——src/lib目录是用于存放项目内部工具函数的,不会被Astro暴露为可访问的HTTP接口,只有src/pages/api/下的文件会被自动映射为/api/[文件名]的后端路由。

内容的提问来源于stack exchange,提问作者Sebastien Desemberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 06:28:24