我是 Node 新手,正在努力使用 Nodemailer。
在 scr/pages 中我有一个 contact_us.astro 文件。
---
import Layout from '../layouts/Layout.astro';
import Header from '../components/Header.astro';
import Footer from '../components/Footer.astro';
const errors = { username: "", email: "", message: "" };
if (Astro.request.method === "POST") {
try {
const data = await Astro.request.formData();
const name = data.get("username");
const email = data.get("email");
const message = data.get("message");
if (typeof name !== "string" || name.length < 1) {
errors.username += "Please enter a username. ";
}
if (typeof email !== "string") {
errors.email += "Email is not valid. ";
}
if (typeof message !== "string") {
errors.message += "Please enter a message";
}
const hasErrors = Object.values(errors).some(msg => msg)
if (!hasErrors) {
console.log('button pressed')
//return Astro.redirect("/team");
const payload = {
name: name,
email: email,
message: message
};
fetch("../lib/nodemailer", {
method: "POST",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify(payload)
}).then(response => response.json())
.then(data => {
alert(data.message);
})
.catch(error => {
console.error(error);
});
}
} catch (error) {
if (error instanceof Error) {
console.error(error.message);
}
}
}
---
<Layout title="Meet the Madini Minerals Team">
<Header/>
<div class="page-banner">
<div class="banner-images">
<img src="/contact_us/contact_banner.jpg" alt="Banner 1">
</div>
</div>
<div class="content-container">
<div class="right-content-mustard">
<div class="text-button-container">
<p class="h1 h1-white">For any queries<br>contact us</p>
<a href=#start-text"></a><button class="custom-button">read more</button></a>
</div>
</div>
<div class="content-image">
<img src="/homepage/contact_us.jpg" alt="Contact Us Image" class="about-image">
</div>
</div>
<div class="body-container body-container-small" id="start-text">
<h1 class="h1">Contact Us</h1>
<form method="POST">
<label>
Username:
<input type="text" name="username" />
</label>
{errors.username && <p>{errors.username}</p>}
<label>
Email:
<input type="email" name="email" required />
</label>
{errors.email && <p>{errors.email}</p>}
<label>
Message:
<input type="text" name="message" />
</label>
{errors.message && <p>{errors.message}</p>}
<button>Send</button>
</form>
</script>
</div>
<Footer/>
</Layout>
在 scr/lib/ 中我有nodemailer.ts,这是我的终点
import nodemailer from 'nodemailer';
let email = import.meta.env.EMAIL
let password = import.meta.env.EMAIL_PASSWORD
console.log(password)
const transporter = nodemailer.createTransport({
service: "smtp.ledimo.co.za",
auth: {
user: email,
pass: password
}
});
export async function post({ request }) {
const data = await request.json();
const mailOptions = {
from: "[email protected]",
to: "[email protected]",
subject: 'New message from your website',
html: `<p><strong>Name:</strong>${data.name}</p>
<p><strong>Email:</strong>${data.email}</p>
<p><strong>Message:</strong>${data.message}</p>`,
};
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
let payload = {
message: "Server received your message!"
}
return {
body: JSON.stringify(payload)
};
}
当我提交表单时,出现以下错误:
TypeError:无法解析 ../lib/nodemailer 中的 URL 在Object.fetch(节点:内部/ deps/undici/undici:11576:11){ [原因]:类型错误 [ERR_INVALID_URL]:无效 URL
//nodemailer.ts
import nodemailer from "nodemailer";
interface emailFunctionProps {
email: string;
html: string;
subject: string;
text: string;
}
// SMTP (sending) server details
const smtpServer = "smtp.titan.email";
const smtpPort = 587;
// IMAP (receiving) server details
const imapServer = "imap.titan.email";
const imapPort = 993;
async function sendEmail(props: emailFunctionProps) {
let transporter = nodemailer.createTransport({
host: smtpServer,
port: smtpPort,
auth: {
user: import.meta.env.OUTLOOK_EMAIL,
pass: import.meta.env.OUTLOOK_PASSWORD,
},
});
// Message object
let message = {
from: import.meta.env.OUTLOOK_EMAIL,
to: props.email,
subject: props.subject,
text: props.text,
html: props.html,
};
let info = await transporter.sendMail(message);
console.log("Message sent successfully as %s", info.messageId);
console.log({ info });
return info;
}
export { sendEmail };
//contact_us.astro 文件内
if (Astro.request.method === "POST") {
try {
const data = await Astro.request.formData();
const name = data.get("username");
const email = data.get("email");
const message = data.get("message");
const payload = {
name: name,
email: email,
message: message
};
await sendEmail({
email: "[email protected]",
html: `<p>${JSON.stringify(payload)}</p>`,
subject: "hello",
text: "hello",
});
}