ไม่กี่วันก่อน ผมตัดสินใจทำโปรเจกต์ Vue เรียบง่าย และต้องส่งอีเมลผ่าน contact form ที่เพิ่งสร้าง ผมอยากได้อีเมลอัตโนมัติทุกครั้งที่มีคนกรอก contact form
ค้นหาแล้วเจอ EmailJS ตัดสินใจเขียนบทความนี้เพราะ documentation ของพวกเขาดีและใช้ง่ายมาก หวังว่าจะช่วยใครบางคนได้ :)
เริ่มต้นกันเลย!
ในบทความนี้ จะแสดงวิธีใช้ EmailJS ส่งอีเมลจากแอปพลิเคชัน Vue.js
ก่อนเริ่ม สมมติว่าคุณติดตั้ง Vue CLI แล้ว เพราะจะสร้าง mini demo project ด้วย ถ้ายัง ให้เช็ควิธีติดตั้งที่นี่
สร้างโปรเจกต์ด้วยคำสั่ง:
vue create vue-emailjs-demo
จะถูก prompt ให้เลือก default preset หรือ manually select features เลือก default
โฟลเดอร์โปรเจกต์ใหม่จะถูกสร้าง เข้าไปได้ด้วย:
cd vue-emailjs-demo
วิธีติดตั้ง EmailJS
EmailJS ช่วยส่งอีเมลด้วย client-side technologies เท่านั้น ไม่ต้องมีเซิร์ฟเวอร์ - เพียงเชื่อม EmailJS กับบริการอีเมลที่รองรับ สร้าง email template และใช้ JavaScript library ของพวกเขา trigger อีเมล
ก่อนเขียนโค้ด ต้องสร้างบัญชี EmailJS ด้วยบัญชีนี้ จะสร้าง email templates และเลือกอีเมลปลายทางได้
ล็อกอินเข้า dashboard ใหม่
วิธีสร้าง Email Template
Email templates สามารถมี dynamic variables ได้ในเกือบทุกฟิลด์ (subject, content, TO email, FROM name ฯล฿) ถูก populate จาก JavaScript call เราจะกลับมาที่นี้
ก่อนอื่น เพิ่ม email service ผมเลือก Gmail แต่คุณเลือกได้ตามต้องการ
ถ้าไม่อยากคิดชื่อ Service ID เอง กดไอคอนค้นหา จะ generate ให้อัตโนมัติ
ต่อไป สร้าง email template ไปที่หน้า templates สร้าง template ใหม่ template จะกำหนด subject เนื้อหา ส่งไปไหน ฯล฿
ชุด double curly braces เช่น {{from_name}} คือ variables เมื่อ user กรอกฟอร์ม เราจะส่งข้อมูลนั้นไป EmailJS ผ่าน variables เหล่านี้
อธิบายฟิลด์ใน template:
- Subject: หัวข้ออีเมล
- Content: เนื้อหาอีเมล จะส่ง user message, ชื่อ, และ return address
- To Email: อีเมลปลายทาง
- From Name: ออปชั่น แต่วางชื่อได้
- From Email: อีเมลผู้ส่งที่จะแสดงให้ผู้รับ ถ้า checkbox default email เปิด EmailJS จะใช้อีเมลของ email service ที่ใช้
- Reply To: ตั้งอีเมลสำหรับตอบกลับ
- BCC และ CC: ส่ง copy ให้ทุกคนในรายการ
Reply To,BCC และ CCไม่ใช้ในคู่มือนี้ เพื่อความเรียบง่าย ต้องการรายละเอียดเพิ่ม เช็ค EmailJS docs
หมายเหตุ: จะใช้ Service ID, Template ID และ User ID หา User ID ได้ที่ส่วน integration ของ dashboard copy ไปเก็บไว้ใช้
วิธีติดตั้ง EmailJS ในแอปพลิเคชัน
ไปที่โค้ด :) ติดตั้ง EmailJS:
npm install emailjs-com --save
จะส่งอีเมลจาก contact form เรียบง่าย เก็บ: name (ผู้ส่ง), email (ผู้ส่ง), และ message content
แก้ไข HelloWorld.Vue component ที่สร้างอัตโนมัติ หรือสร้าง component ใหม่ ContactForm.vue ผมจะทำตัวหลัง
สร้าง component ContactForm.vue:
เริ่มจาก template:
<template>
<div class="container">
<form>
<label>Name</label>
<input type="text" v-model="name" name="name" placeholder="Your Name" >
<label>Email</label>
<input type="email" v-model="email" name="email" placeholder="Your Email" >
<label>Message</label>
<textarea name="message" v-model="message" cols="30" rows="5" placeholder="Message">
</textarea>
<input type="submit" value="Send">
</form>
</div>
</template>
อธิบาย markup ของเรา
สร้าง div container สำหรับฟอร์ม เพิ่ม class container เพื่อ styling
<style scoped>
* {box-sizing: border-box;}
.container {
display: block;
margin:auto;
text-align: center;
border-radius: 5px;
background-color: #f2f2f2;
padding: 20px;
width: 50%;
}
label { float: left; }
input[type=text], [type=email], textarea {
width: 100%;
padding: 12px;
border: 1px solid #ccc;
border-radius: 4px;
box-sizing: border-box;
margin-top: 6px;
margin-bottom: 16px;
resize: vertical;
}
input[type=submit] {
background-color: #4CAF50;
color: white;
padding: 12px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
input[type=submit]:hover {
background-color: #45a049;
}
</style>
เริ่มเซิร์ฟเวอร์:
npm run serve
เปิด browser ไป localhost:8080 จะเห็นฟอร์ม:
สร้าง method sendEmail จัดการ submit ข้อมูล แต่ก่อน import emailjs:
import emailjs from 'emailjs-com';
โค้ดส่วนที่เหลือใน script:
<script>
export default {
name: 'ContactUs',
data() {
return {
name: '',
email: '',
message: ''
}
},
methods: {
sendEmail(e) {
try {
emailjs.sendForm('YOUR_SERVICE_ID', 'YOUR_TEMPLATE_ID', e.target, 'YOUR_USER_ID', {
name: this.name,
email: this.email,
message: this.message
})
} catch(error) {
console.log({error})
}
// Reset form fields
this.name = ''
this.email = ''
this.message = ''
},
}
}
</script>
โค้ดนี้ทำอะไร
ใช้ try...catch แต่ไม่บังคับ จำได้ไหมว่าขอให้ copy Service ID, Template ID, User ID ไปเก็บ? ตอนนี้ต้องใช้แล้ว! แทนที่ส่วน snippet ด้วยรายละเอียดจริง
emailjs.sendForm() ส่งข้อมูลไป EmailJS หลังส่ง Service ID, Template ID, User ID และ form data ที่ส่งเข้ามาใน sendEmail() log error ด้วย catch()
สำคัญ: sendForm() ส่งอีเมลตาม email template ที่ระบุและ form data ที่ส่งผ่าน ต้องแน่ใจว่า form input name ตรงกับ variable ใน EmailJS template
EmailJS template ที่ปรับแล้วพร้อม name, email, message:
เสร็จแล้ว!
เช็ค To Email ใน template ควรได้อีเมลแล้ว ลองเล่น Test it หรือ playground มุมขวาบนของ template ได้
GitHub Repo
โค้ดบทความนี้อยู่ใน GitHub ของผม
แชร์บทความนี้ได้ถ้าช่วยได้ ขอบคุณที่อ่าน!