Hướng dẫn cách gửi file python

Bài viết này giới thiệu tới bạn một giải pháp hiệu quả khi xử lý đống email của mình. Ngôn ngữ lập trình Python hỗ trợ cho bạn các thư viện giúp bạn tối ưu hóa thời gian khi thực hiện những công vụ liên quan đến email.

Bạn có thể lập trình để gửi email đến nhiều người hay nhận thông báo email một cách có hệ thống. Bạn còn có thể gửi email xác nhận cho người dùng khi họ tạo tài khoản hoặc giữ email cho các thành viên trong tổ chức của bạn để nhắc nhở họ, chẳng hạn như việc đóng các khoản phí. Thông thường gửi email là một công việc tốn thời gian, dễ bị lỗi nhưng nó sẽ trở nên dễ dàng hơn bao giờ hết khi được tự động hóa với Python.

Trong bài viết này bạn sẽ học được cách:

  • Thiết lập kết nối an toàn sử dụng SMTP_SSL() và .starttls()
  • Sử dụng thư viện smtplib để gửi những email đơn giản
  • Gửi email có mã HTML tệp đính kèm bằng thư viện email
  • Gửi nhiều email cá nhân bằng tệp CSV gồm tập các liên hệ
  • Sử dụng thư viện Yagmail để gửi email thông qua tài khoản Gmail với vài dòng code ngắn gọn

Bắt tay vào tìm hiểu nào!

Python xây dựng thư viện smtplib dùng để gửi email bằng giao thức Simple Mail Transfer Protocal (SMTP) , smtplib sử dụng giao thức RFC 821 cho SMTP. Các ví dụ trong bài viết đều sử dụng máy chủ Gmail SMTP để gửi email, nhưng các dịch vụ gửi email khác cũng được áp dụng nguyên lý tương tự. Mặc dù phần lớn các nhà làm dịch vụ về email sử dụng cùng cổng kết nối được sử dụng trong bài viết, nhưng bạn có thể tự tìm kiếm kết nối của mình trên Google.

Đầu tiên, hãy thiết lập một tài khoản Gmail hoặc thiết lập máy chủ SMTP debugging có thể xóa email bạn gửi và in chúng sử dụng command prompt. Có 2 phương pháp được nêu bên dưới. Một máy chủ local SMTP debugging có thể sửa bất kỳ lỗi email nào và đảm bảo rằng các hàm email của bạn sẽ được sửa trước khi gửi.

Cách 1: Thiết lập một tài khoản Gmail mới

Nếu bạn quyết định sử dụng tài khoản Gmail để gửi email, mình khuyên bạn nên thiết lập một tài khoản mới mà bạn không dùng đến phục vụ mục đích code. Bởi vì bạn sẽ phải thay đổi bảo mật của tài khoản Gmail để cho phép code python truy cập vào và bạn còn có thể bị lộ thông tin đăng nhập của mình. Ngoài ra, hộp thư đến của bạn sẽ mau chóng bị đầy. Do đó cần thiết lập một email mới phục vụ nghiên cứu.

Một tính năng xịn xò của Gmail là bạn có thể sử dụng dấu + ngay trước dấu @ để thêm những thay đổi đối với email của bạn. Ví dụ: thư được gửi đến [email protected][email protected] đều sẽ đến [email protected].  Bạn có thể mô phỏng nhiều địa chỉ mà tất cả được gửi đến cùng một hộp thư, có cùng địa chỉ đến.

Để thiết lập địa chỉ Gmail giúp kiểm tra code của bạn, hãy làm như sau:

  1. Tạo một Tài khoản Google mới.
  2. Bật Allow less secure apps thành ON. Hãy lưu ý rằng điều này giúp người khác dễ dàng truy cập vào tài khoản của bạn hơn.

Nếu bạn không muốn giảm mức độ bảo mật tài khoản Gmail, hãy kiểm tra Google làm thể nào để lấy thông tin đăng nhập sử dụng code python, sử dụng nền tảng ủy quyền OAuth2.

Cách 2: Thiết lập Máy chủ SMTP cục bộ

