Python - Gửi Email bằng SMTP
Simple Mail Transfer Protocol (SMTP) là một giao thức xử lý việc gửi e-mail và định tuyến e-mail giữa các máy chủ thư.
Python cung cấp smtplib mô-đun này xác định một đối tượng phiên khách SMTP có thể được sử dụng để gửi thư đến bất kỳ máy Internet nào có trình nền trình nghe SMTP hoặc ESMTP.
Đây là một cú pháp đơn giản để tạo một đối tượng SMTP, sau này có thể được sử dụng để gửi e-mail -
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Đây là chi tiết của các thông số -
host- Đây là máy chủ đang chạy máy chủ SMTP của bạn. Bạn có thể chỉ định địa chỉ IP của máy chủ hoặc tên miền như tutorialspoint.com. Đây là đối số tùy chọn.
port- Nếu bạn đang cung cấp đối số máy chủ , thì bạn cần chỉ định một cổng, nơi máy chủ SMTP đang lắng nghe. Thông thường cổng này sẽ là 25.
local_hostname- Nếu máy chủ SMTP của bạn đang chạy trên máy cục bộ của bạn, thì bạn có thể chỉ định localhost theo tùy chọn này.
Một đối tượng SMTP có một phương thức thể hiện được gọi là sendmail, thường được sử dụng để thực hiện công việc gửi thư. Nó có ba tham số -
Người gửi - Một chuỗi có địa chỉ của người gửi.
Người nhận - Một danh sách các chuỗi, mỗi chuỗi cho mỗi người nhận.
Các thông điệp - Một thông báo như là một chuỗi định dạng xác định trong RFC khác nhau.
Thí dụ
Đây là một cách đơn giản để gửi một e-mail bằng tập lệnh Python. Hãy thử một lần -
#!/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"
Ở đây, bạn đã đặt một e-mail cơ bản trong tin nhắn, sử dụng dấu ngoặc kép, hãy chú ý định dạng tiêu đề một cách chính xác. Một e-mail yêu cầu mộtFrom, Tovà Subject tiêu đề, ngăn cách với nội dung của e-mail bằng một dòng trống.
Để gửi thư, bạn sử dụng smtpObj để kết nối với máy chủ SMTP trên máy cục bộ và sau đó sử dụng phương thức sendmail cùng với thư, địa chỉ từ và địa chỉ đích làm các tham số (mặc dù địa chỉ từ và đến nằm trong e -mail chính nó, chúng không phải lúc nào cũng được sử dụng để định tuyến thư).
Nếu bạn không chạy máy chủ SMTP trên máy cục bộ của mình, bạn có thể sử dụng ứng dụng smtplib để giao tiếp với máy chủ SMTP từ xa. Trừ khi bạn đang sử dụng dịch vụ webmail (chẳng hạn như Hotmail hoặc Yahoo! Mail), nhà cung cấp dịch vụ email của bạn phải cung cấp cho bạn thông tin chi tiết về máy chủ thư đi mà bạn có thể cung cấp cho họ, như sau:
smtplib.SMTP('mail.your-domain.com', 25)
Gửi e-mail HTML bằng Python
Khi bạn gửi tin nhắn văn bản bằng Python, thì tất cả nội dung được coi là văn bản đơn giản. Ngay cả khi bạn bao gồm các thẻ HTML trong một tin nhắn văn bản, nó được hiển thị dưới dạng văn bản đơn giản và các thẻ HTML sẽ không được định dạng theo cú pháp HTML. Nhưng Python cung cấp tùy chọn để gửi một tin nhắn HTML dưới dạng tin nhắn HTML thực tế.
Trong khi gửi e-mail, bạn có thể chỉ định phiên bản Mime, kiểu nội dung và bộ ký tự để gửi e-mail HTML.
Thí dụ
Sau đây là ví dụ để gửi nội dung HTML dưới dạng e-mail. Hãy thử một lần -
#!/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"
Gửi tệp đính kèm dưới dạng e-mail
Để gửi một e-mail có nội dung hỗn hợp, yêu cầu đặt Content-type tiêu đề tới multipart/mixed. Sau đó, các phần văn bản và phần đính kèm có thể được chỉ định trongboundaries.
Một ranh giới được bắt đầu bằng hai dấu gạch nối theo sau là một số duy nhất, không thể xuất hiện trong phần thư của e-mail. Ranh giới cuối cùng biểu thị phần cuối cùng của e-mail cũng phải kết thúc bằng hai dấu gạch nối.
Các tệp đính kèm phải được mã hóa bằng pack("m") có chức năng mã hóa base64 trước khi truyền.
Thí dụ
Sau đây là ví dụ gửi một tệp /tmp/test.txtdưới dạng tệp đính kèm. Hãy thử một lần -
#!/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"