logo
Published on

สร้างฟอร์ม Newsletter ด้วย MailGun

Authors
  • avatar
    Name
    Samiti
    Twitter

เกริ่น

เว็บไซต์ประเภทข่าวสารและให้ความรู้ส่วนใหญ่จะมีช่องกรอกทิ้งอีเมลสำหรับอัพเดตข่าวสารฟรี ฟีเจอร์แบบนี้ปกติเสียตังขั้นต่ำ 10++ ดอลลาห์ หรือราวๆ สามร้อยกว่าบาทต่อเดือน โดยเฉพาะ MailGun

เพื่อที่เราจะมีฟีเจอร์พวกนี้ใช้ในเว็บไซต์ใช้ในเว็บไซต์ด้วย NextJS ต้องเตรียมพร้อม หรือมาขั้นตอนอะไรบ้าง มาลองวิเคราะห์กัน คือ

  1. จำเป็นต้องมี form component ต้องดีไซน์ฟอร์มรับข้อมูลประเภท client

  2. ส่งกลับไปยัง server 3rd party ในที่นี้ผมจะใช้ MailGun

ซึ่งการออกแบบเราจะใช้ tailwind เจ้าเก่า ในการสร้าง UI ทั้งหมด

ขั้นตอน

  1. พิมพ์ shortcut reactJS ด้วย rafce

  2. จากนั้นสร้างฟอร์มในส่วนของฟังชั่น return

<section className="flex h-full flex-col items-center bg-gray-300 py-16">
  <form
    className="flex w-full max-w-[500px] flex-col items-center gap-2 py-2"
    action={handleSubscription}
    method="POST"
  >
    <h2 className="flex flex-row items-center text-2xl font-bold">
      <NewspaperIcon className="mr-3 h-11 w-11" />
      Subscribe to our Newsletter!
    </h2>
    <p className="text-gray-500">Subscribe to our newsletter and stay updated.</p>
    <input
      type="email"
      name="email"
      placeholder="Your email"
      required
      className="w-3/4 border p-2 focus-within:outline-blue-200"
    />
    <button
      role="submit"
      className="w-3/4 bg-blue-400 p-2 text-white outline-offset-2 focus:outline-blue-200"
    >
      Subscribe
    </button>
  </form>
</section>
  1. สร้างฟังชั่นสำหรับรองรับการ submit ชื่อ handleSubscription เป็นในรูปแบบ server action ดังนั้นอย่าลืม 'use server'
const handleSubscription = async (formData: FormData) => {
  'use server'

  const email = formData.get('email') as string
  await subscription(email)
  revalidatePath('/')
}
  1. สร้าง newsletter.ts ใน folder ที่ชื่อ actions จากนั้นให้ทำขั้นตอนต่อไป

  2. ระบุ API KEY พร้อมเรียก object ชื่อ Mailgun()

const API_KEY = String(process.env.MAILGUN_API_KEY) || ''
const DOMAIN = String(process.env.MAILGUN_DOMAIN) || ''

const mailgun = new Mailgun(FormData)
const client = mailgun.client({
  username: 'api',
  key: API_KEY,
})
  1. สร้างฟังชั่น subscription() เพื่อรับการยิงข้อมูลจากหน้า Frontend
export default async function subscription(email: string) {
  if (email === null) return
  const messageData = {
    from: 'Contact Form <[NAME]@[MAILGUN_ADDRESS].mailgun.org>',
    to: String(email),
    subject: 'Thank You For Your Subscription!',
    text: `
          Thank you for subscribing to our newsletter at ${email}!

          We're thrilled to have you as part of our community. 
          You'll now receive regular updates, exclusive offers, 
          and valuable insights directly to your inbox. If you ever have any questions or feedback, 
          please don't hesitate to reach out to us.

          Welcome aboard!
        `,
  }

  try {
    const mailResponse = await client.messages.create(DOMAIN, messageData)
    return mailResponse
  } catch (error) {
    console.log(error)
    return
  }
}
  1. และนี้คือ code ทั้งหมดที่ได้ทำไป อธิบายง่ายๆ คือ เรียก new MailGun() แล้วเติม API_KEY ที่สมัครจากทางเว็บไซต์ ผ่าน method ชื่อ client เสร็จแล้วเวลาส่งจะใช้ Method messages.create(DOMAIN, messageData) โดยตัวพารามิเตอร์แรกคือ mailgun โดเมน และตามด้วย object ของข้อความที่เราจะส่งไป โดยมี property คือ
  • from ส่งจากไหน
  • to ส่งไปที่อีเมลอะไร
  • subject หัวข้อที่ส่ง
  • message ข้อความ
'use server'

import Mailgun from 'mailgun.js'
import FormData from 'form-data'

const API_KEY = String(process.env.MAILGUN_API_KEY) || ''
const DOMAIN = String(process.env.MAILGUN_DOMAIN) || ''

const mailgun = new Mailgun(FormData)
const client = mailgun.client({
  username: 'api',
  key: API_KEY,
})

export default async function subscription(email: string) {
  if (email === null) return
  const messageData = {
    from: 'Contact Form <[NAME]@[MAILGUN_ADDRESS].mailgun.org>',
    to: String(email),
    subject: 'Thank You For Your Subscription!',
    text: `
          Thank you for subscribing to our newsletter at ${email}!

          We're thrilled to have you as part of our community. 
          You'll now receive regular updates, exclusive offers, 
          and valuable insights directly to your inbox. If you ever have any questions or feedback, 
          please don't hesitate to reach out to us.

          Welcome aboard!
        `,
  }

  try {
    const mailResponse = await client.messages.create(MAILGUN_DOMAIN, messageData)
    return mailResponse
  } catch (error) {
    console.log(error)
    return
  }
}

แนะนำก่อนส่งทุกครั้งให้ไปที่ send > sending > overview ตรงหัวข้อ Authorized Recipients ให้ระบุอีเมลที่ต้องการรับ

เพราะว่าจะมีคำเตือนปรากฏคือ Sandbox domains are restricted to authorized recipients only. ก็คือ

โดเมนประเภททดลองได้ถูกจำกัดเฉพาะผู้รับที่ได้รับการยืนยันแล้วเท่านั้น

แนะนำว่าหากโปรแกรมเป็นโปรดักชั่นจำเป็นต้อง Upgrade

auth email from mailgun account

ที่สำคัญไม่ควรลืมคือ ต้องระบุบัตร และสมัครบริการ เพราะบริการจริงๆ ไม่มีฟรี ก็เพื่อที่เราจะสามารถที่จะส่งไปทุกอีเมล ไม่งั้นเราจะส่งได้เฉพาะอีเมลที่ verified ได้เท่านั้น