หากคุณเคยดูคำขอความคิดเห็น (RFC) เกี่ยวกับการส่งและรับอีเมล คุณจะเห็นปัญหาทางเทคนิคที่เกี่ยวข้องเมื่อกดปุ่มส่งในกล่องจดหมายอีเมลของคุณ
โชคดีที่เครื่องมือที่มีอยู่จำนวนมากให้บริการ Simple Mail Transfer Protocol (SMTP) สำหรับนักพัฒนาของเรา ตั้งแต่เซิร์ฟเวอร์ Postfix ที่คุณจัดการไปจนถึงบริการส่งที่ปรับขนาดได้เต็มรูปแบบ เช่น SendGrid, Amazon SES หรือ Postmark อย่างไรก็ตาม การย้ายระหว่างผู้ให้บริการด้วยเหตุผลด้านการส่งมอบหรือการกำหนดราคาหมายถึงการเขียนใหม่หรือการปรับโครงสร้างแอปของเราใหม่เพื่อให้ตรงตามลักษณะเฉพาะของแต่ละบริการ
Rails ช่วยเราด้วยการจัดหา Action Mailbox ในโพสต์นี้ เราจะเจาะลึกถึงวิธีที่คุณสามารถใช้กล่องจดหมายการดำเนินการเพื่อผสานรวมและแก้ไขปัญหาอีเมลขาเข้า
แต่ก่อนอื่น เรามากำหนดกันก่อนว่า Action Mailbox คืออะไร
Action Mailbox สำหรับ Rails คืออะไร
Action Mailbox ใช้การบีบอัดแนวคิดเพื่อรับอีเมลใน Ruby on Rails การบีบอัดแนวคิดหมายความว่าจะสรุปความแตกต่างเล็กๆ น้อยๆ ทั้งหมดระหว่างบริการ SMTP ทั้งหมด และเขียนโค้ดประมวลผลขาเข้าของคุณเพียงครั้งเดียว คุณยังสามารถเขียนผู้ให้บริการสำหรับบริการใหม่ได้
แนวคิดหลักของ ActionMailbox คือการกำหนดเส้นทางตามผู้รับอีเมล ด้วยการตั้งค่าผู้ให้บริการอีเมลขาเข้า เมลที่ส่งไปยังโดเมนจะถูกส่งไปยังแอปของคุณ คุณสามารถดูที่อยู่ผู้รับเพื่อพิจารณาว่าควรประมวลผลข้อความอีเมลแต่ละข้อความอย่างไร
หากคุณดำเนินการตามการดำเนินการของตัวนำ Rails เพื่อส่งอีเมลทดสอบ ดังที่ฉันมีที่นี่:

