Gửi Email sử dụng SMTP trong Python



SMTP (là viết tắt của Simple Mail Transfer Protocol) là một giao thức để xử lý trình gửi và định tuyến email giữa các Mail Server. Python cung cấp smtplib Module, mà định nghĩa một đối tượng SMTP Client Session có thể được sử dụng để gửi email tới bất kỳ thiết bị internet nào với một SMTP hoặc ESMTP Listener.

Dưới đây là cú pháp cơ bản để tạo một đối tượng SMTP:

import smtplib

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

Chi tiết về tham số:

  • host: Đây là host đang chạy SMTP Server của bạn. Bạn có thể xác định địa chỉ IP của host hoặc một tên miền như vietjack.com. Đây là tham số tùy ý.

  • port: Nếu bạn cung cấp tham số host, thì bạn cần xác định một port, đây là nơi SMTP Server nghe yêu cầu. Thường thì port này sẽ là 25.

  • ten_localhost: Nếu SMTP Server của bạn đang chạy trên thiết bị local, thì bạn có thể xác định là localhost cho tùy chọn này.

Đối tượng SMTP có một phương thức instance là sendmail, được sử dụng để gửi một thông điệp. Nó nhận ba tham số:

  • sender - Là một chuỗi chỉ địa chỉ của người gửi.

  • receivers - Một danh sách các chuỗi, mỗi chuỗi là địa chỉ của người nhận.

  • message - Là một thông điệp dưới định dạng chuỗi.

Ví dụ

Dưới đây là cách đơn giản để gửi một email bởi sử dụng Python.

 

import smtplib

sender = 'from@fromdomain.com'
receivers = ['to@todomain.com']

message = """From: Tu <from@fromdomain.com>
To: Toi <to@todomain.com>
Subject: SMTP e-mail test

Day la vi du ve gui email.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Gui email thanh cong"
except SMTPException:
   print "Error: khong the gui email"

Trong ví dụ trên, chúng ta đã đặt một email cơ bản trong message, bởi sử dụng trích dẫn tam. Bạn cần định dạng các trường header một cách chính xác. Một email cần một From, To, và Subject header, được phân biệt với phần thân email bởi một dòng trắng.

Để gửi một email, bạn sử dụng smtpObj để kết nối tới SMTP Server trên thiết bị local và sau đó sử dụng phương thức sendmail cùng với thông điệp message, địa chỉ người gửi, địa chỉ người nhận là các tham số.

Nếu bạn không chạy SMTP Server trên thiết bị local, bạn có thể sử dụng smtplib Client để giao tiếp với một SMTP Server từ xa. Ví dụ:

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

Gửi HTML email bởi sử dụng Python

Khi bạn gửi một text message bởi sử dụng Python, thì tất cả nội dung được xem như dưới dạng text đơn giản. Ngay cả khi bạn bao các HTML tag trong thông điệp text này, thì nó cũng chỉ hiển thị dưới dạng text đơn giản và các thẻ HTML này sẽ không được định dạng tương ứng với cú pháp HTML. Nhưng Python cung cấp tùy chọn để gửi một HTML message dưới dạng một thông điệp HTML thực sự.

Trong khi gửi một email message, bạn có thể xác định một Mine version, kiểu nội dung, và bộ ký tự để gửi một HTML email.

Ví dụ

Ví dụ đơn giản này gửi một HTML content dưới dạng một email.

 

import smtplib

message = """From: Tu <from@fromdomain.com>
To: Toi <to@todomain.com>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

Day la vi du gui email trong dinh dang HTML

<b>Day la HTML message.</b>
<h1>Day la headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Gui email thanh cong"
except SMTPException:
   print "Error: khong the gui email"

Gửi đính kèm với email bởi sử dụng Python

Để làm điều này, bạn cần thiết lập trường Content-type header thành multipart/mixed. Sau đó, các phần text và attachment có thể được xác định bên trong boundaries.

Một boundary được bắt đầu với hai dấu gạch nối (--) được theo sau bởi một số duy nhất, mà không thể xuất hiện trong phần thông điệp của email. Một final boundary, biểu thị khu vực cuối cùng của email đó, cũng phải kết thúc với hai dấu gạch dưới.

Các file đính kèm nên được bao quanh bởi hàm pack("m") để có mã hóa base64 trước khi truyền tải.

Ví dụ

Ví dụ sau sẽ gửi một file có tên là /tmp/test.txt dưới dạng một đính kèm.

 

import smtplib
import base64

filename = "/tmp/test.txt"

# Doc mot file va ma hoa no trong dinh dang base64
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64

sender = 'webmaster@vietjack.com'
reciever = 'amrood.admin@gmail.com'

marker = "AUNIQUEMARKER"

body ="""
Day la vi du de gui email voi attachment.
"""
# Dinh nghia cac header.
part1 = """From: Tu <me@fromdomain.net>
To: Toi <amrood.admin@gmail.com>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)

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

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

# Dinh nghia phan attachment
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 "Gui email thanh cong"
except Exception:
   print "Error: khong the gui email"