Bạn có thể kiểm tra chức năng email bằng cách chạy máy chủ SMTP debugging cục bộ, sử dụng thư viện smtpd được cài đặt sẵn với Python. Thay vì gửi các email đến địa chỉ cụ thể, ta sẽ xóa chúng và in nội dung của chúng trên console. Chạy một máy chủ debugging cục bộ có nghĩa là không cần phải mã hóa tin nhắn hoặc sử dụng thông tin đăng nhập để đăng nhập vào máy chủ email.

Bạn có thể bật máy chủ local SMTP debugging lên bằng cách gõ lệnh sau trên Command Prompt:

$ python -m smtpd -c DebuggingServer -n localhost:1025

Trên Linux, chúng ta sử dụng sudo ở phía trước.

Bất kỳ email nào được gửi qua máy chủ này sẽ bị loại bỏ và hiển thị nội dung trên cửa sổ dưới dạng byte:

---------- MESSAGE FOLLOWS ----------
b'X-Peer: ::1'
b''
b'From: [email protected]'
b'To: [email protected]'
b'Subject: a local test mail'
b''
b'Hello there, here is a test email'
------------ END MESSAGE ------------

Giả sử bạn đang sử dụng một tài khoản Gmail, nếu bạn đang sử dụng một máy chủ local debugging, bạn chỉ cần sử dụng localhost như một máy chủ SMTP của bạn và sử dụng cổng 1025 thay vì cổng 465587. Bên cạnh đó, bạn không cần phải sử dụng hàm login() hoặc mã hóa đường truyền bằng SSL/TLS.

1. Gửi một email văn bản đơn giản

Trước khi đi sâu vào việc gửi email với mã HTMLtệp đính kèm, bạn sẽ học cách gửi email văn bản đơn giản bằng Python. Đây là những email mà bạn có thể viết lên trong một trình soạn thảo văn bản đơn giản. Không có gì trông lạ mắt như định dạng văn bản hoặc siêu liên kết. Bạn sẽ học được điều đó một chút nữa.

Bắt đầu một kết nối SMTP an toàn

Khi bạn gửi email thông qua Python, bạn nên đảm bảo rằng kết nối SMTP của bạn được mã hóa, để thông tin đăng nhập và thông tin đăng nhập của bạn không dễ dàng bị người khác truy cập. SSL (Secure Sockets Layer Lớp cổng bảo mật) và TLS (Transport Layer Security Bảo mật lớp vận chuyển) là hai giao thức có thể được sử dụng để mã hóa kết nối SMTP. Nó không cần thiết phải sử dụng một trong hai thứ này khi sử dụng máy chủ local debugging.

Có hai cách để bắt đầu kết nối an toàn với máy chủ email của bạn:

  • Bắt đầu một kết nối SMTP được bảo mật ngay từ đầu bằng cách sử dụng SMTP_SSL().
  • Bắt đầu một kết nối SMTP không bảo mật mà sau đó có thể được mã hóa bằng .starttls().

Trong cả hai trường hợp, Gmail sẽ mã hóa email bằng TLS, vì đây là sự kế thừa an toàn hơn của SSL. Trong các cân nhắc về bảo mật Python, bạn nên sử dụng create_default_context () từ mô đun ssl. Việc này sẽ tải các chứng chỉ CA đáng tin cậy của hệ thống, cho phép kiểm tra tên máy chủ và xác thực đã xác nhận hay chưa và cố gắng chọn các cài đặt mật mã và giao thức an toàn hợp lý. Nếu bạn muốn kiểm tra mã hóa cho một email trong hộp thư đến Gmail của mình, hãy truy cập More -> Show original  để xem loại mã hóa được liệt kê dưới tiêu đề Received.

smtplib là thư viện tích hợp Python để gửi email đến bất kỳ thiết bị Internet nào có trình nghe SMTP hoặc ESMTP.

Trước tiên mình sẽ chỉ cho bạn cách sử dụng SMTP_SSL() vì nó khởi tạo một kết nối được bảo mật ngay từ đầu và ngắn gọn hơn một chút so với việc thay thế bằng .starttls(). Hãy nhớ rằng Gmail yêu cầu bạn kết nối với cổng 465 nếu sử dụng SMTP_SSL() và với cổng 587 khi sử dụng .starttls().

Cách 1: Sử dụng SMTP_SSL()

Ví dụ mã bên dưới tạo kết nối an toàn với máy chủ SMTP của Gmail, sử dụng SMTP_SSL () của smtplib để bắt đầu kết nối được mã hóa TLS.

Tình huống mặc định của ssl xác nhận tên máy chủ, xác nhận của nó và tối ưu hóa bảo mật của kết nối. Hãy chắc chắn điền vào địa chỉ email của riêng bạn thay vì [email protected]:

import smtplib, ssl

port = 465  # For SSL
password = input("Type your password and press enter: ")

# Create a secure SSL context
context = ssl.create_default_context()

with smtplib.SMTP_SSL("smtp.gmail.com", port, context=context) as server:
    server.login("[email protected]", password)
    # TODO: Send email here

Sử dụng với smtplib.SMTP_SSL () làm máy chủ: đảm bảo rằng kết nối được tự động đóng ở cuối đoạn code được thụt lề vào. Nếu cổng bằng 0 hoặc không được chỉ định, .SMTP_SSL () sẽ sử dụng cổng tiêu chuẩn cho SMTP qua SSL (cổng 465).

Việc lưu giữ mật khẩu email trong code của bạn là không an toàn, đặc biệt nếu bạn có ý định chia sẻ nó với người khác. Thay vào đó, sử dụng input () để cho phép người dùng nhập mật khẩu của họ khi chạy tập lệnh, như trong ví dụ trên. Nếu bạn không muốn mật khẩu hiển thị trên màn hình khi bạn nhập mật khẩu, bạn có thể thêm thư viện getpass và sử dụng .getpass () thay vì phải nhập mật khẩu mà bạn không nhìn thấy.

Cách 2: Sử dụng .starttls()

Thay vì sử dụng .SMTP_SSL() để tạo kết nối an toàn ngay từ đầu, bạn có thể tạo kết nối SMTP không bảo mật và mã hóa bằng cách sử dụng .starttls().

Để làm điều này, thêm thư viện smtplib.SMTP, bao gồm kết nối với SMTP và cho phép bạn truy cập vào các phương thức của nó. Tôi khuyên bạn nên xác định máy chủ và cổng SMTP của bạn ở đầu tập lệnh để cấu hình chúng một cách dễ dàng.

Đoạn code dưới đây sử dụng máy chủ xây dựng = SMTP(), thay vì định dạng with SMTP() as server: mà chúng tôi đã sử dụng trong ví dụ trước. Để chắc chắn rằng code của bạn không gặp sự cố khi có lỗi, hãy đặt code chính của bạn vào khối try và để một khối except in bất kỳ thông báo lỗi nào stdout:

import smtplib, ssl

smtp_server = "smtp.gmail.com"
port = 587  # For starttls
sender_email = "[email protected]"
password = input("Type your password and press enter: ")

# Create a secure SSL context
context = ssl.create_default_context()

# Try to log in to server and send email
try:
    server = smtplib.SMTP(smtp_server,port)
    server.ehlo() # Can be omitted
    server.starttls(context=context) # Secure the connection
    server.ehlo() # Can be omitted
    server.login(sender_email, password)
    # TODO: Send email here
except Exception as e:
    # Print any error messages to stdout
    print(e)
finally:
    server.quit() 

Để nhận dạng chính mình với máy chủ, nên gọi hàm .helo() (SMTP) hoặc .ehlo() (ESMTP) sau khi tạo .SMTP() và một lần nữa sau .starttls(). Hàm này được gọi ngầm định bởi .starttls () và .sendmail () nếu cần, vì vậy trừ khi bạn muốn kiểm tra các phần mở rộng dịch vụ SMTP của máy chủ, không nhất thiết phải sử dụng .helo() hoặc .ehlo() một cách rõ ràng.

Gửi email văn bản của bạn

Sau khi bắt đầu kết nối SMTP an toàn bằng một trong các phương pháp trên, bạn có thể gửi email của mình bằng cách sử dụng .sendmail ():

server.sendmail(sender_email, receiver_email, message)

Lời khuyên cho bạn là nên xác định địa chỉ email và nội dung thư ở đầu tập lệnh của mình, sau khi nhập, để bạn có thể thay đổi dễ dàng:

