วิธีรับอีเมลด้วย Flask Framework สำหรับ Python

เผยแพร่แล้ว: 2020-04-30

แม้ว่าจะมีบทช่วยสอนมากมายบนอินเทอร์เน็ตเกี่ยวกับการส่งอีเมล แต่ก็มีวิธีกำหนดค่าแอปพลิเคชันให้รับและดำเนินการน้อยมาก นี่เป็นงานที่ยากอย่างเหลือเชื่อหากคุณพยายามตั้งค่าทุกอย่างด้วยตัวเอง แต่มันง่ายพอๆ กับการรับคำขอทางเว็บเมื่อใช้ ฟีเจอร์ Inbound Parse ของ Twilio SendGrid

ในบทช่วยสอนสั้นๆ นี้ คุณจะได้เรียนรู้วิธีให้ Twilio SendGrid ส่งต่ออีเมลของคุณโดยตรงไปยังเว็บแอปพลิเคชันของคุณ โดยใช้ Python และเฟรมเวิร์กเว็บ Flask

ความต้องการ

ข้อกำหนดเหล่านี้คือข้อกำหนดในการทำให้บทช่วยสอนนี้สมบูรณ์:

  • Python 3: หากระบบปฏิบัติการของคุณไม่มีล่าม Python 3 คุณสามารถไปที่ python.org เพื่อดาวน์โหลดตัวติดตั้ง
  • บัญชี Twilio SendGrid: หากคุณเพิ่งเริ่มใช้ Twilio SendGrid คุณสามารถ สร้างบัญชีฟรี ซึ่งจะทำให้คุณสามารถส่งอีเมลได้ 100 ฉบับต่อวันตลอดไป
  • โดเมนที่คุณจะได้รับอีเมล: ตลอดบทความ นี้ ฉันจะใช้ yourdomainhere.com คุณจะต้องแทนที่ด้วยชื่อโดเมนของคุณเอง
  • ngrok : เราจะใช้ยูทิลิตี้ที่มีประโยชน์นี้เพื่อเชื่อมต่อแอปพลิเคชัน Flask ที่ทำงานอยู่ในคอมพิวเตอร์ของคุณกับ URL สาธารณะที่ SendGrid สามารถส่งคำขอได้ นี่เป็นสิ่งจำเป็นสำหรับเวอร์ชันการพัฒนาของแอปพลิเคชัน เนื่องจากคอมพิวเตอร์ของคุณมักจะอยู่หลังเราเตอร์หรือไฟร์วอลล์ ดังนั้นจึงไม่สามารถเข้าถึงได้โดยตรงบนอินเทอร์เน็ต หากคุณไม่ได้ติดตั้ง ngrok คุณสามารถ ดาวน์โหลดสำเนาสำหรับ Windows, MacOS หรือ Linux

การตรวจสอบโดเมน

ก่อนที่ Twilio SendGrid จะสามารถรับอีเมลบนโดเมนของคุณ คุณต้อง ตรวจสอบสิทธิ์ เพื่อให้ Twilio SendGrid รู้ว่าโดเมนอยู่ภายใต้การควบคุมของคุณ

เริ่มการตรวจสอบสิทธิ์โดเมน

หากต้องการตรวจสอบสิทธิ์โดเมนของคุณ ให้ เข้าสู่ระบบ บัญชี SendGrid ของคุณและเปิด "การตั้งค่า" ในแถบการนำทางด้านซ้ายมือ จากนั้นเลือก การ ตรวจสอบ สิทธิ์ ผู้ส่ง

ใน หน้าการ ตรวจสอบสิทธิ์ของผู้ส่ง ให้ คลิกปุ่ม "เริ่มต้นใช้งาน" ในส่วน "การตรวจสอบสิทธิ์โดเมน"

