Python 3 - 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 định nghĩa 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ể xác định địa chỉ IP của máy chủ lưu trữ hoặc tên miền như tutorialspoint.com. Đây là một đố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 tùy chọn localhost .

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/python3

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, To, và một 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ộ. 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ù các địa chỉ từ và đến nằm trong chính e-mail, 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ư gmail 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:

mail = smtplib.SMTP('smtp.gmail.com', 587)

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. Tuy nhiên, Python cung cấp một 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 tin nhắn e-mail, bạn có thể chỉ định phiên bản Mime, loại nội dung và bộ ký tự để gửi e-mail HTML.

Thí dụ

Sau đây là một ví dụ để gửi nội dung HTML dưới dạng e-mail. Hãy thử một lần -

#!/usr/bin/python3

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 cài đặt Content-type tiêu đề tới multipart/mixed. Sau đó, văn bản và các 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 cơ số 64 trước khi truyền.

Thí dụ

Sau đây là một 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/python3

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")