sender_email = "[email protected]"
receiver_email = "[email protected]"
message = """\
Subject: Hi there

This message is sent from Python."""

# Send email here

Chuỗi message bắt đầu bằng "Subject: Hi there" theo sau là hai dòng mới (\ n). Điều này đảm bảo Hi there hiển thị là chủ đề của email và văn bản phía sau dòng mới sẽ được coi là nội dung thư.

Ví dụ code bên dưới gửi email văn bản đơn giản bằng cách sử dụng SMTP_SSL():

import smtplib, ssl

port = 465  # For SSL
smtp_server = "smtp.gmail.com"
sender_email = "[email protected]"  # Enter your address
receiver_email = "[email protected]"  # Enter receiver address
password = input("Type your password and press enter: ")
message = """\
Subject: Hi there

This message is sent from Python."""

context = ssl.create_default_context()
with smtplib.SMTP_SSL(smtp_server, port, context=context) as server:
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message)

Để so sánh, đây là một ví dụ code gửi email văn bản đơn giản qua kết nối SMTP được bảo mật bằng .starttls(). Các dòng server.ehlo() có thể được bỏ qua, vì chúng được gọi ngầm định bởi .starttls() và .sendmail(), nếu được yêu cầu: 

import smtplib, ssl

port = 587  # For starttls
smtp_server = "smtp.gmail.com"
sender_email = "[email protected]"
receiver_email = "[email protected]"
password = input("Type your password and press enter:")
message = """\
Subject: Hi there

This message is sent from Python."""

context = ssl.create_default_context()
with smtplib.SMTP(smtp_server, port) as server:
    server.ehlo()  # Can be omitted
    server.starttls(context=context)
    server.ehlo()  # Can be omitted
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, message)

2. Gửi những email đặc biệt

Thư viện email tích hợp trong Python cho phép bạn tạo các email ưa thích, sau đó có thể được chuyển bằng smtplib như bạn đã làm. Bên dưới, bạn sẽ học cách sử dụng thư viện email để gửi email có mã HTMLtệp đính kèm.

Chứa nội dung HTML

Nếu bạn muốn định dạng văn bản trong email của mình (in đậm, in nghiêng, v.v.) hoặc nếu bạn muốn thêm bất kỳ hình ảnh, các link hoặc nội dung phản hồi nào, thì HTML rất tiện dụng. Ngày nay, loại email phổ biến nhất là MIME(Multipurpose Internet Mail Extensions Tiện ích mở rộng thư Internet đa năng) loại email có nhiều phần, kết hợp HTML và văn bản thuần túy. Các thông báo MIME được xử lý bởi thư viện email.mimecủa Python. Để biết mô tả chi tiết, kiểm tra tài liệu tham khảo.

Vì không phải tất cả các ứng dụng email đều hiển thị mã HTML theo mặc định và một số người chỉ chọn nhận email thuần văn bản vì lý do bảo mật, việc thay thế email thuần văn bản bằng tin nhắn HTML khá quan trọng. Vì ứng dụng email sẽ hiển thị tệp đính kèm cuối cùng mà có nhiều phần trước tiên nên hãy đảm bảo thêm thông báo HTML sau phiên bản văn bản thuần túy. Trong ví dụ bên dưới, các đối tượng MIMEText() của chúng tôi sẽ chứa các phiên bản HTML, đoạn văn bản thường hay gọi hàm MINEMultipart("alternative") sẽ cho ra một kết quả duy nhất bằng 2 cách khác nhau:

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

sender_email = "[email protected]"
receiver_email = "[email protected]"
password = input("Type your password and press enter:")

message = MIMEMultipart("alternative")
message["Subject"] = "multipart test"
message["From"] = sender_email
message["To"] = receiver_email

# Create the plain-text and HTML version of your message
text = """\
Hi,
How are you?
Real Python has many great tutorials:
www.realpython.com"""
html = """\

  
    

Hi,
How are you?
Real Python has many great tutorials.

""" # Turn these into plain/html MIMEText objects part1 = MIMEText(text, "plain") part2 = MIMEText(html, "html") # Add HTML/plain-text parts to MIMEMultipart message # The email client will try to render the last part first message.attach(part1) message.attach(part2) # Create secure connection with server and send email context = ssl.create_default_context() with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server: server.login(sender_email, password) server.sendmail( sender_email, receiver_email, message.as_string() )

