Bạn có thể gửi email trong Python bằng cách sử dụng một số thư viện, nhưng những thư viện phổ biến nhất là smtplib và email .
Mô-đun "smtplib" trong Python định nghĩa một đối tượng phiên SMTP client có thể được sử dụng để gửi mail đến bất kỳ máy Internet nào có daemon lắng nghe SMTP hoặc ESMTP. Gói email là một thư viện để quản lý các tin nhắn email, bao gồm MIME và các tài liệu tin nhắn dựa trên RFC 2822 khác.
An application that handles and delivers e-mail over the Internet is called a "mail server". Simple Mail Transfer Protocol (SMTP) is a protocol, which handles sending an e-mail and routing e-mail between mail servers. It is an Internet standard for email transmission.
Hàm smtplib.SMTP() trong Python được sử dụng để tạo một đối tượng phiên làm việc SMTP, giúp thiết lập kết nối với một máy chủ SMTP. Kết nối này cho phép bạn gửi email thông qua máy chủ.
Trước khi gửi email, bạn cần thiết lập một máy chủ SMTP. Các máy chủ SMTP phổ biến bao gồm những máy chủ được cung cấp bởi Gmail, Yahoo hoặc các nhà cung cấp dịch vụ email khác.
Để gửi một email, bạn cần lấy đối tượng của lớp SMTP bằng cách sử dụng hàm sau −
import smtplib smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Dưới đây là chi tiết của các tham số −
host − Đây là máy chủ đang chạy máy chủ SMTP của bạn. Bạn có thể chỉ định địa chỉ IP của máy chủ hoặc một tên miền như tutorialspoint.com . Đây là một tham số tùy chọn.
port − Nếu bạn cung cấp đối số host, thì bạn cần chỉ định một cổng, nơi máy chủ SMTP đang lắng nghe. Thông thường, cổng này sẽ là 25.
local_hostname − Nếu máy chủ SMTP của bạn đang chạy trên máy cục bộ, bạn có thể chỉ định localhost làm tùy chọn.
Example
Kịch bản sau kết nối đến máy chủ SMTP tại "smtp.example.com" trên cổng 25, tùy chọn xác định và bảo mật kết nối, đăng nhập (nếu cần), gửi một email và sau đó thoát khỏi phiên làm việc.
import smtplib # Create an SMTP object and establish a connection to the SMTP server smtpObj = smtplib.SMTP('smtp.example.com', 25) # Identify yourself to an ESMTP server using EHLO smtpObj.ehlo() # Secure the SMTP connection smtpObj.starttls() # Login to the server (if required) smtpObj.login('username', 'password') # Send an email from_address = 'your_email@example.com' to_address = 'recipient@example.com' message = """\ Subject: Test Email This is a test email message. """ smtpObj.sendmail(from_address, to_address, message) # Quit the SMTP session smtpObj.quit()
Mô-đun smtpd của Python được sử dụng để tạo và quản lý một máy chủ giao thức chuyển phát thư đơn giản (SMTP). Mô-đun này cho phép bạn thiết lập một máy chủ SMTP có thể nhận và xử lý các tin nhắn email đến, điều này rất hữu ích cho việc kiểm tra và gỡ lỗi các chức năng email trong các ứng dụng.
Mô-đun smtpd được cài sẵn cùng với Python và bao gồm một máy chủ gỡ lỗi SMTP cục bộ. Máy chủ này hữu ích cho việc kiểm tra chức năng email mà không thực sự gửi email đến các địa chỉ đã chỉ định; thay vào đó, nó in nội dung email ra bảng điều khiển.
Chạy máy chủ cục bộ này loại bỏ nhu cầu xử lý 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 đầu máy chủ gỡ lỗi SMTP cục bộ bằng cách sử dụng lệnh sau trong Command Prompt hoặc terminal −
python -m smtpd -c DebuggingServer -n localhost:1025
Example
Ví dụ dưới đây minh họa cách gửi một email giả bằng cách sử dụng chức năng smtplib cùng với máy chủ gỡ lỗi SMTP cục bộ −
import smtplib def prompt(prompt): return input(prompt).strip() fromaddr = prompt("From: ") toaddrs = prompt("To: ").split() print("Enter message, end with ^D (Unix) or ^Z (Windows):") # Add the From: and To: headers at the start! msg = ("From: %s\r\nTo: %s\r\n\r\n" % (fromaddr, ", ".join(toaddrs))) while True: try: line = input() except EOFError: break if not line: break msg = msg + line print("Message length is", len(msg)) server = smtplib.SMTP('localhost', 1025) server.set_debuglevel(1) server.sendmail(fromaddr, toaddrs, msg) server.quit()
Trong ví dụ này −
From − Bạn nhập địa chỉ email của người gửi (fromaddr).
To − Bạn nhập địa chỉ email của người nhận (toaddrs), có thể là nhiều địa chỉ được phân tách bằng khoảng trắng.
Message − Bạn nhập nội dung tin nhắn, được kết thúc bằng ^D (Unix) hoặc ^Z (Windows).
Phương thức sendmail() của "smtplib" gửi email sử dụng người gửi, người nhận và nội dung tin nhắn được chỉ định đến máy chủ gỡ lỗi SMTP cục bộ đang chạy trên "localhost" tại cổng "1025".
Output
Khi bạn chạy chương trình, bảng điều khiển sẽ xuất ra thông tin liên lạc giữa chương trình và máy chủ SMTP. Trong khi đó, terminal đang chạy máy chủ SMTPD sẽ hiển thị nội dung tin nhắn đến, giúp bạn gỡ lỗi và xác minh quá trình gửi email.
python example.py From: abc@xyz.com To: xyz@abc.com Enter message, end with ^D (Unix) or ^Z (Windows): Hello World ^Z
Bảng điều khiển phản ánh nhật ký sau −
From: abc@xyz.com reply: retcode (250); Msg: b'OK' send: 'rcpt TO:<xyz@abc.com>\r\n' reply: b'250 OK\r\n' reply: retcode (250); Msg: b'OK' send: 'data\r\n' reply: b'354 End data with <CR><LF>.<CR><LF>\r\n' reply: retcode (354); Msg: b'End data with <CR><LF>.<CR><LF>' data: (354, b'End data with <CR><LF>.<CR><LF>') send: b'From: abc@xyz.com\r\nTo: xyz@abc.com\r\n\r\nHello World\r\n.\r\n' reply: b'250 OK\r\n' reply: retcode (250); Msg: b'OK' data: (250, b'OK') send: 'quit\r\n' reply: b'221 Bye\r\n' reply: retcode (221); Msg: b'Bye'
Cửa sổ dòng lệnh mà máy chủ SMTPD đang chạy hiển thị output −
---------- MESSAGE FOLLOWS ---------- b'From: abc@xyz.com' b'To: xyz@abc.com' b'X-Peer: ::1' b'' b'Hello World' ------------ END MESSAGE ------------
Để gửi email HTML bằng Python, bạn có thể sử dụng thư viện smtplib để kết nối với máy chủ SMTP và các mô-đun email.mime để xây dựng và định dạng nội dung email của bạn một cách phù hợp.
Khi gửi email HTML, bạn cần chỉ định một số tiêu đề nhất định và cấu trúc nội dung tin nhắn cho phù hợp để đảm bảo nó được nhận diện và hiển thị dưới dạng HTML bởi trình đọc email của người nhận.
Example
Dưới đây là ví dụ để gửi nội dung HTML dưới dạng email trong Python −
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText # Email content sender = 'from@fromdomain.com' receivers = ['to@todomain.com'] # Create message container - the correct MIME type is multipart/alternative. msg = MIMEMultipart('alternative') msg['From'] = 'From Person <from@fromdomain.com>' msg['To'] = 'To Person <to@todomain.com>' msg['Subject'] = 'SMTP HTML e-mail test' # HTML message content html = """\ <html> <head></head> <body> <p>This is an e-mail message to be sent in <b>HTML format</b></p> <p><b>This is HTML message.</b></p> <h1>This is headline.</h1> </body> </html> """ # Attach HTML content to the email part2 = MIMEText(html, 'html') msg.attach(part2) # Connect to SMTP server and send email try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, receivers, msg.as_string()) print("Successfully sent email") except smtplib.SMTPException as e: print(f"Error: unable to send email. Error message: {str(e)}")
Để gửi tệp đính kèm qua email trong Python, bạn có thể sử dụng thư viện smtplib để kết nối với máy chủ SMTP và các mô-đun email.mime để xây dựng và định dạng nội dung email của bạn, bao gồm cả tệp đính kèm.
Khi gửi email với các tệp đính kèm, bạn cần định dạng email một cách chính xác bằng cách sử dụng MIME (Phần mở rộng Email Internet Đa mục đích). Điều này liên quan đến việc thiết lập tiêu đề Content-Type thành multipart/mixed để chỉ ra rằng email chứa cả văn bản và các tệp đính kèm. Mỗi phần của email (văn bản và các tệp đính kèm) được phân tách bởi các ranh giới.
Example
Dưới đây là ví dụ, gửi một email với tệp /tmp/test.txt làm tệp đính kèm −
import smtplib import base64 filename = "/tmp/test.txt" # Read a file and encode it into base64 format fo = open(filename, "rb") filecontent = fo.read() encodedcontent = base64.b64encode(filecontent) # base64 sender = 'webmaster@tutorialpoint.com' reciever = 'amrood.admin@gmail.com' marker = "AUNIQUEMARKER" body =""" This is a test email to send an attachment. """ # Define the main headers. part1 = """From: From Person <me@fromdomain.net> To: To Person <amrood.admin@gmail.com> Subject: Sending Attachment MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=%s --%s """ % (marker, marker) # Define the message action part2 = """Content-Type: text/plain Content-Transfer-Encoding:8bit %s --%s """ % (body,marker) # Define the attachment section part3 = """Content-Type: multipart/mixed; name=\"%s\" Content-Transfer-Encoding:base64 Content-Disposition: attachment; filename=%s %s --%s-- """ %(filename, filename, encodedcontent, marker) message = part1 + part2 + part3 try: smtpObj = smtplib.SMTP('localhost') smtpObj.sendmail(sender, reciever, message) print "Successfully sent email" except Exception: print "Error: unable to send email"
Để gửi email sử dụng máy chủ SMTP của Gmail trong Python, bạn cần thiết lập kết nối đến smtp.gmail.com trên cổng "587" với mã hóa "TLS", xác thực bằng thông tin đăng nhập Gmail của bạn, xây dựng thông điệp email bằng các thư viện smtplib và email.mime của Python, và gửi nó bằng phương thức sendmail(). Cuối cùng, hãy đóng kết nối SMTP bằng quit().
Dưới đây là một kịch bản ví dụ minh họa cách gửi email sử dụng máy chủ SMTP của Gmail −
import smtplib # Email content content = "Hello World" # Set up SMTP connection to Gmail's SMTP server mail = smtplib.SMTP('smtp.gmail.com', 587) # Identify yourself to the SMTP server mail.ehlo() # Start TLS encryption for the connection mail.starttls() # Gmail account credentials sender = 'your_email@gmail.com' password = 'your_password' # Login to Gmail's SMTP server mail.login(sender, password) # Email details recipient = 'recipient_email@example.com' subject = 'Test Email' # Construct email message with headers header = f'To: {recipient}\nFrom: {sender}\nSubject: {subject}\n' content = header + content # Send email mail.sendmail(sender, recipient, content) # Close SMTP connection mail.quit()
Trước khi chạy kịch bản trên, tài khoản gmail của người gửi phải được cấu hình để cho phép truy cập cho 'các ứng dụng kém an toàn'. Hãy truy cập liên kết sau.
https://myaccount.google.com/lesssecureapps Đặt nút chuyển hiển thị thành BẬT.
Nếu mọi thứ diễn ra suôn sẻ, hãy thực hiện kịch bản trên. Thông điệp sẽ được gửi đến hộp thư đến của người nhận.