我正在使用 astro 进行一个项目,并尝试使用 nodemailer 作为我的联系表单。这可以很好地将邮件发送到我期望的邮件。但不在生产中发送邮件。这是部署在netlify上的。
---
export const prerender = false;
import { createTransport } from "nodemailer";
import RawLayout from "../layouts/RawLayout.astro";
if (Astro.request.method === "POST") {
try {
const data = await Astro.request.formData();
const name = data.get("name");
const email = data.get("email");
const subject = data.get("subject");
const message = data.get("message");
const emailBody = `Full Name: ${name}\nEmail: ${email}\nSubject: ${subject}\n\nMessage:\n${message}`;
const transporter = createTransport({
service: "gmail",
auth: {
user: "****@gmail.com",
pass: "****",
},
});
async function main() {
const info = await transporter.sendMail({
from: "****@gmail.com", // sender address
to: "****@gmail.com", // list of receivers
subject: "📬 New Response", // Subject line
text: emailBody, // plain text body
});
}
main().catch(console.error);
} catch (error) {
if (error instanceof Error) {
console.error(error.message);
}
}
}
---
这是我的 netlify 日志:
ERROR 错误:SMTPConnection._formatError 连接超时 (/var/task/node_modules/nodemailer/lib/smtp-connection/index.js:798:19) 在 SMTPConnection._onError 处 (/var/task/node_modules/nodemailer/lib/smtp-connection/index.js:784:20) 超时时。 (/var/task/node_modules/nodemailer/lib/smtp-connection/index.js:237:22) 在 listOnTimeout (节点:内部/计时器:569:17) process.processTimers (节点:内部/定时器:512:7) { 代码: 'ETIMEDOUT',命令:'CONN'
本地开发环境没有任何问题。
您收到此错误是因为传输配置变量很可能不正确。我之前使用
service: "gmail"
时遇到过问题,但以下配置为我修复了错误:
const transporter = createTransport({
host: "smtp.gmail.com",
port: 465, // port for SSL
secure: true, // use TLS
auth: {
user: "****@gmail.com",
pass: "****",
},
});
另一件事需要注意的是,如果您启用了 2FA,您将无法使用您的个人密码 - 您必须按照此处
的详细说明生成应用程序密码