Trong ví dụ này, trước tiên, bạn định dạng tin nhắn thuần văn bản và HTML dưới dạng chuỗi ký tự, sau đó lưu trữ chúng dưới dạng đối tượng plain/htmlMIMEText. Những thứ này sau đó có thể được thêm vào theo thứ tự này vào tin nhắn MIMEMultipart ("alternative") và được gửi qua lớp bảo mật của bạn kết nối với máy chủ email. Hãy nhớ thêm mã HTML sau văn bản thay thế vì ứng dụng email sẽ cố gắng hiện thị phần phụ cuối cùng trước.

Thêm tệp đính kèm bằng gói email

Để gửi tệp nhị phân đến máy chủ email được thiết kế để hoạt động với dữ liệu văn bản, chúng cần được mã hóa trước khi vận chuyển. Điều này thường được thực hiện bằng cách sử dụng base64, mã hóa dữ liệu nhị phân thành các ký tự ASCII có thể in được.

Ví dụ mã dưới đây cho thấy cách gửi email với tệp PDF dưới dạng tệp đính kèm:

import email, smtplib, ssl

from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

subject = "An email with attachment from Python"
body = "This is an email with attachment sent from Python"
sender_email = "[email protected]"
receiver_email = "[email protected]"
password = input("Type your password and press enter:")

# Create a multipart message and set headers
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject
message["Bcc"] = receiver_email  # Recommended for mass emails

# Add body to email
message.attach(MIMEText(body, "plain"))

filename = "document.pdf"  # In same directory as script

# Open PDF file in binary mode
with open(filename, "rb") as attachment:
    # Add file as application/octet-stream
    # Email client can usually download this automatically as attachment
    part = MIMEBase("application", "octet-stream")
    part.set_payload(attachment.read())

# Encode file in ASCII characters to send by email    
encoders.encode_base64(part)

# Add header as key/value pair to attachment part
part.add_header(
    "Content-Disposition",
    f"attachment; filename= {filename}",
)

# Add attachment to message and convert message to string
message.attach(part)
text = message.as_string()

# Log in to server using secure context and send email
context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
    server.login(sender_email, password)
    server.sendmail(sender_email, receiver_email, text)

Thông báo MIMEultipart() chấp nhận các tham số ở dạng cặp khóa / giá trị kiểu RFC5233, được lưu trữ trong từ điển và được truyền cho hàm .add_header của lớp Message.

Xem thêm tài liệu về mô-đun email.mine để tìm hiểu thêm về cách sử dụng các lớp MINE.

3. Gửi nhiều email cá nhân

Hãy tưởng tượng bạn muốn gửi email đến mọi người trong công ty của mình để nhắc nhở họ đóng tiền. Hoặc bạn muốn gửi đến các sinh viên trong lớp của bạn tới các email cá nhân của từng người về điểm số bài tập của họ. Python thực hiện rất tốt những nhiệm vụ này.

Tạo một tệp CSV với thông tin cá nhân cần thiết

Đầu tiên để gửi nhiều email cá nhân thì chúng ta phải tạo file CSV(các thành phần cách nhau bởi dấu phẩy) có chứa tất cả thông tin cá nhân cần thiết. (Đảm bảo rằng không chia sẻ thông tin cá nhân khác của mọi người) Một tệp CSV là một bảng tính đơn giản, trong đó dòng đầu tiên thường chứa các tiêu đề cột.

Dưới đây là nội dung của tệp contact_file.csv mà tôi đã lưu trong cùng thư mục với code Python của mình. Nó chứa tên, địa chỉ và điểm cho một nhóm người hư cấu. Tôi đã sử dụng cấu trúc [email protected] để đảm bảo tất cả các email được gửi đến hộp thư đến của riêng tôi, trong ví dụ này là [email protected]:

