ใช้ Python ส่ง New Year Card ผ่าน Email ด้วย Package “sorkorsor” กันเถอะ!

Jeerawat Chuachan
AIResearch.in.th
Published in
4 min readDec 28, 2020
Photo by Annie Spratt on Unsplash

บทความนี้จัดทำโดยสถาบันวิจัยปัญญาประดิษฐ์ประเทศไทย (AIResearch)

Facebook & Medium: AIResearch.in.th

ผู้เขียนร่วม: Kamonphan Phannithiprasert

ใกล้จะพ้นผ่านปี พ.ศ. 2563 ไปแล้วนะครับ หลาย ๆ ที่ต่างก็ตกแต่งให้เข้ากับเทศกาลปีใหม่ พร้อมกับเปิด All I Want for Christmas Is You เป็นช่วงเวลาแห่งความสุขหลังจากผ่านปีที่หนักหน่วงนี้มา

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

สิ่งหนึ่งที่เราสามารถทำได้ในการส่งความรู้สึกดีๆให้กันได้ก็คือการให้ ส.ค.ส (ส่งความสุข) หรือก็คือบัตรอวยพรเนื่องในโอกาสวันปีใหม่นั่นเองครับ หรืออาจจะเรียกว่า New Year Card โดยอาจจะเป็นบัตรกระดาษที่เขียนคำอวยพรและมีรูปภาพตกแต่งสวยงามให้กัน แต่อีกทางเลือกหนึ่งก็คือส่งผ่าน Email ให้กันก็สวยงามได้ไม่แพ้กัน และยังช่วยประหยัดการใช้กระดาษอีกด้วย แต่ถ้าเกิดว่ามีหลายคนที่เราอยากส่งให้ล่ะ เราก็สามารถส่งแบบผู้รับหลายคนได้ ในขณะเดียวกัน อีกทางหนึ่งก็คือเขียนข้อความของเราให้เฉพาะกับผู้รับแต่ละคน แล้วส่ง Email ที่แตกต่างกันในแต่ละผู้รับได้ ในบทความนี้จะสอนถึงวิธีการทำด้วยการใช้ Python กันครับ

สำหรับตัว Package “sorkorsor” สามารถอ่าน Code แบบเป็นขั้นตอนได้ตาม Notebook ที่อยู่ใน GitHub ซึ่งจะแนบไว้ท้ายบทความ หรือหากว่าอยากรัน Code ในรูปแบบ Script เลยก็ทำได้เช่นกัน โดยหลังจากอธิบายการทำงานของ Code แล้วเราถึงจะเข้าสู่วิธีการใช้งานกัน

Code โดยรวมแล้วจะเป็นดังที่แสดงด้านล่างนี้

เราจะมาพูดถึงแต่ละส่วนของ Code กันครับ

เราจะมาพูดถึงแต่ละส่วนของ Code กันครับ

ในส่วน Library ที่ใช้จะมี 3 อันก็คือ

  1. Pandas เพื่อใช้ในการอ่าน file CSV ที่มี Email ของผู้รับและข้อความที่จะส่งหาผู้รับแต่ละคน
  2. smtplib เพื่อใช้ในการส่งตัว Email ของเรา
  3. email ใช้ในการเขียนเนื้อหาของ Email
import pandas as pd
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import formatdate

ขั้นตอนต่อไปคือการอ่านไฟล์ CSV ของเรา โดยข้อมูลที่ต้องมีก็คือ Email ของผู้รับ, ข้อความที่จะส่งให้ผู้รับคน, และ ชื่อของผู้รับ

df = pd.read_csv('./recipients.csv')

หน้าตาของ DataFrame จะเป็นดังต่อไปนี้

ต่อไปคือตัว New Year Card ของเรานั่นเอง โดยในที่นี้เราจะใช้ไฟล์ HTML มาเป็น Template ของเรา ใน Package นี้เราจะเก็บไฟล์เหล่านี้ไว้ใน Folder “html” คำสั่งในการอ่านไฟล์ HTML เข้ามาก็คือ

body = open('./html/card.html', 'r', encoding='utf8').read()

