Hướng dẫn email python - trăn thư điện tử

Bạn cần gì để gửi email với Python? Chỉ một chút kiến thức lập trình web sử dụng Python cơ bản. Hướng dẫn này sẽ hướng dẫn bạn qua các bước cần thiết nhất để gửi email qua máy chủ SMTP:

  • Cấu hình một server local để testing
  • Máy chủ SMTP local
  • Mailtrap để test máy chủ SMTP local
  • Các loại email khác nhau: HTML, có hình ảnh và tệp đính kèm
  • Gửi nhiều email được cá nhân hóa
  • Một số tùy chọn gửi email phổ biến như Gmail và dịch vụ email giao dịch

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

Tin tốt đầu tiên về Python là nó có một module tích hợp sẵn để gửi email qua SMTP trong thư viện chuẩn của nó. Không cần cài đặt thêm hoặc thủ thuật. Bạn có thể nhập module bằng cách sử dụng câu lệnh sau:

import smtplib

Để đảm bảo rằng module đã được nhập đúng cách và có được mô tả đầy đủ về các lớp và đối số của nó, hãy nhập một Python session:

help[smtplib]

Ở bước tiếp theo, mình sẽ nói một chút về cách cấu hình máy chủ SMTP.

Tạo một máy chủ SMTP để test email trong Python

Khi viết một ứng dụng mới hoặc thêm bất kỳ chức năng nào, đặc biệt là khi thực hiện lần đầu tiên, bạn nên test nó trên một máy chủ thử nghiệm. Dưới đây là vài lý do bạn rất cần làm việc đó:

  • Bạn không lỡ tay gửi hàng trăm email cho bạn bè, khách hàng hay tệ hơn nữa là người lạ. Nó sẽ thành một incident rất lớn đấy.
  • Bạn không làm hòm thư của bạn tràn ngập với đống mail test.
  • Tên miền của bạn không bị liệt vào danh sách đen do spam.

Và với Python bạn có 2 lựa chọn để tạo một máy chủ để test :3

tạo một local SMTP server

Nếu bạn thích làm việc trong môi trường local, máy chủ SMTP local là một lựa chọn rất hợp lý. Python cung cấp một module smtpd. Nó có tính năng DebuggingServer, sẽ loại bỏ các email bạn đang gửi và sẽ in chúng ra ở stdout.

Để chạy SMTP server ở cổng 1025 bạn sẽ dùng lệnh sau:

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

Để chạy máy chủ SMTP trên cổng 25, bạn sẽ cần có quyền root:

sudo python -m smtpd -n -c DebuggingServer localhost: 25

Nó sẽ giúp bạn xác minh xem mã của bạn có hoạt động hay không và chỉ ra các vấn đề có thể xảy ra nếu có. Tuy nhiên, với nó bạn không có cơ hội kiểm tra mẫu email HTML của bạn được hiển thị như thế nào. Lúc này một server SMTP giả sẽ thứ bạn tìm tới.

Giả SMTP server

Máy chủ SMTP giả bắt chước công việc của máy chủ thực sự. Trong các ví dụ khác trong bài viết này, mình sẽ sử dụng Mailtrap. Ngoài việc kiểm tra gửi email, nó sẽ cho phép chúng ta kiểm tra xem email sẽ được hiển thị và hiển thị như thế nào, xem lại dữ liệu thô của tin nhắn cũng như sẽ cung cấp cho chúng ta một báo cáo spam. Mailtrap rất dễ thiết lập: bạn sẽ chỉ cần sao chép thông tin đăng nhập do ứng dụng tạo ra và dán chúng vào mã của bạn.

SMTP Server for Testing: Cloud-based or Local?

Feel free to let us know what content would be useful for you!