Dưới đây là nội dung của tệp contact_file.csv được lưu trữ cùng thư mục với code Python của chúng tôi. Nó gồm tên, địa chỉ và điểm cho một nhóm người. Chúng tôi sử dụng cấu trúc [email protected] để đảm bảo rằng tất cả các email được gửi đến hộp thư đến của tôi, trong ví dụ này hộp thư của tôi là [email protected] :

name,email,grade
Ron Obvious,[email protected],B+
Killer Rabbit of Caerbannog,[email protected],A
Brian Cohen,[email protected],C

Khi tạo tệp CSV, đảm bảo tách các giá trị của bạn bằng dấu phẩy, không có bất kỳ khoảng trắng xung quanh nào.

Duyệt qua các hàng để gửi nhiều email

Ví dụ đoạn code dưới đây cho bạn thấy cách mở tệp CSV và lặp qua các dòng nội dung của nó (bỏ qua hàng tiêu đề). Để đảm bảo rằng code hoạt động chính xác trước khi bạn gửi email đến tất cả các địa chỉ liên hệ của bạn, tôi đã in Sending email to ... cho mỗi liên hệ, sau này chúng tôi có thể thay thế bằng chức năng gửi email thực sự:

import csv

with open("contacts_file.csv") as file:
    reader = csv.reader(file)
    next(reader)  # Skip header row
    for name, email, grade in reader:
        print(f"Sending email to {name}")
        # Send email here

Trong ví dụ trên, sử dụng với open (filename) as file: đảm bảo rằng tệp của bạn đóng ở cuối khối code. csv.reader () giúp bạn dễ dàng đọc từng dòng tệp CSV và trích xuất các giá trị của nó. Dòng next (reader) bỏ qua hàng tiêu đề sao cho dòng sau đây for name, email, grade in reader: chia các hàng tiếp theo bằng dấu phẩy và lưu các giá trị kết quả trong chuỗi name, email và grade cho liên hệ hiện tại.

Nếu các giá trị trong tệp CSV của bạn chứa khoảng trắng ở một hoặc cả hai bên, bạn có thể xóa chúng bằng hàm .strip().

Nội dung được cá nhân hóa

