Cộng đồng chia sẻ tri thức Lib24.vn

Python - Gửi email bằng cách sử dụng SMTP

Gửi bởi: Phạm Thọ Thái Dương 20 tháng 2 2020 lúc 10:49:34


Mục lục
* * * * *

Giao thức chuyển thư đơn giản (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 mô-đun smtplib , định nghĩa một đối tượng phiên máy 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]]] )

Dưới đây là chi tiết của các tham số -

  1. máy chủ - Đâ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ủ lưu trữ hoặc một tên miền như guidespoint.com. Đây là đối số tùy chọn.
  2. cổng - 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.
  3. 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 cho tùy chọn này.

Một đối tượng SMTP có một phương thức cá thể gọi là sendmail , thường được sử dụng để thực hiện công việc gửi thư. Phải mất ba tham số -

  1. Người gửi - Một chuỗi có địa chỉ của người gửi.
  2. Người nhận - Một danh sách các chuỗi, một cho mỗi người nhận.
  3. 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"

Tại đây, bạn đã đặt một e-mail cơ bản trong tin nhắn, sử dụng trích dẫn ba, chú ý định dạng chính xác các tiêu đề. Một e-mail yêu cầu một tiêu đề Từ , Đến và Chủ đề, được tách ra khỏi phần thân 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 tham số (mặc dù địa chỉ từ và đến địa chỉ nằm trong e -mail chính nó, chúng không luôn đượ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 máy khách smtplib để liên lạc với máy chủ SMTP từ xa. Trừ khi bạn đang sử dụng dịch vụ webmail (như Hotmail hoặc Yahoo! Mail), nhà cung cấp e-mail của bạn phải cung cấp cho bạn các chi tiết 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 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à 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 email

Để gửi e-mail có nội dung hỗn hợp, yêu cầu đặt tiêu đề Kiểu nội dung thành nhiều phần / hỗn hợp . Sau đó, văn bản và phần đính kèm có thể được chỉ định trong ranh giới .

Một ranh giới được bắt đầu với 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ông báo của e-mail. Một 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 hàm pack ("m") để có mã hóa base64 trước khi truyền.

Thí dụ

Dưới đây là ví dụ, sẽ gửi tệp /tmp/test.txt dướ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"

Được cập nhật: hôm kia lúc 8:27:04 | Lượt xem: 630