""" # convert both parts to MIMEText objects and add them to the MIMEMultipart message part1 = MIMEText[text, "plain"] part2 = MIMEText[html, "html"] message.attach[part1] message.attach[part2] # send your email with smtplib.SMTP["smtp.mailtrap.io", 2525] as server: server.login[login, password] server.sendmail[ sender_email, receiver_email, message.as_string[] ] print['Sent']

Kết quả:

Gửi email với tệp đính kèm trong Python

Bước tiếp theo trong việc thành thạo gửi email bằng Python là đính kèm tệp. Tệp đính kèm vẫn là đối tượng của MIME nhưng chúng ta cần mã hóa chúng bằng module base64. Một vài điểm quan trọng về các tệp đính kèm:

  • Python cho phép bạn đính kèm tệp văn bản, hình ảnh, tệp âm thanh và thậm chí các ứng dụng. Bạn chỉ cần sử dụng lớp email thích hợp như email.mime.audio.MIMEAudio hoặc email.mime.image.MIMEImage. Để biết thông tin đầy đủ, hãy tham khảo phần này của tài liệu Python.
  • Hãy nhớ về kích thước tệp: gửi tệp trên 20MB là một thực tế xấu. Trong các email giao dịch, các tệp PDF được sử dụng thường xuyên nhất: chúng ta thường nhận được biên lai, vé, thẻ lên máy bay, xác nhận đơn đặt hàng, v.v ... Vì vậy, hãy xem lại cách gửi thẻ lên máy bay dưới dạng tệp PDF.

Đầu vào:

import smtplib

# import the corresponding modules
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

port = 2525 
smtp_server = "smtp.mailtrap.io"
login = "1a2b3c4d5e6f7g" # paste your login generated by Mailtrap
password = "1a2b3c4d5e6f7g" # paste your password generated by Mailtrap

subject = "An example of boarding pass"
sender_email = ""
receiver_email = ""

message = MIMEMultipart[]
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = subject

# Add body to email
body = "This is an example of how you can send a boarding pass in attachment with Python"
message.attach[MIMEText[body, "plain"]]

filename = "yourBP.pdf"
# Open PDF file in binary mode

# We assume that the file is in the directory where you run your Python script from
with open[filename, "rb"] as attachment:
    # The content type "application/octet-stream" means that a MIME attachment is a binary file
    part = MIMEBase["application", "octet-stream"]
    part.set_payload[attachment.read[]]

# Encode to base64
encoders.encode_base64[part]

# Add header 
part.add_header[
    "Content-Disposition",
    f"attachment; filename= {filename}",
]

# Add attachment to your message and convert it to string
message.attach[part]
text = message.as_string[]

# send your email
with smtplib.SMTP["smtp.mailtrap.io", 2525] as server:
    server.login[login, password]
    server.sendmail[
        sender_email, receiver_email, text
    ]
print['Sent']

Kết quả:

Để đính kèm nhiều tệp, bạn có thể gọi phương thức message.attach [] nhiều lần.

Cách gửi email có đính kèm hình ảnh

Hình ảnh, ngay cả khi chúng là một phần của nội dung thư, cũng là tệp đính kèm. Có ba loại trong số chúng: tệp đính kèm CID [được nhúng dưới dạng đối tượng MIME], hình ảnh định dạng base64 [nhúng trong code] và hình ảnh được liên kết.

Để thêm tệp đính kèm CID, chúng tôi sẽ tạo một email MIME với thành phần MIMEImage:

Đầu vào:

# import all necessary components
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

port = 2525
smtp_server = "smtp.mailtrap.io"
login = "1a2b3c4d5e6f7g" # paste your login generated by Mailtrap
password = "1a2b3c4d5e6f7g" # paste your password generated by Mailtrap

sender_email = ""
receiver_email = ""
message = MIMEMultipart["alternative"]
message["Subject"] = "CID image test"
message["From"] = sender_email
message["To"] = receiver_email

# write the HTML part
html = """\

 
   
 

"""

part = MIMEText[html, "html"]
message.attach[part]

# We assume that the image file is in the same directory that you run your Python script from
FP = open['mailtrap.jpg', 'rb']
image = MIMEImage[fp.read[]]
fp.close[]

# Specify the  ID according to the img src in the HTML part
image.add_header['Content-ID', '']
message.attach[image]

# send your email
with smtplib.SMTP["smtp.mailtrap.io", 2525] as server:
   server.login[login, password]
   server.sendmail[
       sender_email, receiver_email, message.as_string[]
   ]
print['Sent']

Kết quả:

Để đính kèm nhiều tệp, bạn có thể gọi phương thức message.attach [] nhiều lần.

Cách gửi email có đính kèm hình ảnh

# import the necessary components first
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import base64

port = 2525
smtp_server = "smtp.mailtrap.io"
login = "1a2b3c4d5e6f7g" # paste your login generated by Mailtrap
password = "1a2b3c4d5e6f7g" # paste your password generated by Mailtrap

sender_email = ""
receiver_email = ""
message = MIMEMultipart["alternative"]
message["Subject"] = "inline embedding"
message["From"] = sender_email
message["To"] = receiver_email

# We assume that the image file is in the same directory that you run your Python script from
encoded = base64.b64encode[open["mailtrap.jpg", "rb"].read[]].decode[]

html = f"""\

 
   
 

"""

part = MIMEText[html, "html"]
message.attach[part]

# send your email
with smtplib.SMTP["smtp.mailtrap.io", 2525] as server:
   server.login[login, password]
   server.sendmail[
       sender_email, receiver_email, message.as_string[]
   ]
print['Sent']

Kết quả:

Để đính kèm nhiều tệp, bạn có thể gọi phương thức message.attach [] nhiều lần.

Cách gửi email có đính kèm hình ảnh

Hình ảnh, ngay cả khi chúng là một phần của nội dung thư, cũng là tệp đính kèm. Có ba loại trong số chúng: tệp đính kèm CID [được nhúng dưới dạng đối tượng MIME], hình ảnh định dạng base64 [nhúng trong code] và hình ảnh được liên kết.

Để thêm tệp đính kèm CID, chúng tôi sẽ tạo một email MIME với thành phần MIMEImage:

Hình ảnh CID được hiển thị cả dưới dạng một phần của thông điệp HTML và dưới dạng tệp đính kèm. Các thư có loại hình ảnh này thường được coi là thư rác: kiểm tra tab Analytics trong Mailtrap để xem tỷ lệ spam và các đề xuất về cải tiến của nó. Nhiều ứng dụng email - cụ thể là Gmail - không thể hiển thị hình ảnh CID trong hầu hết các trường hợp. Vì vậy, hãy cùng xem lại cách nhúng hình ảnh được mã hóa base64.

help[smtplib]
0

Ở đây mình sẽ sử dụng module base64 và thử nghiệm với cùng một tệp ảnh:

Đầu vào:

help[smtplib]
1

Bây giờ hình ảnh được nhúng vào thông điệp HTML và không hiển thị dưới dạng tệp đính kèm. Python đã mã hóa hình ảnh jpg của mình và nếu chúng ta đi đến tab Nguồn HTML, chúng ta sẽ thấy chuỗi dữ liệu hình ảnh dài trong img src.

help[smtplib]
2

Kết quả:

Bài Viết Liên Quan

Chủ Đề