Python - การส่งอีเมลโดยใช้ SMTP

Simple Mail Transfer Protocol (SMTP) เป็นโปรโตคอลที่จัดการการส่งอีเมลและการกำหนดเส้นทางอีเมลระหว่างเซิร์ฟเวอร์เมล

Python ให้ smtplib โมดูลซึ่งกำหนดอ็อบเจ็กต์เซสชันไคลเอ็นต์ SMTP ที่สามารถใช้เพื่อส่งเมลไปยังเครื่องอินเทอร์เน็ตใด ๆ ที่มีดีมอนตัวฟัง SMTP หรือ ESMTP

นี่คือไวยากรณ์ง่ายๆในการสร้างวัตถุ SMTP ซึ่งสามารถใช้ในการส่งอีเมลในภายหลัง -

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

นี่คือรายละเอียดของพารามิเตอร์ -

  • host- นี่คือโฮสต์ที่ใช้เซิร์ฟเวอร์ SMTP ของคุณ คุณสามารถระบุที่อยู่ IP ของโฮสต์หรือชื่อโดเมนเช่น tutorialspoint.com นี่เป็นอาร์กิวเมนต์ที่เป็นทางเลือก

  • port- หากคุณกำลังจัดเตรียมอาร์กิวเมนต์ของโฮสต์คุณจะต้องระบุพอร์ตที่เซิร์ฟเวอร์ SMTP กำลังรับฟัง โดยปกติพอร์ตนี้จะเป็น 25

  • local_hostname- หากเซิร์ฟเวอร์ SMTP ของคุณกำลังทำงานบนเครื่องของคุณคุณสามารถระบุเฉพาะlocalhostตามตัวเลือกนี้

วัตถุ SMTP มีวิธีการที่เรียกว่าอินสแตนซ์ sendmailซึ่งโดยทั่วไปจะใช้ในการส่งข้อความทางไปรษณีย์ ต้องใช้สามพารามิเตอร์ -

  • ส่ง - สตริงกับที่อยู่ของผู้ส่ง

  • รับ - รายการของสตริงหนึ่งสำหรับผู้รับแต่ละคน

  • ข้อความ - ข้อความเป็นสตริงที่จัดรูปแบบตามที่ระบุใน RFCs ต่างๆ

ตัวอย่าง

นี่เป็นวิธีง่ายๆในการส่งอีเมลโดยใช้สคริปต์ Python ลองสักครั้ง -

#!/usr/bin/python

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

ที่นี่คุณได้วางอีเมลพื้นฐานไว้ในข้อความโดยใช้เครื่องหมายคำพูดสามชุดดูแลจัดรูปแบบส่วนหัวให้ถูกต้อง อีเมลต้องการไฟล์From, Toและ Subject ส่วนหัวแยกออกจากเนื้อหาของอีเมลด้วยบรรทัดว่าง

ในการส่งอีเมลที่คุณใช้smtpObjเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ SMTP ในเครื่องท้องถิ่นแล้วใช้sendmailวิธีพร้อมกับข้อความจากที่อยู่และที่อยู่ปลายทางเป็นพารามิเตอร์ (แม้ว่าจากและไปยังที่อยู่ที่อยู่ในอีเมล์ -mail เองสิ่งเหล่านี้ไม่ได้ใช้เพื่อกำหนดเส้นทางอีเมลเสมอไป)

หากคุณไม่ได้ใช้เซิร์ฟเวอร์ SMTP บนเครื่องภายในของคุณคุณสามารถใช้ไคลเอนต์smtplibเพื่อสื่อสารกับเซิร์ฟเวอร์ SMTP ระยะไกล เว้นแต่คุณจะใช้บริการเว็บเมล (เช่น Hotmail หรือ Yahoo! Mail) ผู้ให้บริการอีเมลของคุณจะต้องให้รายละเอียดเซิร์ฟเวอร์เมลขาออกที่คุณสามารถให้ได้ดังต่อไปนี้ -

smtplib.SMTP('mail.your-domain.com', 25)

การส่งอีเมล HTML โดยใช้ Python

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

ในขณะส่งข้อความอีเมลคุณสามารถระบุเวอร์ชัน Mime ประเภทเนื้อหาและชุดอักขระเพื่อส่งอีเมล HTML

ตัวอย่าง

ต่อไปนี้เป็นตัวอย่างในการส่งเนื้อหา HTML เป็นอีเมล ลองสักครั้ง -

#!/usr/bin/python

import smtplib

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

การส่งไฟล์แนบเป็นอีเมล

ในการส่งอีเมลที่มีเนื้อหาผสมจำเป็นต้องตั้งค่า Content-type ส่วนหัวของ multipart/mixed. จากนั้นสามารถระบุส่วนข้อความและไฟล์แนบได้ภายในboundaries.

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

ไฟล์ที่แนบควรเข้ารหัสด้วยนามสกุล pack("m") ฟังก์ชั่นที่จะมีการเข้ารหัส base64 ก่อนส่ง

ตัวอย่าง

ต่อไปนี้เป็นตัวอย่างที่ส่งไฟล์ /tmp/test.txtเป็นไฟล์แนบ ลองสักครั้ง -

#!/usr/bin/python

import smtplib
import base64

filename = "/tmp/test.txt"

# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64

sender = '[email protected]'
reciever = '[email protected]'

marker = "AUNIQUEMARKER"

body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)

# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit

%s
--%s
""" % (body,marker)

# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s

%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print "Error: unable to send email"