จากนั้นอีเมลขาเข้าของคุณจะมีผู้รับจาก 01 , 14รหัส> , 20รหัส> และ 34 ฟิลด์
แต่ละที่อยู่ได้รับการทดสอบเพื่อกำหนดเส้นทางที่จะกำหนดเส้นทาง แต่ข้อความอีเมลจะถูกส่งเพียงครั้งเดียวเท่านั้น
สิ่งสำคัญประการหนึ่งของการพัฒนาคือการทดสอบอีเมลจากระบบของคุณ Rails มีชุดหน้าการพัฒนาภายใต้เส้นทาง 41 ที่ช่วยให้คุณสามารถป้อนอีเมลในเครื่องลงในการตั้งค่าการพัฒนาของคุณได้
คุณสามารถป้อนอีเมลด้วยตนเอง เช่นเดียวกับที่ฉันทำในตัวอย่างด้านบน หรือคุณสามารถอัปโหลดอีเมลที่มีส่วนหัวทั้งหมด
วิธีที่ดีในการรับอีเมลฉบับสมบูรณ์ (พร้อมส่วนหัว เนื้อหาข้อความ และไฟล์แนบ) คือการใช้โปรแกรมรับส่งเมล เช่น Thunderbird บันทึกอีเมลแต่ละฉบับใน 52 เปิดไฟล์ด้วยโปรแกรมแก้ไขข้อความ และคัดลอกเนื้อหาทั้งหมดลงในหน้าตัวนำ
ตอนนี้คุณสามารถทดสอบการประมวลผลอีเมลที่ซับซ้อนมากขึ้นได้แล้ว
การโพสต์และแสดงความคิดเห็นการสาธิตสำหรับแอป Rails
เรามารวบรวมการสาธิตเล็กๆ น้อยๆ เพื่อแสดงให้เห็นว่าทั้งหมดนี้ทำงานอย่างไร ฉันเป็นแฟนตัวยงของ 37Signals และฉันชอบบล็อกของพวกเขาที่มี Hey World เป็นพิเศษ แต่พวกเขาไม่อนุญาตให้แสดงความคิดเห็น ดังนั้นเรามาสร้างโคลนที่มีความคิดเห็นสำหรับโพสต์บล็อกแต่ละรายการกันดีกว่า
ติดตามโค้ดได้ในโพสต์นี้
สร้างแอปใหม่ (ฉันใช้ Tailwind CSS แต่คุณสามารถเลือกสิ่งที่เหมาะสมกับคุณได้) ฉันจะเพิ่มข้อความการดำเนินการสำหรับ 67 ด้วย และ 75รหัส> โมเดล
โครงสร้างช่วยให้เราสามารถดูโพสต์และความคิดเห็นได้อย่างรวดเร็ว เพิ่มการเชื่อมโยงใน 84 และโพสต์จะแสดงความคิดเห็นที่เกี่ยวข้อง:
ใน 93 มาเพิ่มความคิดเห็นบางส่วนกัน:
ขณะนี้เรามีมุมมองโพสต์และความคิดเห็นแบบกระจัดกระจาย ตั้งค่าอีเมลขาเข้าสำหรับการโพสต์ไปที่บล็อก:
สิ่งนี้จะสร้าง 106 . เราจะกำหนดเส้นทางเพื่อให้ทุกอย่างสำหรับ 116 ไปที่กล่องจดหมายโพสต์ของเราและสร้างโพสต์
คุณสามารถทดสอบได้อย่างรวดเร็วโดยไปที่ 120 และส่งอีเมลบางส่วนไปยังบริการของคุณ หากคุณส่งบางสิ่งไปที่ 134 อีเมลควรถูกส่งไปยังกล่องจดหมายในแอปของเรา หากคุณส่งอีเมลไปยังที่อยู่อื่น ข้อความนั้นจะถูกตีกลับ
รับอีเมลพร้อมกล่องจดหมาย
มาตั้งค่า Post Mailbox เพื่อรับอีเมลและโพสต์ไปที่บล็อกกัน แต่ละกล่องจดหมายสามารถเข้าถึงต้นฉบับ 149 และ 150 วัตถุ InboundEmail เป็นตัวล้อมรอบ 169 คลาสที่ใช้ตลอดราง
เพื่อวัตถุประสงค์ของเรา เราสนใจว่าอีเมลนี้มาจากใคร หัวเรื่อง และสำเนาเนื้อหาของอีเมล เราสามารถแยกสิ่งเหล่านี้และสร้าง 172 บันทึกที่จะปรากฏในหน้าแรกของบล็อกของเรา
ส่งอีเมลอีกฉบับไปยังที่อยู่บล็อกของคุณ จากนั้นรีเฟรชหน้าดัชนี คุณควรเห็นโพสต์!
ตอนนี้เพื่อเพิ่มความคิดเห็นสำหรับโพสต์ ขั้นแรก ผู้แสดงความคิดเห็นทางอีเมลจะต้องอ้างอิงถึงโพสต์ที่ถูกต้องเมื่อส่งอีเมล วิธีง่ายๆ ในการทำเช่นนี้คือการเข้ารหัสรหัสโพสต์ในที่อยู่อีเมลขาเข้า (เช่น 182 โดยที่ 123 ในที่อยู่อีเมลอ้างถึงองค์ประกอบโพสต์)
สร้าง 195 :
เพิ่มเส้นทางใน Action Mailbox เพื่อส่งอีเมลด้วย 209 ไปที่ 210 :
ใน 221 เพิ่มลิงก์เพื่อสร้างที่อยู่อีเมล เพื่อให้ผู้อื่นสามารถเปิดแอปอีเมลของตนและส่งอีเมลได้:
อีเมลขาเข้าจะถูกส่งไปยัง 233 และแยกวิเคราะห์เป็นความคิดเห็นที่แนบมากับโพสต์บล็อกที่ถูกต้อง
242รหัส> วิธีการสร้างความคิดเห็นจากเนื้อหาอีเมลและอีเมลของผู้ส่ง โดยอ้างอิงถึง 258 สอบถามใน 261 วิธีการ วิธีนี้จะรับที่อยู่อีเมลของผู้รับรายแรกและใช้นิพจน์ทั่วไปเพื่อดึงรหัสโพสต์ออกมา
ถ้า 275 ไม่มีอยู่หรือไม่สามารถแยกวิเคราะห์โทเค็นได้ อีเมลตีกลับ ซึ่งจะหยุดการประมวลผล
ตอนนี้ไปที่แบบฟอร์มตัวนำ Rails และส่งความคิดเห็นไปยังที่อยู่ของแต่ละโพสต์ ความคิดเห็นจะปรากฏใต้โพสต์ในหน้าดัชนี!
ตัวอย่างที่ซับซ้อนมากขึ้นโดยใช้กล่องจดหมายการดำเนินการ
อีเมลมีความซับซ้อนจริงๆ ลองจินตนาการว่าคุณได้ตั้งค่าเครื่องมือตรวจสอบแอปพลิเคชัน แล้วปรับใช้สิ่งนี้กับแอปของคุณ และคุณเริ่มเห็นข้อผิดพลาดในแดชบอร์ด APM ของคุณ
คุณอาจเห็นข้อผิดพลาดในการแยกวิเคราะห์ หรือโพสต์/ความคิดเห็นมีข้อผิดพลาดในการจัดรูปแบบแปลกๆ มากมาย
แอปของคุณได้รับอีเมล HTML และคุณนำแหล่งที่มาของ Raw Body มาโพสต์บนเว็บไซต์ Mail gem ช่วยให้เราเห็นว่าอีเมลขาเข้ามีเนื้อหา HTML หรือไม่ และเราสามารถดึงส่วนใดก็ได้จากข้อความที่เราต้องการ
มาเปลี่ยน 288 กันดีกว่า และ 292รหัส> เพื่อตรวจสอบอีเมลที่มีหลายส่วนและดึงส่วน HTML ออกมา โดยถอยกลับไปเป็นข้อความหากเหลือเพียงสิ่งเดียว
อีเมลแต่ละฉบับไม่มีส่วนหรือหลายส่วน ลำดับที่ต้องการคือดูว่ามีส่วน HTML และใช้งานหรือไม่ และหากไม่มี ให้ลองรับและใช้ส่วนข้อความ หากไม่มีการแยกวิเคราะห์ HTML หรือส่วนข้อความ เราจะใช้เนื้อหาอีเมลเหมือนเมื่อก่อน
301รหัส> ตอนนี้ซับซ้อนขึ้นเล็กน้อย:
319รหัส> ยังมีวิธีกระบวนการที่แตกต่างกัน:
ตอนนี้เราสามารถจัดการอีเมลที่มาจากโทรศัพท์ของใครบางคนได้แล้ว
การเพิ่มกล่องจดหมายการดำเนินการไปยังแอป Rails ของคุณ
ขอบคุณ Action Mailbox ที่ทำให้เราสามารถพิจารณาอีเมลเป็นช่องทาง I/O อื่นสำหรับแอป Rails ของเรา เราสามารถเขียนโค้ดโดยไม่ขึ้นกับผู้ให้บริการอีเมลได้โดยใช้การบีบอัดแนวคิด ฉันยังสามารถย้ายผู้ให้บริการอีเมลได้โดยใช้เวลาเพียงเล็กน้อย เนื่องจากฉันไม่ต้องกังวลเกี่ยวกับโครงสร้างพื้นฐานที่สำคัญ
เครื่องมือ APM เช่น AppSignal ยังมีแดชบอร์ดที่สะดวกสบายในการตรวจสอบ ActionMailers ขาออกทั้งหมดของคุณและคอยติดตามความสามารถในการส่งมอบ
นี่คือตัวอย่างที่แสดงหนึ่งในแอปของฉันที่ส่งและรับอีเมลจำนวนมาก:

วิธีนี้ช่วยให้คุณมองเห็นสิ่งที่เกิดขึ้นภายในแอปของคุณได้มากขึ้น
สรุป
ในโพสต์นี้ ก่อนอื่นเราได้กำหนดความสามารถของ Action Mailer for Rails จากนั้นเราได้จัดทำโครงการสาธิตโดยผสานรวมอีเมลขาเข้าและแยกวิเคราะห์เพื่อสร้างโพสต์สำหรับบล็อก
ฉันหวังว่าคุณจะพบว่าสิ่งนี้มีประโยชน์ ขอให้สนุกกับการเขียนโค้ด!
ปล. หากคุณต้องการอ่านโพสต์ Ruby Magic ทันทีที่เผยแพร่ สมัครรับจดหมายข่าว Ruby Magic ของเราและไม่พลาดแม้แต่โพสต์เดียว! ป>
จอห์น บีตตี้
John ผู้เขียนรับเชิญของเราได้เรียนรู้ Rails เพื่อสร้าง API สำหรับแอพ iPhone ในปี 2010 และเขาไม่ได้มองย้อนกลับไป ปัจจุบันเขาสอนการเขียนโปรแกรมให้กับนักเรียนมัธยมปลาย สร้างซอฟต์แวร์ที่กำหนดเองสำหรับโรงเรียน และเขียนบล็อก
บทความทั้งหมดโดย John Beatty