Gửi email tự động từ một ứng dụng Python có thể được sử dụng cho nhiều mục đích khác nhau như gửi mã OTP, thông báo, báo cáo, hoặc thậm chí là marketing.
Trong bài viết này, chúng ta sẽ khám phá cách gửi email bằng Python sử dụng dịch vụ Gmail. Sử dụng tài khoản Gmail để gửi mail giúp bạn tiết kiệm thời gian setup mail server và độ ổn định của Gmail rất cao. Bạn sẽ gửi nội dung email thông qua server SMTP của Gmail để gửi đến cho người nhận.
Bài viết sẽ hướng dẫn bạn từng bước từ việc thiết lập môi trường cho đến việc gửi email với nội dung và file đính kèm. Chúng ta sẽ sử dụng thư viện smtplib của Python để thực hiện điều này.
Bài viết này giả sử rằng bạn đang đăng nhập vào Gmail thành công.
Lưu ý quan trọng
- Nếu bạn dùng tài khoản mới tạo để gửi mail thì tài khoản đó rất dễ bị đánh dấu là tài khoản spam. Nếu bị đánh dấu là spam bạn sẽ không gửi thư được nữa, thậm chí tệ hơn là Gmail không cho bạn đăng ký nữa.
- Bạn gửi quá nhiều mail, gửi cho nhiều người nhận, gửi liên tục cũng dễ bị đánh dấu là spam
- Nếu bạn gửi mail với mục đích tốt như gửi mail OTP, gửi mail nhắc người dùng trong dịch vụ của bạn mà mail lại vào hộp thư spam thì nhờ người dùng đánh dấu thư không phải spam
Mục Lục
1. Tạo app password
2. Thiết Lập Môi Trường
3. Viết Code Gửi Email
1. Tạo app password
App Password (mật khẩu ứng dụng) là một mật khẩu 16 ký tự được tạo ra bởi Google, cho phép ứng dụng hoặc thiết bị truy cập vào tài khoản Google của bạn một cách an toàn. Đây là một tính năng quan trọng, đặc biệt khi bạn đã bật xác thực hai yếu tố (2-Step Verification) cho tài khoản Google của mình. App Password giúp bảo vệ tài khoản của bạn khỏi việc bị truy cập trái phép mà không cần phải tắt xác thực hai yếu tố.
Sử dụng app password giúp bạn không sợ lộ password chính của Gmail khi nhúng vào code. Đồng thời bạn dễ dàng xóa đi app password nếu không muốn sử dụng nữa.
Truy cập vào link https://myaccount.google.com/apppasswords để tạo app password. Nhập app và ấn nút Create sẽ tạo được 1 password ngẫu nhiên giống như bên dưới. Và bạn dễ dàng xóa đi bất cứ lúc nào bạn muốn.
Bạn cần bật chế độ 2-Step Verification trên tài khoản Gmail của mình. Vào cài đặt tài khoản Google, chọn mục Security và bật như hình dưới
2. Thiết Lập Môi Trường
Trước tiên, bạn cần phải cài đặt Python trên máy tính của mình. Phiên bản tôi đang sử dụng để viết bài là Python 3.8.6 x64, chọn file Windows x86-64 executable installer như hình dưới
Sau khi cài đặt Python, bạn cần cài đặt thêm thư viện smtplib:
pip install smtplib
3. Viết Code Gửi Email
Để thực hiện việc này, chúng ta sẽ sử dụng thư viện smtplib để kết nối tới server SMTP của Gmail và thư viện email để tạo nội dung email.
Gửi Email Cơ Bản
Dưới đây là ví dụ cơ bản về cách gửi email sử dụng Python và Gmail, bạn có thể sử dụng Jupyter Notebook để test cho nhanh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart def send_email(subject, body, to_email): from_email = "your_email@gmail.com" password = "your_password" # Tạo một đối tượng MIMEMultipart msg = MIMEMultipart() msg['From'] = from_email msg['To'] = to_email msg['Subject'] = subject # Thêm phần thân email msg.attach(MIMEText(body, 'plain')) try: # Kết nối tới server SMTP của Gmail server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(from_email, password) text = msg.as_string() server.sendmail(from_email, to_email, text) server.quit() print("Email đã được gửi thành công!") except Exception as e: print(f"Không thể gửi email. Lỗi: {e}") |
Sử dụng hàm send_email
send_email("Tiêu đề email", "Nội dung email", "recipient_email@gmail.com")
Gửi email với nội dung html
Bạn cũng có thể gửi email với nội dung HTML để có thể định dạng email một cách đẹp mắt hơn:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart def send_html_email(subject, html_content, to_email): from_email = "your_email@gmail.com" password = "your_password" msg = MIMEMultipart() msg['From'] = from_email msg['To'] = to_email msg['Subject'] = subject msg.attach(MIMEText(html_content, 'html')) try: server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(from_email, password) text = msg.as_string() server.sendmail(from_email, to_email, text) server.quit() print("Email HTML đã được gửi thành công!") except Exception as e: print(f"Không thể gửi email. Lỗi: {e}") html_content = """ <html> <body> <h1>Chào bạn!</h1> <p>Đây là một email HTML.</p> </body> </html> """ |
Sử dụng hàm send_email
send_html_email("Tiêu đề email HTML", html_content, "recipient_email@gmail.com")
Gửi email kèm file đính kèm
Để gửi email kèm file đính kèm, bạn cần sử dụng đối tượng MIMEBase:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase from email import encoders def send_email_with_attachment(subject, body, to_email, filename): from_email = "your_email@gmail.com" password = "your_password" msg = MIMEMultipart() msg['From'] = from_email msg['To'] = to_email msg['Subject'] = subject msg.attach(MIMEText(body, 'plain')) # Đính kèm file attachment = open(filename, "rb") part = MIMEBase('application', 'octet-stream') part.set_payload(attachment.read()) encoders.encode_base64(part) part.add_header('Content-Disposition', f'attachment; filename= {filename}') msg.attach(part) try: server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(from_email, password) text = msg.as_string() server.sendmail(from_email, to_email, text) server.quit() print("Email kèm file đính kèm đã được gửi thành công!") except Exception as e: print(f"Không thể gửi email. Lỗi: {e}") |
Sử dụng hàm send_email
send_email_with_attachment("Tiêu đề email kèm file đính kèm", "Nội dung email", "recipient_email@gmail.com", "path/to/your/file.txt")
4. Xử lý lỗi
Khi gửi email, bạn có thể gặp một số lỗi phổ biến như sau:
Authentication Error: Kiểm tra lại email và mật khẩu của bạn. Đảm bảo rằng bạn đã bật tính năng “Less secure app access”.
Connection Error: Đảm bảo rằng bạn đã kết nối Internet và không có tường lửa chặn kết nối tới server SMTP của Gmail.
Email Not Sent: Kiểm tra lại định dạng email và thông tin người nhận.
5. Tổng kết
Qua bài viết này, bạn đã học cách gửi email bằng Python sử dụng dịch vụ Gmail. Chúng ta đã khám phá 3 cách: gửi email cơ bản, gửi email với nội dung HTML và gửi email kèm file đính kèm. Code trong bài đã được test cẩn thận, hy vọng bài viết này sẽ giúp ích cho bạn trong các dự án của mình.
Nếu bạn có bất kỳ câu hỏi hoặc góp ý nào, đừng ngần ngại để lại bình luận dưới bài viết này. Chúc bạn thành công!