Sử dụng python gửi mail dưới đây là đoạn code của bạn được đưa vào một class trong Python:
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage class EmailSender: def __init__(self, from_email, password): self.from_email = from_email self.password = password def send_email(self, to, subject, body, img_path=None): msg = MIMEMultipart() msg['From'] = self.from_email msg['To'] = to msg['Subject'] = subject # Attach image if available if img_path: with open(img_path, 'rb') as f: img_data = f.read() image = MIMEImage(img_data, name='image.png') msg.attach(image) # Attach body body = MIMEText(body) msg.attach(body) # Send email try: server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(self.from_email, self.password) text = msg.as_string() server.sendmail(self.from_email, to, text) server.quit() print('Mail sent successfully') return {"status_code": 204} except Exception as e: print('Something went wrong...', e) return {"status_code": 400} # Usage example if __name__ == "__main__": email_sender = EmailSender('[email protected]', 'xxx') email_sender.send_email('[email protected]', 'Subject', 'Email body', 'path/to/image.png')
Trong đoạn code trên:
Đây là một ví dụ về một template email HTML đẹp dạng bảng (table) để gửi qua email.
Template này gồm các trường id, name, giá, và link:
<!DOCTYPE html> <html> <head> <style> .email-container { font-family: Arial, sans-serif; line-height: 1.6; color: #333; background-color: #f9f9f9; padding: 20px; } .email-header { background-color: #4CAF50; color: white; padding: 10px 20px; text-align: center; font-size: 24px; } .email-body { padding: 20px; background-color: white; border: 1px solid #ddd; } .email-footer { margin-top: 20px; text-align: center; font-size: 12px; color: #888; } table { width: 100%; border-collapse: collapse; } th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; } th { background-color: #f2f2f2; } a { color: #4CAF50; text-decoration: none; } a:hover { text-decoration: underline; } </style> </head> <body> <div class="email-container"> <div class="email-header"> Sản phẩm mới </div> <div class="email-body"> <p>Chào bạn,</p> <p>Chúng tôi vui mừng thông báo rằng có những sản phẩm mới đang chờ đợi bạn. Dưới đây là danh sách sản phẩm:</p> <table> <tr> <th>ID</th> <th>Tên</th> <th>Giá</th> <th>Link</th> </tr> <tr> <td>1</td> <td>Sản phẩm A</td> <td>100.000 VND</td> <td><a href="http://example.com">Xem chi tiết</a></td> </tr> <tr> <td>2</td> <td>Sản phẩm B</td> <td>200.000 VND</td> <td><a href="http://example.com">Xem chi tiết</a></td> </tr> <!-- Thêm các hàng khác tương tự ở đây --> </table> <p>Trân trọng,</p> <p>Đội ngũ của chúng tôi</p> </div> <div class="email-footer"> © 2024 Công ty của bạn. Mọi quyền được bảo lưu. </div> </div> </body> </html>
Để gửi email với template này trong Python, bạn có thể sửa phương thức send_email của EmailSender để chấp nhận nội dung HTML:
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage class EmailSender: def __init__(self, from_email, password): self.from_email = from_email self.password = password def send_email(self, to, subject, body, img_path=None): msg = MIMEMultipart() msg['From'] = self.from_email msg['To'] = to msg['Subject'] = subject # Attach image if available if img_path: with open(img_path, 'rb') as f: img_data = f.read() image = MIMEImage(img_data, name='image.png') msg.attach(image) # Attach body (HTML) body = MIMEText(body, 'html') msg.attach(body) # Send email try: server = smtplib.SMTP('smtp.gmail.com', 587) server.starttls() server.login(self.from_email, self.password) text = msg.as_string() server.sendmail(self.from_email, to, text) server.quit() print('Mail sent successfully') return {"status_code": 204} except Exception as e: print('Something went wrong...', e) return {"status_code": 400} # Usage example if __name__ == "__main__": email_sender = EmailSender('[email protected]', 'xxx') html_body = """ <!DOCTYPE html> <html> <head> <style> .email-container { font-family: Arial, sans-serif; line-height: 1.6; color: #333; background-color: #f9f9f9; padding: 20px; } .email-header { background-color: #4CAF50; color: white; padding: 10px 20px; text-align: center; font-size: 24px; } .email-body { padding: 20px; background-color: white; border: 1px solid #ddd; } .email-footer { margin-top: 20px; text-align: center; font-size: 12px; color: #888; } table { width: 100%; border-collapse: collapse; } th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; } th { background-color: #f2f2f2; } a { color: #4CAF50; text-decoration: none; } a:hover { text-decoration: underline; } </style> </head> <body> <div> <div> Sản phẩm mới </div> <div> <p>Chào bạn,</p> <p>Chúng tôi vui mừng thông báo rằng có những sản phẩm mới đang chờ đợi bạn. Dưới đây là danh sách sản phẩm:</p> <table> <tr> <th>ID</th> <th>Tên</th> <th>Giá</th> <th>Link</th> </tr> <tr> <td>1</td> <td>Sản phẩm A</td> <td>100.000 VND</td> <td><a href="http://example.com">Xem chi tiết</a></td> </tr> <tr> <td>2</td> <td>Sản phẩm B</td> <td>200.000 VND</td> <td><a href="http://example.com">Xem chi tiết</a></td> </tr> <!-- Thêm các hàng khác tương tự ở đây --> </table> <p>Trân trọng,</p> <p>Đội ngũ của chúng tôi</p> </div> <div> © 2024 Công ty của bạn. Mọi quyền được bảo lưu. </div> </div> </body> </html> """ email_sender.send_email('[email protected]', 'Sản phẩm mới', html_body)
Template HTML trên có thể được tùy chỉnh thêm dựa trên nhu cầu của bạn.
Hãy đảm bảo rằng bạn kiểm tra email để đảm bảo rằng nó hiển thị đúng định dạng như mong muốn.
Bạn có thể dựng 1 base service chuyên dùng cho gửi mail như ảnh bên dưới
Đây là cách bạn có thể sử dụng các trường trong bảng Product để tạo ra nội dung HTML động và gửi email:
Dưới đây là ví dụ minh họa:
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from your_module import Product # Thay bằng module chứa class Product from datetime import datetime # Thiết lập kết nối tới cơ sở dữ liệu engine = create_engine('your_database_url') Session = sessionmaker(bind=engine) session = Session() # Truy xuất dữ liệu sản phẩm từ cơ sở dữ liệu products = session.query(Product).filter_by(deleted=False).all() # Tạo nội dung HTML từ dữ liệu sản phẩm html_body = """ <!DOCTYPE html> <html> <head> <style> .email-container { font-family: Arial, sans-serif; line-height: 1.6; color: #333; background-color: #f9f9f9; padding: 20px; } .email-header { background-color: #4CAF50; color: white; padding: 10px 20px; text-align: center; font-size: 24px; } .email-body { padding: 20px; background-color: white; border: 1px solid #ddd; } .email-footer { margin-top: 20px; text-align: center; font-size: 12px; color: #888; } table { width: 100%; border-collapse: collapse; } th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; } th { background-color: #f2f2f2; } a { color: #4CAF50; text-decoration: none; } a:hover { text-decoration: underline; } </style> </head> <body> <div> <div> Sản phẩm mới </div> <div> <p>Chào bạn,</p> <p>Chúng tôi vui mừng thông báo rằng có những sản phẩm mới đang chờ đợi bạn. Dưới đây là danh sách sản phẩm:</p> <table> <tr> <th>ID</th> <th>Tên</th> <th>Giá</th> <th>Link</th> </tr>""" # Chèn dữ liệu sản phẩm vào HTML for product in products: html_body += f""" <tr> <td>{product.id}</td> <td>{product.name}</td> <td>{product.price}</td> <td><a href="{product.link}">Xem chi tiết</a></td> </tr>""" html_body += """ </table> <p>Trân trọng,</p> <p>Đội ngũ của chúng tôi</p> </div> <div> © 2024 Công ty của bạn. Mọi quyền được bảo lưu. </div> </div> </body> </html> """ # Sử dụng class EmailSender để gửi email với nội dung HTML email_sender = EmailSender('[email protected]', 'xxx') email_sender.send_email('[email protected]', 'Sản phẩm mới', html_body)
Trong ví dụ trên:
Code này sẽ tạo một bảng HTML động từ dữ liệu sản phẩm và gửi email với nội dung HTML đó.
Bạn có thể tùy chỉnh thêm giao diện hoặc nội dung HTML dựa trên nhu cầu của bạn.
Kết quả sau khi chạy đoạn code
Bạn có thể định dạng lại giá trước khi hiển thị trong email bằng cách sử dụng một hàm format.
Ví dụ, bạn có thể thêm dấu phân cách hàng nghìn và thêm đơn vị tiền tệ.
Dưới đây là cách làm:
Dưới đây là cách thực hiện:
from sqlalchemy import create_engine from sqlalchemy.orm import sessionmaker from your_module import Product # Thay bằng module chứa class Product from datetime import datetime # Thiết lập kết nối tới cơ sở dữ liệu engine = create_engine('your_database_url') Session = sessionmaker(bind=engine) session = Session() # Hàm định dạng giá def format_price(price): try: price = float(price) return f"{price:,.0f} VND" # Định dạng với dấu phẩy hàng nghìn và thêm đơn vị VND except ValueError: return price # Truy xuất dữ liệu sản phẩm từ cơ sở dữ liệu products = session.query(Product).filter_by(deleted=False).all() # Tạo nội dung HTML từ dữ liệu sản phẩm html_body = """ <!DOCTYPE html> <html> <head> <style> .email-container { font-family: Arial, sans-serif; line-height: 1.6; color: #333; background-color: #f9f9f9; padding: 20px; } .email-header { background-color: #4CAF50; color: white; padding: 10px 20px; text-align: center; font-size: 24px; } .email-body { padding: 20px; background-color: white; border: 1px solid #ddd; } .email-footer { margin-top: 20px; text-align: center; font-size: 12px; color: #888; } table { width: 100%; border-collapse: collapse; } th, td { padding: 10px; text-align: left; border-bottom: 1px solid #ddd; } th { background-color: #f2f2f2; } a { color: #4CAF50; text-decoration: none; } a:hover { text-decoration: underline; } </style> </head> <body> <div> <div> Sản phẩm mới </div> <div> <p>Chào bạn,</p> <p>Chúng tôi vui mừng thông báo rằng có những sản phẩm mới đang chờ đợi bạn. Dưới đây là danh sách sản phẩm:</p> <table> <tr> <th>ID</th> <th>Tên</th> <th>Giá</th> <th>Link</th> </tr>""" # Chèn dữ liệu sản phẩm vào HTML for product in products: formatted_price = format_price(product.price) html_body += f""" <tr> <td>{product.id}</td> <td>{product.name}</td> <td>{formatted_price}</td> <td><a href="{product.link}">Xem chi tiết</a></td> </tr>""" html_body += """ </table> <p>Trân trọng,</p> <p>Đội ngũ của chúng tôi</p> </div> <div> © 2024 Công ty của bạn. Mọi quyền được bảo lưu. </div> </div> </body> </html> """ # Sử dụng class EmailSender để gửi email với nội dung HTML email_sender = EmailSender('[email protected]', 'xxx') email_sender.send_email('[email protected]', 'Sản phẩm mới', html_body)
Trong đoạn mã này, hàm format_price sẽ định dạng giá trị giá với dấu phân cách hàng nghìn và thêm đơn vị tiền tệ VND.
Hàm này được sử dụng để định dạng giá trước khi chèn vào nội dung HTML.
Format lại cho giá dễ nhìn và thêm nhiều mục khác
#Mtips5s #Contact
Fanpage: https://www.facebook.com/mtipscoder
Group trao đổi, chia sẻ: https://www.facebook.com/groups/mtipscoder
Website: https://mtips5s.com
Youtube: https://mtips5s.com
Twitter(X): @takagiks99
Instagram: @khuongkara
Threads: @khuongkara
Google Maps: @khuongkara
#Base Code #Souce Code
Bộ công cụ My Self: @tools.mtips5s.com
Github: @github
Npm: @npm
Docker: @docker
Chúc các bạn thành công!
Leave A Comment