Bạn có thể đặt nội dung được cá nhân hóa vào một tin nhắn bằng cách sử dụng str.format () để điền vào chỗ dành cho dấu ngoặc nhọn. Ví dụ, “hi {name}, you {result} your asignment”.formart (name=”John ", result="passed") sẽ trả cho bạn kết quả “hi John, you passed your assignment"

Kể từ Python 3.6, định dạng chuỗi có thể được thực hiện một cách thanh lịch hơn bằng cách sử dụng f-strings, nhưng chúng yêu cầu các chỗ dành sẵn phải được xác định trước chính f-string. Để xác định thông báo email ở đầu tập lệnh và điền vào chỗ dành sẵn cho mỗi liên hệ khi duyệt qua các dòng trong tệp CSV, hàm .format () cũ hơn được sử dụng.

Với suy nghĩ này, bạn có thể thiết lập một nội dung thư chung, với các chỗ dành sẵn có thể được điều chỉnh cho các cá nhân.

Ví dụ Code

Ví dụ mã sau đây cho phép bạn gửi email cá nhân đến nhiều địa chỉ liên hệ. Nó lặp lại một tệp CSV có name, email, grade cho mỗi liên hệ, như trong ví dụ trên.

Thông báo chung được xác định ở phần đầu của tập lệnh và đối với mỗi liên hệ trong tệp CSV, các phần giữ chỗ {name} và {grade} của nó được điền vào và một email được cá nhân được gửi qua kết nối an toàn với máy chủ Gmail, như bạn thấy ở dưới đây:

import csv, smtplib, ssl

message = """Subject: Your grade

Hi {name}, your grade is {grade}"""
from_address = "[email protected]"
password = input("Type your password and press enter: ")

context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
    server.login(from_address, password)
    with open("contacts_file.csv") as file:
        reader = csv.reader(file)
        next(reader)  # Skip header row
        for name, email, grade in reader:
            server.sendmail(
                from_address,
                email,
                message.format(name=name,grade=grade),
            )

4. Yagmail

Có nhiều thư viện được thiết kế để giúp gửi email dễ dàng hơn, chẳng hạn như Envelopes, Flanker và Yagmail. Yagmail được thiết kế để hoạt động cụ thể với Gmail và nó đơn giản hóa đáng kể quá trình gửi email thông qua API, như bạn có thể thấy trong ví dụ code dưới đây: 

import yagmail

receiver = "[email protected]"
body = "Hello there from Yagmail"
filename = "document.pdf"

yag = yagmail.SMTP("[email protected]")
yag.send(
    to=receiver,
    subject="Yagmail test with attachment",
    contents=body, 
    attachments=filename,
)

Ví dụ đoạn code này gửi một email có tệp đính kèm PDF mà không sử dụng thư viện  email và smtplib.

Khi thiết lập Yagmail, bạn có thể thêm xác thực Gmail của mình vào bộ khóa của hệ điều hành xem trong tài liệu. Nếu bạn không làm điều này, Yagmail sẽ nhắc bạn nhập mật khẩu của bạn khi được yêu cầu và tự động lưu nó vào bộ khóa.

5. Dịch vụ gửi email

Nếu bạn có kế hoạch gửi một khối lượng lớn email, muốn xem số liệu thống kê email và muốn đảm bảo gửi thư đáng tin cậy, bạn nên xem xét các dịch vụ gửi email. Mặc dù tất cả các dịch vụ sau đây đều có gói trả phí để gửi số lượng lớn email, nhưng chúng cũng đi kèm với gói miễn phí để bạn có thể dùng thử. Một số gói miễn phí này có hiệu lực vô thời hạn và có thể đủ cho nhu cầu email của bạn.

Dưới đây là tổng quan về các gói miễn phí cho một số dịch vụ email giao dịch chính.

Nhà cung cấpGói miễn phí
Sendgrid 40.000 email trong 30 ngày đầu tiên, sau đó 100 email/ ngày
Sendinblue 300 email / ngày
Mailgun 10.000 email đầu tiên miễn phí
Mailjet 200 email / ngày
Amazon SES 62.000 email / tháng

Bạn có thể tìm kiếm trên Google để xem nhà cung cấp nào phù hợp nhất với nhu cầu của bạn hoặc chỉ cần thử một vài gói miễn phí để xem API nào bạn thích làm việc nhất.

6. Ví dụ với thư viện Sendgrid

Ví dụ sau sử dụng thư viện sendgird để gửi email:

import os
import sendgrid
from sendgrid.helpers.mail import Content, Email, Mail

sg = sendgrid.SendGridAPIClient(
    apikey=os.environ.get("SENDGRID_API_KEY")
)
from_email = Email("[email protected]")
to_email = Email("[email protected]")
subject = "A test email from Sendgrid"
content = Content(
    "text/plain", "Here's a test email sent through Python"
)
mail = Mail(from_email, subject, to_email, content)
response = sg.client.mail.send.post(request_body=mail.get())

# The statements below can be included for debugging purposes
print(response.status_code)
print(response.body)
print(response.headers)

Để chạy code này, trước tiên bạn phải:

  • Đăng ký tài khoản Sendgrid (miễn phí)
  • Yêu cầu khóa API để xác thực người dùng
  • Thêm khóa API của bạn bằng cách nhập setx SENDGRID_API_KEY "YOUR_API_KEY" trong Command Prompt (để lưu trữ khóa API này vĩnh viễn) hoặc set SENDGRID_API_KEY YOUR_API_KEY chỉ lưu trữ cho phiên khách hiện tại.

Để hiểu thêm về cách thiết lập Sendgrid cho Mac và Windows tham khảo trên Github.

Kết luận

Bây giờ bạn có thể bắt đầu kết nối SMTP một cách an toàn và gửi nhiều email cá nhân cho những người trong danh sách liên hệ của bạn!

Bạn đã học được cách gửi email có nội dung HTML bằng một văn bản thay thế đơn giản và đính kèm tệp vào email của bạn. Thư viện Yagmail giúp đơn giản hóa tất cả các tác vụ này khi bạn sử dụng tài khoản Gmail. Nếu bạn có kế hoạch gửi khối lượng lớn email, bạn có thể xem thêm các dịch vụ trao đổi email.

Thử trải nghiệm việc quản lý email bằng Python nhé!