CodeGym /Các khóa học /Python SELF VI /Làm việc với email

Làm việc với email

Python SELF VI
Mức độ , Bài học
Có sẵn

8.1 Đọc email

Mình nghĩ là tụi mình đã hiểu đủ về nền tảng của mạng. Giờ mình đi vào cái gì thú vị hơn nhé — vì mạng có bao nhiêu thứ hay ho lắm. Thử đọc và gửi email xem sao?

Email đã xuất hiện 50 năm trước, trước cả trình duyệt đầu tiên những 20 năm. Khi đó người ta dùng các chương trình đặc biệt để gửi email. Điều này có nghĩa gì với tụi mình? Là chuẩn (protocol) của email đơn giản như đan rổ.

Protocol POP3 (Post Office Protocol version 3) được dùng để nhận email từ máy chủ. Khác với IMAP, POP3 thường tải email về máy tính cục bộ và xóa chúng khỏi máy chủ. Trong Python, để làm việc với POP3 thì có thể dùng thư viện poplib.

Lưu ý: Khác với POP3, protocol IMAP (Internet Message Access Protocol) cho phép lưu giữ email trên máy chủ và đồng bộ hóa trạng thái của chúng giữa các thiết bị. IMAP tiện hơn nếu bạn đọc email trên nhiều thiết bị, còn POP3 thì thích hợp hơn nếu bạn lưu giữ email cục bộ trên một thiết bị.

Các bước chính để nhận danh sách email:

  • Kết nối với máy chủ email.
  • Xác thực.
  • Nhận danh sách email.
  • Tải và đọc email.
  • Ngắt kết nối khỏi máy chủ.

Để viết ứng dụng đầu tiên, bạn cần hai thư viện: poplibemail. Nếu bạn chưa có, hãy cài đặt. Bạn đã biết cách dùng pip rồi.

Quan trọng: Khi làm việc với email, luôn giữ các biện pháp an toàn. Không bao giờ lưu mật khẩu trực tiếp trong mã. Sử dụng biến môi trường hoặc kho dữ liệu bảo mật cho thông tin đăng nhập. Cũng đảm bảo rằng mã của bạn sẽ không bị công khai để tránh lộ thông tin bí mật.

1. Kết nối và xác thực:

Kết nối đến máy chủ email thông qua SSL và đăng nhập vào hộp thư với các thông tin đăng nhập đã cho.


mailbox = poplib.POP3_SSL(pop3_server)
mailbox.user(username)
mailbox.pass_(password)  # Sử dụng pass_ để tránh xung đột với từ khóa pass trong Python

2. Nhận thông tin về hộp thư:

Nhận số lượng email trong hộp thư.


num_messages = len(mailbox.list()[1])
print(f"Số lượng email: {num_messages}")

3. Tải và đọc email:

Tải và đọc email cuối cùng.


# Ví dụ: Đọc email cuối cùng
if num_messages > 0:
    response, lines, octets = mailbox.retr(num_messages)
    message = '\n'.join(line.decode('utf-8') for line in lines)
    print("Nội dung email cuối cùng:")
    print(message)

Để phân tích và hiển thị nội dung thì có thư viện đặc biệt — email. Nó có thể giải mã nội dung email, các tệp đính kèm, bao gồm cả tiêu đề và thân email.

Đây là cách mà phiên bản cuối cùng của client email của chúng ta sẽ trông như.


import poplib

# Thông tin đăng nhập
username = 'your_email@example.com'
password = 'your_password'
            
# Kết nối đến máy chủ email Gmail
pop3_server = 'pop.gmail.com'
mailbox = poplib.POP3_SSL(pop3_server, 995)
            
# Đăng nhập vào hộp thư
mailbox.user(username)
mailbox.pass_(password)  # Sử dụng pass_ để tránh xung đột với từ khóa pass trong Python
            
# Nhận thông tin về hộp thư
num_messages = len(mailbox.list()[1])
print(f"Số lượng email: {num_messages}")
            
# Ví dụ: Đọc email cuối cùng
if num_messages > 0:
    response, lines, octets = mailbox.retr(num_messages)
    message = '\n'.join(line.decode('utf-8') for line in lines)
    print("Nội dung email cuối cùng:")
    print(message)
            
# Đóng kết nối
mailbox.quit()

Bạn có thể thử đọc email của mình, chỉ cần cung cấp đúng POP3-server. Ví dụ, trong ví dụ trên mình dùng dữ liệu của server Gmail. Nếu bạn có máy chủ email khác, thì thông tin của nó dễ dàng tìm thấy trên mạng.

8.2 Gửi email

Để gửi email bằng protocol SMTP (Simple Mail Transfer Protocol) trong Python có thể sử dụng thư viện tích hợp sẵn smtplib. Module này cung cấp các hàm để thiết lập kết nối với SMTP-server, xác thực và gửi email.

Các bước chính để gửi email:

  • Kết nối với SMTP-server.
  • Xác thực.
  • Tạo thông điệp.
  • Gửi thông điệp.
  • Đóng kết nối.

1. Kết nối với SMTP-server:

Kết nối đến SMTP-server và chuyển sang kết nối bảo mật bằng TLS.


server = smtplib.SMTP(smtp_server, smtp_port)
server.starttls()  # Kết nối bảo mật

2. Xác thực:

Thực hiện đăng nhập vào SMTP-server với thông tin đăng nhập.


server.login(username, password)

3. Tạo thông điệp đơn giản ở dạng chuỗi:


message = f"From: {from_addr}\nTo: {to_addr}\nSubject: {subject}\n\n{body}"

4. Gửi thông điệp:


server.sendmail(from_addr, to_addr, message)

5. Đóng kết nối:


server.quit()

Trông có vẻ đơn giản hơn lần trước, điều này thật tuyệt.

Toàn bộ mã với xử lý lỗi sẽ trông như sau:


import smtplib

# Thông tin đăng nhập
smtp_server = 'smtp.gmail.com'
smtp_port = 587
username = 'your_email@gmail.com'
password = 'your_app_password'  # Sử dụng mật khẩu ứng dụng
            
# Địa chỉ người gửi và người nhận
from_addr = 'your_email@gmail.com'
to_addr = 'recipient@example.com'
            
# Chủ đề và nội dung email
subject = 'Chủ đề email'
body = 'Đây là nội dung email.'
            
# Tạo thông điệp ở dạng chuỗi
message = f"From: {from_addr}\nTo: {to_addr}\nSubject: {subject}\n\n{body}"
            
try:
    # Kết nối đến SMTP-server
    server = smtplib.SMTP(smtp_server, smtp_port)
    server.starttls()  # Kết nối bảo mật
            
    # Xác thực
    server.login(username, password)
            
    # Gửi thông điệp
    server.sendmail(from_addr, to_addr, message)
    print("Email đã được gửi thành công!")
except Exception as e:
    print(f"Lỗi khi gửi email: {e}")
finally:
    # Đóng kết nối
    server.quit()

Phần lớn mã ở đây là lời bình luận và cấu hình server, thực tế có thể gửi email trong 5 dòng. Hãy thử — nó rất thú vị.

Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION