การส่งอีเมลเป็นหนึ่งในสิ่งที่เราทำกันบ่อยๆ บนเว็บไซต์ ซึ่งท่าที่โปรแกรมเมอร์ PHP ชาวไทยใช้กันบ่อยๆ ก็คือเอา SMTP ของ Gmail มาใช่ส่งเมลผ่าน SMTP ด้วยไลบรารี่อย่าง PHPMailer
ปัญหาคืออีเมลที่ส่งออกไป มันจะเป็นแอดเดรสของ Gmail ที่เราเอา SMTP มาใช้ส่ง ซึ่งความน่าเชื่อถือมันต่ำมาก และในบางครั้งที่เราต้องส่งอีเมลจำนวนมาก ก็อาจจะติดลิมิตที่ 500 อีเมลต่อวัน และไม่สามารถขยายเพิ่มได้ตามความต้องการ (เว้นแต่จะขยันมานั่งเปลี่ยน SMTP เองทุกครั้งที่มันเต็ม)
ทางออก (และควรเป็นวิธีแรกๆ ที่เลือกใช้กัน) คือการหันมาใช้บริการ transaction email อย่างเช่น Mailgun, Mailchimp Transaction Email, หรืออย่าง SendGrid ที่เราจะเขียนถึงในตอนนี้
ข้อดีของการส่งผ่านบริการ transaction email มันก็มีหลายอย่าง เช่น
- ตั้งอีเมลที่ส่งเป็นโดเมนของเราได้ เพิ่มความน่าเชื่อถือได้เยอะมาก
- ปกติแล้วจะส่งเมลเข้า inbox แน่นอน
- ถ้าต้องส่งจำนวนมาก สามารถใช้เงินแก้ปัญหา จ่ายเพื่อเพิ่มโควต้าส่งเมลได้
- ส่วนใหญ่จะมีให้เลือกทั้งการส่งผ่าน SMTP แบบเดิม (เอา SMTP, Username, และ Password ไปกรอกเหมือนที่ทำกันทุกวันนี้) หรือส่งผ่าน API เฉพาะก็ได้เช่นกัน
- ปกติบริการพวกนี้จะมีบริการด้าน marketing ต่างๆ ให้ด้วย (แน่นอนว่าเสียเงิน) เช่นการยืนยันว่าเมลปลายทางมีตัวตนจริงหรือไม่ การติดตามว่าอีเมลส่งถึงผู้รับจริงหรือไม่ รวมกับการ tracking อื่นๆ
สำหรับ SendGrid นั้น แพลนฟรีจะจำกัดการส่งไว้ที่ 100 ฉบับต่อวัน หรือถ้าใช้เยอะกว่านี้มาก ก็สามารถสมัครใช้แพลน Essential 40k ได้ที่ $14.95 ต่อเดือน จะได้โควต้าเพิ่มขึ้นมาเป็น 40,000 ฉบับต่อเดือน
การยืนยันโดเมนและตั้งค่า DNS
ขอข้ามขั้นตอนการสมัครสมาชิกมาที่ขั้นตอนการตั้งค่าเลยแล้วกันนะ
SendGrid จะมีวิธียืนยันตัวตอนสองแบบ คือแบบ Single sender ที่จะส่งเมลมาให้เรายืนยันตัวตน วิธีนี้อีเมลที่ใช้ส่งจะขึ้นเป็น <email> via sendgrid.net
เช่น [email protected] via sendgrid.net

อีกวิธีคือ Domain verification วิธีนี้จะทำให้เราสามารถส่งอีเมลในชื่อโดเมนของเราได้โดยตรง โดยไม่มี via sendgrid.net ต่อท้าย ซึ่งเราจะพามาดูวิธีนี้กัน
ขั้นแรก พอเราสมัครสมาชิกเสร็จและล็อกอินเข้ามาครั้งแรก จะเจอแบนเนอร์ให้เราเซ็ตอัพ Sender identity ให้เรากดเลือก Authenticate domain instead

ขั้นตอนต่อมาให้เราเลือกว่าเราใช้ DNS Provider เจ้าไหน อย่างผมใช้ Cloudflare ก็เลือก Cloudflare ขึ้นมา จริงๆ ตรงนี้เลือกอะไรไม่ค่อยสำคัญเท่าไหร่ มันจะแค่เลือกดึงคู่มือออกมาได้ถูกว่า provider เจ้าไหน เข้าไปแก้ตรงไหน (ถ้ามีใครยังใช้ตัวจัดการ DNS ใน DirectAdmin อยู่ ก็เข้าไปแก้ DNS Record ใน DA ได้เลย)
อีกตัวเลือกคือเป็น branded tracking คือพวกลิงก์ tracking ต่างๆ ค่าเริ่มต้นจะเป็นลิงก์ไปหา sendgrid.net การเลือก Yes ตรงนี้จะทำให้เราสามารถเปลี่ยน tracking link ไปเป็นโดเมนที่เราเลือกเองได้

พอกด Next แล้วจะให้เรากรอกโดเมนของเรา ก็ใส่โดเมนเว็บเราแล้วกด Next ไปได้เลย
จากนั้นในหน้าถัดไป เขาจะให้ DNS Record เรามาสามชุด

