AstroJS 与 Nodemailer 的联系表

问题描述 投票:0回答:1

我是 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 astrojs
1个回答
0
投票

//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",
      });

}
© www.soinside.com 2019 - 2024. All rights reserved.