สำหรับการเปิดดูไฟล์ HTML นั้นนอกจากจะใช้ web browser เรายังสามารถเปิดใน Jupyter Notebook ได้เช่นกัน ด้วยคำสั่งต่อไปนี้ แต่ก็อาจแสดงผลต่างจากการเปิด web browser หรือใน Email เล็กน้อย

from IPython.core.display import HTML
HTML(body)

ใน Template ที่เราใช้ จะมี 3 ตำแหน่งที่เป็น Placeholder ไว้สำหรับข้อมูลผู้รับที่เราจะใส่เพิ่มเข้าไปได้แก่ {sender name}, {recipient name}, และ {text} โดยจะถูกแทนที่ด้วยข้อมูลจาก CSV ของเรานั่นเอง

ส่วนต่อไปก็คือ Email และรหัสของผู้ส่ง, ชื่อของผู้ส่ง, และหัวเรื่องของ Email ดังตัวอย่างด้านล่าง

my_username = 'sender@email.com'
my_password = 'sender_password'
send_from = 'sender@email.com'
sender_name = 'Sender Name'
email_subject = 'Happy New Year!'

ทีนี้มาดูตัวโค้ดหลักที่เราจะใช้ส่ง Email กันเลยดีกว่าครับ

มาดูตัว Function กันก่อนนะครับว่าวันนี้เราจะใช้อะไรบ้างในการส่ง Email

เริ่มแรกเราจะสร้าง function โดยใช้คำสั่ง def ซึ่งในที่นี้เราก็ได้ตั้งชื่อ function นี้ว่า send_email ซึ่งมีตัวแปร 7 ตัวด้วยกันเพื่อรับข้อมูลที่จำเป็นในการส่ง Email ครับคือ

send_from: Email ของผู้ส่ง

sender_name: ชื่อของผู้ส่ง

subject: ชื่อหัวข้อ Title ตอนส่ง Email

body: ส่วนเนื้อหาของ Email ที่เป็นไฟล์ HTML

recipients: DataFrame ที่มีรายการ Email ผู้รับ มีข้อความที่เราเขียนให้ผู้รับแต่ละคนและชื่อของผู้รับแต่ละคน

username: Email ของผู้ส่งที่จะใช้ log in บน server

password: รหัสที่ใช้ log in Email ใน username

ในการเรียกใช้ function ก็คือคำสั่งต่อไปนี้ครับ

เรามาดู Code กันอย่างละเอียดไปทีละบรรทัดกันนะครับ

บรรทัดนี้เป็นการ access เข้าสู่ DataFrame หรือไฟล์ CSV ที่เราสร้างไว้ ไปทีละแถวครับ

เรามาสร้างโครงสร้าง Email กันก่อนดีกว่าครับ

เราสร้าง mail object โดยใช้ MIMEMultipart ขึ้นมาก่อนเลยครับ ซึ่งเหมือนกระดาษเปล่าที่จะทำให้เราสามารถเขียน ส่วนหัว (header) และวางเนื้อหา (body) ของ Email ลงไปได้ครับ โดยโค้ดด้านล่างนี้คือการเขียนส่วนหัวของ Email โดยคำสั่ง formatdate ใช้เพื่อเก็บเวลา ณ ตอนที่เรา run code เพื่อเป็นข้อมูลเวลาที่เราส่ง Email นั่นเองครับ

ต่อมานะครับ เนื่องจากเรามีข้อความที่อยากจะส่งให้แต่ละคนไม่เหมือนกัน ดังนั้นเราจะต้องเขียนโค้ดที่ทำให้ข้อความบน HTML เราเปลี่ยนไปรายบุคคลครับ ซึ่งเราจะสร้างเป็นกระดาษอีกแผ่นนึงที่มีแต่เนื้อหาหรือก็คือ New Year Card ของเราโดยใช้คำสั่ง MIMEText และ บอกไว้ด้วยว่าส่งเป็น ‘html’ format นะ

หลังจากนั้นก็มาประกอบร่างเลยครับ เราเอาข้อความที่เราสร้างขึ้นให้แต่ละคนลงไปวางใน mail object ในส่วนของเนื้อหาของ Email โดยใช้คำสั่ง attach

