- Published on
สร้างฟอร์ม Newsletter ด้วย MailGun
- Authors
- Name
- Samiti
เกริ่น
เว็บไซต์ประเภทข่าวสารและให้ความรู้ส่วนใหญ่จะมีช่องกรอกทิ้งอีเมลสำหรับอัพเดตข่าวสารฟรี ฟีเจอร์แบบนี้ปกติเสียตังขั้นต่ำ 10++ ดอลลาห์ หรือราวๆ สามร้อยกว่าบาทต่อเดือน โดยเฉพาะ MailGun
เพื่อที่เราจะมีฟีเจอร์พวกนี้ใช้ในเว็บไซต์ใช้ในเว็บไซต์ด้วย NextJS ต้องเตรียมพร้อม หรือมาขั้นตอนอะไรบ้าง มาลองวิเคราะห์กัน คือ
จำเป็นต้องมี form component ต้องดีไซน์ฟอร์มรับข้อมูลประเภท client
ส่งกลับไปยัง server 3rd party ในที่นี้ผมจะใช้ MailGun
ซึ่งการออกแบบเราจะใช้ tailwind เจ้าเก่า ในการสร้าง UI ทั้งหมด
ขั้นตอน
พิมพ์ shortcut reactJS ด้วย rafce
จากนั้นสร้างฟอร์มในส่วนของฟังชั่น 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>
- สร้างฟังชั่นสำหรับรองรับการ submit ชื่อ handleSubscription เป็นในรูปแบบ server action ดังนั้นอย่าลืม 'use server'
const handleSubscription = async (formData: FormData) => {
'use server'
const email = formData.get('email') as string
await subscription(email)
revalidatePath('/')
}
สร้าง newsletter.ts ใน folder ที่ชื่อ actions จากนั้นให้ทำขั้นตอนต่อไป
ระบุ 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,
})
- สร้างฟังชั่น 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
}
}
- และนี้คือ 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
ที่สำคัญไม่ควรลืมคือ ต้องระบุบัตร และสมัครบริการ เพราะบริการจริงๆ ไม่มีฟรี ก็เพื่อที่เราจะสามารถที่จะส่งไปทุกอีเมล ไม่งั้นเราจะส่งได้เฉพาะอีเมลที่ verified ได้เท่านั้น