ถึงตรงนี้ให้เราไปที่ DNS Provider ที่เราใช้ แล้วกรอก CNAME Record ตามค่าที่เขาให้มาให้ครบทั้งสามรายการ เสร็จแล้วให้ติ๊กถูกที่ I’ve added these records แล้วกด Verify ได้เลย
ถึงตรงนี้ถ้าเรายืนยันโดเมนผ่าน ก็จะถือว่าเสร็จสมบูรณ์ พร้อมสำหรับการส่งอีเมลแล้ว
ส่งอีเมลผ่าน SMTP
มาเริ่มกันที่ท่ามาตรฐานกันก่อน นั่นคือการส่งผ่าน SMTP วิธีนี้เหมาะกับคนที่จะเปลี่ยนจาก Gmail มาใช้ SendGrid เพราะเราไม่ต้องเขียนโค้ดใหม่ แค่แก้ค่า SMTP ก็สามารถใช้ได้เลย
ให้เราไปที่เมนู Email API > Integration Guide แล้วเลือก SMTP Relay

หน้าถัดไปให้เราตั้งชื่อ API Key แล้วกด Create key จากนั้นไปแก้ค่า SMTP ให้เรียบร้อย
Server: smtp.sendgrid.net
Port: 25 หรือ 587 สำหรับส่งแบบ no-ssl หรือ 465 สำหรับส่งผ่าน ssl
Username: apikey
Password: API Key ที่กดสร้างมาเมื่อสักครู่
จากนั้นกด I’ve updated my settings แล้วกด Verify Integration ได้เลย เท่านี้ก็พร้อมใช้งาน

ขั้นตอนนี้เราก็แค่ลองให้เว็บแอพของเรามันส่งอีเมลดูว่าส่งได้หรือเปล่า ถ้าส่งได้ก็กลับมากด Verify Integration ก็เป็นอันเสร็จสมบูรณ์
ส่งอีเมลผ่าน Web API
พูดกันสั้นๆ ก็คือการส่งอีเมลผ่าน Web API นั้นเร็วกว่าและประหยัดแบนด์วิดกว่าการส่งด้วย SMTP เพราะเซิร์ฟเวอร์เว็บเราไม่ต้องคุยกับเซิร์ฟเวอร์ SMTP หลายครั้ง เรายิงแพ็คเก็ตไปหา API แล้วรอ API ตอบสถานะกลับมาอย่างเดียว จบ
การส่งผ่าน Web API จะมีขั้นตอนเพิ่มขึ้นมาเล็กน้อย วิธีนี้จะเหมาะกับคนที่เริ่มสร้างเว็บแอพใหม่ตั้งแต่ต้น ซึ่งทาง SendGrid ก็เตรียม Library เอาไว้ให้เลือกหลายภาษามาก ทั้ง Node.js, Python, C#, Go, cURL และแน่นอนรวมถึง PHP ด้วย
ขั้นแรกให้เราสร้างไฟล์ sendgrid.env
เอาไว้ที่ root directory ของเว็บเรา ในไฟล์ให้ใส่เป็นดังนี้
export SENDGRID_API_KEY='YOUR_API_KEY'
และอย่าลืมเพิ่ม sendgrid.env
เข้าไปใน .gitignore
ด้วยล่ะ
จากนั้นให้เราติดตั้งแพ็คเกจ sendgrid/sendgrid
ลงในโปรเจ็กท์ของเราผ่าน composer
composer require sendgrid/sendgrid
หรือถ้าไม่ได้ใช้ composer ก็ไปดาวน์โหลดแพ็คเกจเวอร์ชันล่าสุดมาจาก GitHub แล้ว require ไฟล์ sendgrid-php.php
เข้ามา ก็สามารถเริ่มใช้งานได้ทันที
วิธีส่งก็ง่ายๆ ตาม example code ที่เขาเตรียมไว้ให้ได้เลย
<?php require 'vendor/autoload.php'; // If you're using Composer (recommended) // Comment out the above line if not using Composer // require("<PATH TO>/sendgrid-php.php"); // If not using Composer, uncomment the above line and // download sendgrid-php.zip from the latest release here, // replacing <PATH TO> with the path to the sendgrid-php.php file, // which is included in the download: // https://github.com/sendgrid/sendgrid-php/releases $email = new \SendGrid\Mail\Mail(); $email->setFrom("[email protected]", "Example User"); $email->setSubject("Sending with SendGrid is Fun"); $email->addTo("[email protected]", "Example User"); $email->addContent("text/plain", "and easy to do anywhere, even with PHP"); $email->addContent( "text/html", "<strong>and easy to do anywhere, even with PHP</strong>" ); $sendgrid = new \SendGrid(getenv('SENDGRID_API_KEY')); try { $response = $sendgrid->send($email); print $response->statusCode() . "\n"; print_r($response->headers()); print $response->body() . "\n"; } catch (Exception $e) { echo 'Caught exception: '. $e->getMessage() ."\n"; }
ส่วนใครที่ใช้ภาษาอื่นที่ไม่มีไลบรารี่ของ SendGrid ก็สามารถยิงผ่าน API โดยตรงได้เลย
Leave a Reply