Python - Sending Email

Sending Email in Python

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 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.

Python smptlib.SMTP() Function

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ủ.

Setting Up an SMTP Server

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.

Creating an SMTP Object

Để 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()

The Python smtpd Module

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.

Setting Up an SMTP Debugging Server

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.

Starting the SMTP Debugging Server

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 ------------

Sending an HTML e-mail using Python

Để 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.

Constructing the HTML Email Message

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)}")

Sending Attachments as an E-mail

Để 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.

Constructing an Email with Attachments

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"

Sending Email Using Gmail's SMTP Server

Để 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().

Example

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.

toggle button

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.