ระบบจะขอให้คุณเลือกผู้ให้บริการ DNS ซึ่งโดยส่วนใหญ่แล้วเป็นบริษัทเดียวกับที่คุณซื้อโดเมน หากผู้ให้บริการ DNS ของคุณไม่ปรากฏในรายชื่อ หรือหากคุณไม่รู้ว่าพวกเขาเป็นใคร ให้เลือก “ฉันไม่แน่ใจ”

จากนั้นระบบจะถามคุณเกี่ยวกับการเพิ่มการสร้างแบรนด์ให้กับลิงก์ที่ปรากฏในอีเมลขาออก นี่ไม่ใช่หัวข้อที่เรากังวลในขณะนี้ ดังนั้นให้เลือก "ไม่" คุณสามารถเปิดใช้งานตัวเลือกนี้ในภายหลังได้หากต้องการใช้

คลิกปุ่ม "ถัดไป" เพื่อไปยังหน้าถัดไป

ในหน้าต่อไปนี้ คุณจะถูกขอให้ระบุชื่อโดเมนของคุณ ฉันป้อน yourdomainhere.com แล้ว และคุณจะต้องป้อนโดเมนที่คุณต้องการใช้ คุณไม่จำเป็นต้องเปลี่ยนแปลงอะไรในส่วน "การตั้งค่าขั้นสูง"

คลิกปุ่ม "ถัดไป" เพื่อดำเนินการต่อ

หน้านี้จะแสดงระเบียน DNS ใหม่ 3 รายการที่คุณต้องเพิ่มในการกำหนดค่าโดเมนของคุณ โดยแต่ละรายการจะมีประเภท ชื่อโฮสต์ และค่าหนึ่ง เพื่อความสะดวกของคุณ คุณสามารถคัดลอกโฮสต์และค่าทั้งหมดไปยังคลิปบอร์ดได้ ด้านล่างนี้คุณสามารถดูการตั้งค่าที่ฉันได้รับ ของคุณจะคล้ายกัน แต่มีชื่อโดเมนของคุณเอง:

การเพิ่มรายการ DNS ให้กับโดเมนของคุณ

ขั้นตอนต่อไปจะแตกต่างกันไปขึ้นอยู่กับผู้ให้บริการ DNS ของคุณ ไปที่หน้าการกำหนดค่าของโดเมนและค้นหาตำแหน่งที่มีการแก้ไขการตั้งค่า DNS

ภาพหน้าจอด้านล่างมีไว้สำหรับ Google Domains คุณสามารถดูวิธีที่ฉันเพิ่มระเบียน DNS แรกจากสามระเบียนในภาพต่อไปนี้ โปรดทราบว่าระเบียน 3 รายการที่มีชื่อ @, ftp และ www ไม่เกี่ยวข้องกับบทช่วยสอนนี้และตั้งค่าไว้แล้วในโดเมนของฉัน

โปรดใช้ความระมัดระวังเกี่ยวกับวิธีการป้อนชื่อระเบียน DNS แม้ว่าผู้ให้บริการบางรายต้องการชื่อที่ตรงตามเกณฑ์สำหรับระเบียน DNS ของคุณ ดังที่แสดงโดย SendGrid แต่ผู้ให้บริการรายอื่นๆ คาดหวังเพียงส่วนที่อยู่ก่อนชื่อโดเมน ตัวอย่างเช่น ต้องป้อนระเบียนที่ SendGrid แสดงเป็น em3329.yourdomainhere.com เป็น em3329 ใน Google Domains ตรวจสอบระเบียน DNS อื่นๆ ของคุณและให้สอดคล้องกับวิธีที่คุณป้อนระเบียนใหม่เหล่านี้

นี่คือวิธีที่ 3 ระเบียน DNS ใหม่ดูแลหลังจากที่ฉันป้อน:

การยืนยันโดเมน

กลับไปที่ หน้าการ ตรวจสอบสิทธิ์ผู้ส่ง SendGrid ซึ่งโดเมนของคุณจะปรากฏเป็นรอดำเนินการ คลิกที่ภาพเพื่อดำเนินการตามกระบวนการรับรองความถูกต้อง