เมื่อมาถึงตรงนี้เราได้ สร้าง Email ที่ครบสมบูรณ์พร้อมส่งแล้วครับมาถึง part ของการส่ง Email กันบ้างครับ

smtp เป็น protocol ที่ไว้ใช้ส่ง Email โดย server ที่ใช้ในการรับ-ส่ง Email คือ STMP server ซึ่งโค้ดด้านล่างนี้เป็นการเชื่อมต่อ SMTP server ของ MS Outlook ครับ ซึ่งในที่นี้ผู้ส่งใช้ email จากเครือของ Outlook ดังนั้นจึงใช้ ‘smtp.office365.com’ แต่ถ้าผู้ส่งใช้ gmail ก็ต้องเปลี่ยนเป็น ‘smtp.gmail.com’ นะครับ

Note: ส่งผ่านพอร์ต 587 เพื่อเพิ่มความปลอดภัยในการส่ง Email

เมื่อเราเชื่อมต่อกับ server แล้วก็เข้าไปยืนยันตัวตนกับ server ซะหน่อยครับด้วยคำสั่ง ehlo เหมือนกับไป say ‘Hello’ นั่นเองครับ

ทีนี้ก่อนที่เราจะส่ง Email เราก็ต้องทำการ encrypt password ของเราโดยโหมด TLS เพื่อที่จะได้ไม่มีใครมาแอบเอาข้อมูลเราไปได้ขณะที่ Email กำลังวิ่งจาก computer เราไปยัง server

ทีนี้เราก็ทำการ log in เข้า Email เพื่อส่ง Email ผ่าน server และปิด server เมื่อเสร็จสมบูรณ์นั่นเองครับ

โอเคครับทีนี้ก็เอา ‘send_email’ function ที่เราสร้างขึ้นมาเรียบร้อยแล้วไปใช้งานกันครับ

จำได้ไหมครับว่า function ของเรานี้จะมีตัวแปร 7 ตัวเพื่อรับข้อมูลต่างๆ ทีนี้ก็ใส่ข้อมูลไปในแต่ละตัวแปรเลยครับ

สรุปแล้วนะครับ ก่อนที่จะใช้งาน sorkorsor ก็อย่าลืม 4 ขั้นตอนหลักๆคือ

  1. ใส่ไฟล์ HTML Template ไว้ใน Folder “html” โดยอาจใช้ที่มีให้อยู่แล้ว หรือสรรค์สร้างอันใหม่ขึ้นมาเองก็ได้ตามสะดวก โดยอย่าลืมใส่ Placeholder 3 อย่างด้วยกันคือ {sender name}, {recipient name}, และ {text}
  2. แก้ไขข้อมูล Email, รหัส, หัวข้อ Email, และชื่อผู้ส่ง โดยหากรัน Code จาก Jupyter Notebook ก็สามารถแก้ภายในนั้นได้เลย แต่หากจะรัน Script จำเป็นต้องไปแก้ในไฟล์ app.py
  3. แก้ไข smtp server ให้ตรงกับ Email ที่ท่านใช้ ในที่นี้ Email ของทางผู้เขียนจะเป็น smtp.office365.com หากทางผู้อ่านใช้ Email อื่นก็สามารถไปดู smtp server ได้ที่ลิ้งค์นี้ https://www.ecomsiam.com/smtp-server-for-email
  4. ตั้งชื่อไฟล์ CSV ว่า ‘recipients.csv’ และวางไฟล์ไว้ใน Folder ของ sorkorsor

เมื่อทำตามวิธีข้างต้นแล้ว ก็มาถึงวิธีใช้งาน sorkorsor โดยสามารถทำได้หลายวิธี ด้วยกัน อย่างหนึ่งก็คือรันใน Jupyter Notebook ได้เลย หรือหากจะรัน Script ก็ได้เช่นกัน ดังต่อไปนี้

$ python -m sorkorsor

สามารถเข้าไปดูและโหลด sorkorsor มาใช้งานได้จาก Link GitHub ต่อไปนี้

ขอบคุณผู้อ่านทุกท่าน และขอให้มีความสุขสมหวังในปีใหม่ที่จะมาถึงนี้ครับ 🥳

--

--