ในหน้าจอถัดไป คุณจะเห็น 3 ระเบียน DNS คลิกปุ่ม "ยืนยัน" ที่ด้านบนขวาของหน้าเพื่อให้ SendGrid ดึงระเบียน DNS ของคุณและยืนยันว่าคุณได้เพิ่มรายการที่ร้องขอ

หาก SendGrid สามารถยืนยันโดเมนของคุณได้ คุณจะได้รับข้อความว่า "มันทำงาน!" หน้าหนังสือ:

ในทางกลับกัน หาก SendGrid ไม่สามารถตรวจสอบรายการ DNS ของคุณได้ คุณจะต้องลองอีกครั้งในภายหลัง ทุกครั้งที่มีการเปลี่ยนแปลง DNS จะต้องใช้เวลาระยะหนึ่งก่อนที่การเปลี่ยนแปลงจะเผยแพร่ในเซิร์ฟเวอร์ DNS ความล้มเหลวทันทีหลังจากแก้ไขรายการ DNS ของคุณ หมายความว่าคุณต้องให้เวลาอีกเล็กน้อยก่อนที่จะกดปุ่ม "ยืนยัน" อีกครั้ง โปรดทราบว่าอาจใช้เวลาถึง 48 ชั่วโมงในการเผยแพร่ DNS โดยสมบูรณ์ แม้ว่าโดยทั่วไปจะใช้เวลาน้อยกว่ามาก

เมื่อคุณได้รับ "มันใช้งานได้!" คุณพร้อมที่จะรับอีเมลที่โพสต์ไปยังเว็บแอปพลิเคชัน Flask ของคุณ

แอปพลิเคชั่นอีเมลขวด

ตอนนี้เราพร้อมที่จะเขียนเว็บแอปพลิเคชัน Flask อย่างง่ายที่ SendGrid สามารถส่งต่ออีเมลของเราได้

สร้าง Python Virtual Environment

ตามแนวทางปฏิบัติที่ดีที่สุดของ Python เราจะสร้างไดเร็กทอรีแยกต่างหากสำหรับโครงการของเรา และภายในนั้นเราจะสร้าง สภาพ แวดล้อมเสมือน จากนั้นเราจะทำการติดตั้ง Flask framework

หากคุณกำลังใช้ระบบ Unix หรือ Mac OS ให้เปิดเทอร์มินัลแล้วป้อนคำสั่งต่อไปนี้เพื่อทำงานที่อธิบายไว้ข้างต้น:

หากคุณกำลังติดตามบทช่วยสอนบน Windows ให้ป้อนคำสั่งต่อไปนี้ในหน้าต่างพรอมต์คำสั่ง:

เส้นทางอีเมลขาเข้า

ตอนนี้เรามาเขียนแอปพลิเคชั่น Flask ที่จะรับอีเมลขาเข้ากัน รหัสสำหรับแอปพลิเคชันที่สมบูรณ์แสดงอยู่ด้านล่าง ใส่รหัสนี้ใน ไฟล์ ชื่อ app.py

แอปพลิเคชันมีเส้นทางเว็บเพียงเส้นทางเดียวที่เชื่อมต่อกับ /email URL เราจะให้ SendGrid เรียกใช้เส้นทางนี้เพื่อส่งอีเมลที่เข้ามาหาเรา คำขอที่พวกเขาส่งจะมีรายละเอียดทั้งหมดที่เกี่ยวข้องกับอีเมลที่ส่งเป็นโพสต์ในแบบฟอร์ม HTTP มาตรฐาน ซึ่งหมายความว่าจาก Flask เราสามารถเข้าถึงรายละเอียดทั้งหมดเหล่านี้ได้อย่างง่ายดายจากพจนานุกรม `request.form'

ตัวแปรแบบฟอร์มต่อไปนี้มีความสนใจเป็นพิเศษ:

  • `request.form['from']`: ผู้ส่งอีเมล
  • `request.form['to']`: ผู้รับอีเมล
  • `request.form[' subject']`: หัวเรื่องอีเมล
  • `request.form['text']` เนื้อหาอีเมลในรูปแบบข้อความธรรมดา
  • `request.form['html']` เนื้อหาอีเมลในรูปแบบ HTML

โปรดทราบว่านี่ไม่ใช่ฟิลด์เดียวที่ส่งโดย SendGrid ตรวจสอบ รายการพารามิเตอร์อีเมลทั้งหมด ในเอกสารประกอบของ SendGrid

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

หลังจากที่คุณบันทึก app.py คุณสามารถเริ่มแอปพลิเคชัน Flask ได้ดังนี้:

ขณะนี้แอปพลิเคชันกำลังทำงานและรับฟังคำขอที่เข้ามา แต่สามารถเข้าถึงได้จากคอมพิวเตอร์ของคุณเองเท่านั้น ปล่อยให้แอปพลิเคชันทำงานบนหน้าต่างเทอร์มินัลของคุณตอนนี้ ในส่วนถัดไปเราจะเปิดเผยต่ออินเทอร์เน็ต

Webhook การแยกวิเคราะห์ขาเข้าของ SendGrid

ขั้นตอนสุดท้ายของบทช่วยสอนนี้คือการกำหนดค่า SendGrid ให้ส่งต่ออีเมลขาเข้าบนโดเมนของคุณไปยังแอปพลิเคชัน Flask

เริ่มต้น NGROK

เครื่องมือ ngrok สร้าง URL ที่เปิดเผยต่อสาธารณะและจับคู่กับแอปพลิเคชันที่ทำงานอยู่ในเครื่อง นี่เป็นเทคนิคทั่วไปที่ใช้ในการเปิดเผยบริการบนอินเทอร์เน็ตเพื่อการพัฒนาและทดสอบ เมื่อแอปพลิเคชัน Flask ของคุณเสร็จสมบูรณ์ คุณจะปรับใช้สำหรับการผลิตบนเซิร์ฟเวอร์ที่เหมาะสม และสิ่งนี้จะไม่จำเป็นอีกต่อไป

หากคุณยังไม่ได้ติดตั้ง ให้ติดตั้ง ngrok บนระบบของคุณ ปล่อยให้แอปพลิเคชัน Flask ทำงานและเปิดหน้าต่างเทอร์มินัลที่สองเพื่อเริ่ม ngrok ดังนี้:

นี่เป็นการบอกให้ ngrok สร้าง "อุโมงค์" จากอินเทอร์เน็ตสาธารณะลงในพอร์ต 5000 ในเครื่องท้องถิ่นของเรา โดยที่แอปพลิเคชัน Flask กำลังรอคำขอทางเว็บ ผลลัพธ์ของ ngrok จะมีลักษณะดังนี้:

สังเกตบรรทัดที่ขึ้นต้นด้วย "การส่งต่อ" ในหน้าจอ ngrok สิ่งเหล่านี้แสดง URL สาธารณะที่สร้างแบบสุ่มซึ่ง ngrok ใช้เพื่อเปลี่ยนเส้นทางคำขอไปยังบริการของเรา เราจะใช้ https:// URL เพราะมันใช้การเข้ารหัส

การลงทะเบียน URL ของเว็บฮุคด้วย SendGrid

กลับไปที่ แดชบอร์ด SendGrid และภายใต้การตั้งค่า ให้เลือก Inbound Parse จากนั้นคลิกที่ “Add Host & URL”

ในหน้าถัดไป ให้ป้อน โดเมนย่อย ที่คุณจะได้รับอีเมล ซึ่งอาจเป็นโดเมนย่อยใดๆ ที่ยังไม่ได้ใช้ในโดเมนของคุณ หรือหากคุณต้องการรับอีเมลโดยตรงที่โดเมนระดับบนสุด ให้เว้นว่างไว้ก็ได้ ในภาพด้านล่าง ฉันใช้ parse โดเมนย่อย ซึ่งหมายความว่าอีเมลที่ SendGrid ยอมรับจะมีรูปแบบ < any > @parse.yourdomainhere.com การเว้นฟิลด์โดเมนย่อยว่างไว้จะทำให้ SendGrid ยอมรับอีเมลสำหรับ <anything>@yourdomainhere.com ซึ่งในบางกรณีอาจดีกว่า

ถัดไป คุณต้องเลือก ชื่อโดเมน ของ คุณ นี่คือรายการแบบเลื่อนลงที่แสดงโดเมนทั้งหมดที่คุณได้ยืนยันกับ SendGrid หากคุณทำเช่นนี้เป็นครั้งแรก คุณจะเห็นเฉพาะโดเมนที่คุณยืนยันก่อนหน้านี้เท่านั้น

ช่องต่อไปนี้ใช้สำหรับ URL ปลายทาง สำหรับเว็บฮุคของคุณ นี่คือ URL ที่สร้างโดย ngrok ต่อท้าย Flask URL / email ในกรณีของฉันนี่ คือ https://bbf1b72b.ngrok.io/email คุณจะมี URL ที่คล้ายกัน แต่ส่วนแรกของชื่อโฮสต์ ngrok จะแตกต่างออกไป

คลิก "เพิ่ม" เพื่อกำหนดค่าเว็บฮุคของคุณ

ตอนนี้ คุณจะเห็นรายการสำหรับเว็บฮุคของคุณในหน้าการแยกวิเคราะห์ขาเข้าหลัก:

หมายเหตุ: ngrok URL จะเปลี่ยนทุกครั้งที่ ngrok ถูกหยุดและเริ่มต้นใหม่ ดังนั้นในระหว่างการพัฒนา คุณจะต้องแก้ไขเว็บฮุคของคุณเพื่ออัปเดต URL ทุกครั้งที่คุณรีสตาร์ท ngrok เมื่อคุณปรับใช้เว็บฮุคเพื่อการใช้งานจริง คุณจะโฮสต์เว็บนั้นโดยตรงบน URL สาธารณะ ดังนั้นจึงจะไม่ใช้ ngrok

การลงทะเบียนโดเมนย่อย parse

โดเมนย่อยที่คุณเลือกรับอีเมลในส่วนก่อนหน้าจะต้องถูกกำหนดในการกำหนดค่า DNS ของโดเมนด้วยระเบียน 'MX' ค่าสำหรับเร็กคอร์ดนี้จะเหมือนกันสำหรับลูกค้า SendGrid ทั้งหมด: `mx.sendgrid.net.` (สังเกตจุดต่อท้ายหลัง "net")

ในการกำหนดค่า DNS ของ Google Domains ฉันได้กำหนด โดเมนย่อยการ แยกวิเคราะห์ ดังนี้:

โปรดจำไว้ว่า ขึ้นอยู่กับผู้ให้บริการโดเมนที่คุณใช้ คุณอาจต้องป้อนชื่อโฮสต์ที่สมบูรณ์สำหรับระเบียน DNS นี้ ดังนั้นในกรณีนี้จะ เป็น parse.yourdomainhere.com

หากคุณตัดสินใจที่จะไม่กำหนดโดเมนย่อยในส่วนก่อนหน้า ชื่อโฮสต์ของคุณจะเป็น yourdomainhere.com ซึ่งสำหรับผู้ให้บริการ DNS บางรายจะต้องระบุเป็น “ @”

โปรดจำไว้ว่าการเปลี่ยนแปลง DNS นี้จะต้องเผยแพร่ด้วย ดังนั้นคุณอาจไม่สามารถรับอีเมลได้ในทันที

กำลังส่งอีเมลทดสอบ

ในขณะที่แอปพลิเคชัน Flask และ ngrok ของคุณกำลังทำงานอยู่ ให้เปิดโปรแกรมรับส่งเมลของคุณและส่งอีเมลทดสอบ ในช่อง “ถึง:” คุณสามารถป้อนชื่อผู้ใช้ใดก็ได้ที่คุณต้องการ เนื่องจาก SendGrid จะรวบรวมชื่อผู้ใช้ทั้งหมด สิ่งที่อยู่หลัง @ จะต้องเป็นโดเมนรับอีเมลที่สมบูรณ์ของคุณ

ในตัวอย่างด้านล่าง ฉันส่งอีเมลไปที่ [email protected] :

รอสักครู่เพื่อให้ SendGrid รับอีเมลและส่งต่อไปยัง ngrok webhook URL ซึ่งจะส่งต่อไปยัง ปลายทาง /email ของ Flask ดังที่คุณได้เห็นข้างต้น จุดสิ้นสุดง่ายๆ ที่ฉันเขียนในแอปพลิเคชัน Flask จะพิมพ์ข้อมูลอีเมลที่ได้รับไปยังคอนโซล:

เท่านี้ก็เรียบร้อย เราได้รับอีเมลตามคำขอทางเว็บในแอปพลิเคชัน Flask ของเราแล้ว!

การใช้งานการผลิต

ในส่วนนี้ ฉันต้องการชี้ให้เห็นความแตกต่างที่สำคัญสองสามประการระหว่าง webhooks ที่ปรับใช้ระหว่างการพัฒนาและที่มีไว้สำหรับการใช้งานจริง

การปรับใช้ที่ไม่มี ngrok

ดังที่กล่าวไว้ข้างต้น ngrok ไม่ใช่เครื่องมือที่ใช้งานจริงและไม่ควรใช้ในการปรับใช้จริง คุณจะปรับใช้แอปพลิเคชัน Flask ของคุณบนเซิร์ฟเวอร์ที่เชื่อมต่อโดยตรงกับอินเทอร์เน็ตแทน มี ตัวเลือกการปรับใช้หลายตัว ที่กล่าวถึงในเอกสารประกอบ Flask

ความปลอดภัยของเว็บฮุค

พิจารณาว่าปลายทางการรับอีเมลของคุณนั้นเปิดเผยต่อสาธารณะบนอินเทอร์เน็ต ดังนั้นใครก็ตามที่ทราบ URL ดังกล่าวสามารถส่งคำขอไปที่นั่นได้ ซึ่งอาจทำให้แอปพลิเคชันของคุณถูกร้องขอปลอมที่ส่งโดยผู้ใช้ที่ประสงค์ร้ายที่แอบอ้างเป็นคำขอของ SendGrid

มาตรการที่ดีในการป้องกันการโจมตีประเภทนี้คือการใช้ Basic Authentication บน Flask endpoint ของคุณ ส่วน ขยาย Flask-HTTPAuth มีประโยชน์ในการปรับใช้การรักษาความปลอดภัยประเภทนี้

หากคุณเพิ่มการรับรองความถูกต้องให้กับปลายทางของคุณ คุณจะต้องรวมชื่อผู้ใช้และรหัสผ่านใน URL ของเว็บฮุคที่ให้กับ SendGrid เว็บฮุคที่ฉันใช้ด้านบนจะต้องระบุเป็น https://username:[email protected]/email

บทสรุป

แม้ว่าจะมีขั้นตอนมากมายที่เกี่ยวข้องกับการตั้งค่าทุกอย่างเพื่อรับอีเมล แต่นี่เป็นวิธีที่ง่ายที่สุดวิธีหนึ่งในการบรรลุเป้าหมาย สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ Inbound Parse โปรดดูหน้าเอกสารของเรา

เราแทบรอไม่ไหวที่จะได้เห็นสิ่งที่คุณสร้างด้วย Inbound Parse!