譯者 | 劉濤
審校 | 重樓
在本教程中,我將引導你逐步深入了解在Python環(huán)境中使用兩種不同方式發(fā)送電子郵件的具體流程:
- 基于傳統(tǒng)SMTP方式:利用 Python 內置的“smtplib”模塊,按照傳統(tǒng)的 SMTP 配置方式來發(fā)送電子郵件。
- 基于Mailtrap方式:通過使用Mailtrap提供的官方 SDK,調用其API來實現電子郵件的發(fā)送功能。
如果你對上述工具及相關工作流程尚不熟悉,在此簡單介紹一下:簡單郵件傳輸協(xié)議(SMTP)是一種廣泛應用于各類應用程序和網站,用于發(fā)送電子郵件的標準協(xié)議。而 Mailtrap 則是一款專門設計的電子郵件投遞平臺,其目標在于實現高郵件投遞成功率。該平臺不僅配備了一系列聚焦于業(yè)務增長的實用功能,還擁有業(yè)內領先水平的分析工具,能夠為用戶提供全面且深入的郵件投遞數據洞察。
在本文結尾,你將了解如何將發(fā)送電子郵件的功能集成到Python項目中,并在實際場景中使用Mailtrap實現可靠的電子郵件投遞。
目錄
- “smtplib”設置
- 如何使用Mailtrap SMTP發(fā)送電子郵件
- 如何使用Mailtrap電子郵件API發(fā)送電子郵件
- 總結
“smtplib”設置
若要開啟使用Python發(fā)送電子郵件的操作,我們首先學會運用內置的 “smtplib”模塊。此模塊具備強大功能,能夠讓你的程序連接至SMTP服務器,進而直接從應用程序中發(fā)送電子郵件。
第一步,請使用以下語句導入“smtplib”模塊:
import smtplib
接下來,創(chuàng)建一個“SMTP”對象,該對象的作用是對與SMTP服務器的連接進行配置。在后續(xù)的操作中,這個對象將負責處理電子郵件的發(fā)送任務。
smtpObj = smtplib.SMTP(host, port)
- “host”指的是SMTP服務器端點,比如“l(fā)ive.smtp.mailtrap.io”這類具體的服務器地址。
- “port”指的是服務器使用的通信端口。通常推薦使用587端口,該端口用于通過TLS加密方式安全地發(fā)送電子郵件。
專業(yè)提示:“SMTP”對象包含一個名為“sendmail”的實例對象。該對象帶有三個參數,其中每個參數均為字符串類型(需注意,“”receivers“” 這個參數是一個字符串列表)。
smtpObj.sendmail(sender, receivers, message)
若要確認“smtplib”模塊是否已正確導入,同時查看參數和類的完整描述信息,可運行以下命令:
help(smtplib)
如何使用Mailtrap SMTP發(fā)送電子郵件
此方法需要設置你從Mailtrap獲取的自定義SMTP憑證。
重要提示:
- 使用 Mailtrap 的虛擬域名測試服務:若你希望試用 Mailtrap,無需即刻對你的域名進行驗證。你可以使用 Mailtrap 提供的虛擬域名(在注冊時即可獲得訪問權限)。使用該虛擬域名,你能夠模擬電子郵件的發(fā)送過程,而無需擔憂DNS記錄相關問題。這種方式十分適合用于測試Mailtrap服務,并深入熟悉其各項功能。
- 生產環(huán)境中的域名驗證:倘若你計劃向收件人發(fā)送真實有效的郵件,那么就必須對你的域名進行驗證。這一過程要求你在域名提供商的DNS設置中添加諸如 SPF、DKIM和DMARC等DNS記錄。這些記錄對于確保郵件能夠成功投遞至關重要,同時還有助于防范網絡釣魚以及偽造郵件等安全風險。在接下來的部分內容中,我將為你詳細展示如何在域名提供商的控制面板中完成這些設置操作。
驗證發(fā)件域名(SPF/DKIM和DMARC)
DNS 記錄在確保電子郵件成功投遞方面起著關鍵作用,諸如Gmail(谷歌郵箱)和雅虎等郵箱提供商均要求進行 DNS 認證。
在詳細介紹操作方法之前,我們先對每種記錄類型進行回顧,以便你深入理解它們的重要性:
- SPF(發(fā)件人策略框架):此記錄的作用是協(xié)助郵件服務器判定發(fā)件人的 IP 地址是否被授權使用你的域名發(fā)送郵件。通俗來講,添加 SPF 記錄能夠有效阻止垃圾郵件發(fā)送者冒用你的域名發(fā)送郵件,從而保障你的域名安全和郵件發(fā)送的合法性。
- DKIM(域名密鑰識別郵件):DKIM使用加密技術對發(fā)件人的域名進行驗證,同時確保郵件內容在傳輸過程中未被篡改。該技術為你的郵件提供了可靠的防偽保護,增強了郵件的可信度和安全性。
- DMARC(基于域名的消息認證、報告與一致性):DMARC將SPF和DKIM的功能相結合,不僅制定了針對未經身份驗證的電子郵件的處理策略,還能夠對郵件活動進行詳細報告。通過 DMARC,你可以更好地掌控以你域名發(fā)送的郵件的安全性,確保郵件傳輸的合規(guī)性和可靠性。
以下是添加這些記錄的具體步驟:
- 首先,你需要訪問域名提供商的DNS設置。一般而言,你可以在域名注冊平臺或域名管理設置板塊中找到該入口。例如,在GoDaddy平臺(注:GoDaddy是一家知名的網絡托管公司和域名注冊商,提供多種互聯(lián)網服務)上,該入口被命名為“管理 DNS”,其他域名提供商的相關入口名稱雖有所不同,但功能類似。
- 接下來,將 Mailtrap 提供的 DNS 記錄(通過復制粘貼的方式)添加至你域名提供商的 DNS 設置中。需要注意的是,Mailtrap提供的記錄是經過精心設置的,其中SPF記錄已預先解析完成。因此,你無需進行額外的創(chuàng)建操作,直接添加這些記錄即可完成相應配置。
- 最后,你可以通過Mailtrap查看記錄的狀態(tài)。
以下展示的是使用Python通過Mailtrap發(fā)送電子郵件的最簡腳本。出于安全方面的考量,在該腳本中,用戶名和密碼部分采用了占位符(SMTP 服務器端點和端口除外)。
當運行此腳本時,請務必將這些占位符替換為你實際的Mailtrap憑證,以確保電子郵件能夠成功發(fā)送。
import smtplib
from email.mime.text import MIMEText
# Configuration
port = 587
smtp_server = "live.smtp.mailtrap.io"
login = "api" # Your login generated by Mailtrap
password = "1a2b3c4d5e6f7g" # Your password generated by Mailtrap
sender_email = "mailtrap@example.com"
receiver_email = "new@example.com"
# Plain text content
text = """\
Hi,
Check out the new post on the Mailtrap blog:
SMTP Server for Testing: Cloud-based or Local?
https://blog.mailtrap.io/2018/09/27/cloud-or-local-smtp-server/
Feel free to let us know what content would be useful for you!
"""
# Create MIMEText object
message = MIMEText(text, "plain")
message["Subject"] = "Plain text email"
message["From"] = sender_email
message["To"] = receiver_email
# Send the email
with smtplib.SMTP(smtp_server, port) as server:
server.starttls() # Secure the connection
server.login(login, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print(“”Sent“”)
在該腳本中:
- 從 Python 標準庫中導入了 smtplib 和 MIMEText 這兩個模塊。其中,smtplib 模塊用于實現與 SMTP 服務器的交互,完成郵件發(fā)送相關操作;MIMEText 模塊則用于處理郵件內容的格式。
- 正如前文所提及的,針對 SMTP 服務器的配置,需要使用你自己的憑證對相關部分進行更新。不過,服務器端點和端口這兩個參數保持不變,它們是連接到特定郵件服務器的固定標識。
- 鑒于這是一個旨在展示基本功能的最簡腳本,這里僅使用了包含 “plaintext”(純文本) 格式的 MIMEText 來構建郵件內容。實際上,該腳本具備良好的擴展性,能夠很方便地通過重構,使用MIMEMultipart 模塊來同時處理 “plaintext” 和 “HTML” 格式的郵件內容。若你想了解具體的實現方式,可跳轉到下面的快速教程部分查看。
- 在執(zhí)行發(fā)送電子郵件的操作時,選用了 with 語句(即上下文管理器)。旨在確保郵件成功發(fā)送之后,能夠立即關閉與 SMTP 服務器的連接。通過這種方式,可以有效避免資源的浪費以及可能出現的連接異常問題,保障系統(tǒng)的穩(wěn)定性和資源的合理利用。
安全提示:
在編寫發(fā)送郵件的腳本時,切勿將服務器信息和登錄憑證直接硬編碼到腳本中。當為生產環(huán)境配置腳本時,務必使用環(huán)境變量來存儲這些敏感信息。這樣做不僅能夠增強代碼的安全性,降低信息泄露的風險,還能使代碼在不同開發(fā)階段之間遷移時更加靈活。代碼如下:
import os
smtp_server = os.getenv("SMTP_SERVER","default.smtp.server")
login = os.getenv("SMTP_LOGIN")
password = os.getenv("SMTP_PASSWORD")
# Example usage in an SMTP connection setup
# smtp.login(login, password)
請注意,在運行腳本之前,你需要在操作系統(tǒng)中設置變量。
重構腳本以使用HTML郵件
HTML郵件能夠顯著提升用戶體驗。使用HTML 技術,你可以在郵件中嵌入格式化文本、圖片、表格、可點擊鏈接以及自定義樣式等豐富元素。這一特性在營銷郵件、時事通訊,以及任何對設計和品牌形象有較高要求的通信場景中,都具有極高的實用價值。
因此,若要對腳本進行重構以支持 HTML 郵件,你需要導入“MIMEMultipart”和“MIMEText”這兩個模塊。通過這種方式,你不僅能夠精心自定義HTML格式的郵件內容,還能在收件人的設備或郵件客戶端無法正常打開HTML郵件時,提供純文本版本作為備用選項,確保郵件信息能夠準確傳達給收件人。
以下為修改后的腳本:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# Configuration
smtp_server = "live.smtp.mailtrap.io"
port = 587
login = "api" # Mailtrap login
password = "1a2b3c4d5e6f7g" # Mailtrap password
sender_email = "mailtrap@example.com"
receiver_email = "new@example.com"
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "HTML Email"
# Add plain text content (optional, for email clients that don“”t render HTML)
message.attach(MIMEText("This is a plain text version of the email.", "plain"))
# Add HTML content
html_content = """\
<html>
<body>
<h1>Welcome to Mailtrap!</h1>
<p>This is an example of an HTML email.</p>
</body>
</html>
"""
message.attach(MIMEText(html_content, "html"))
# Send the emailwith smtplib.SMTP(smtp_server, port) as server:
server.starttls()
server.login(login, password)
server.sendmail(sender_email, receiver_email, message.as_string())
print(“”Sent“”)
最后,我提供了關于SMTP方法的視頻講解。如果你覺得通過視頻了解相關內容更符合你的習慣,歡迎隨時查看。
https://www.youtube.com/watch?v=ufLpTc9up8s&t=1s。
如何使用Mailtrap電子郵件API發(fā)送電子郵件
若你不滿足于僅使用 SMTP 方式發(fā)送電子郵件,而是期望將Mailtrap的電子郵件 API 集成到自己的 Python 應用程序中,本節(jié)內容將詳細為你介紹具體操作方法。
Mailtrap 的 SMTP 電子郵件API具備諸多優(yōu)勢,它不僅能夠使你更高效地發(fā)送電子郵件,還為整個郵件發(fā)送流程增添了靈活性與可擴展性。在著手進行集成操作之前,請務必確保你在 Mailtrap 平臺上擁有一個已經過驗證的發(fā)件域名,同時準備好用于驗證請求的Mailtrap API令牌。
需要注意的是:接下來我將著重介紹如何使用 Mailtrap 官方的Python軟件開發(fā)工具包(SDK)來完成 API 集成工作。
那么,第一步,請使用以下命令安裝官方 SDK。
pip install mailtrap
前提條件:請確保你的 Python 包版本為 3.6 或更高。
在成功安裝軟件開發(fā)工具包(SDK)之后,接下來的步驟是創(chuàng)建一個 Mail 對象。此對象將用于代表你即將發(fā)送的電子郵件,其中會涵蓋發(fā)件人、收件人、主題以及郵件內容等關鍵信息。
import mailtrap as mt
# Create the mail object
mail = mt.Mail(
sender=mt.Address(email="mailtrap@example.com", name="Mailtrap Test"), # Sender info
to=[mt.Address(email="your@email.com")], # Recipient info
subject="You are awesome!", # Email subject
text="Congrats for sending a test email with Mailtrap!" # Email content (plain text))
# Create a client using your API key
client = mt.MailtrapClient(token="your-api-key")
# Send the email
client.send(mail)
快速說明:.
- 發(fā)件人與收件人:你需要明確指定發(fā)件人的電子郵件地址,此地址必須與你已驗證的域名相匹配。同理,收件人的電子郵件地址也需準確設定。
- 主題與文本內容:需設置電子郵件的主題以及純文本內容。后續(xù)將會提及,你同樣能夠添加HTML格式的內容。
- 客戶端與發(fā)送:利用你的Mailtrap API令牌對“MailtrapClient”進行初始化操作,該令牌用于對 API 請求進行驗證。然后在客戶端調用“send”方法,并將“mail”對象作為參數傳入。若要使用 Mailtrap API令牌創(chuàng)建客戶端,可在 Mailtrap 中按照以下路徑進行操作:
? Settings > API Tokens > Add Token
這樣,你可以使用以下命令發(fā)送電子郵件:
# create client and send
client = mt.MailtrapClient(token="your-api-key")
client.send(mail)
最后,以下為使用Python SDK 發(fā)送基本“純文本”電子郵件的SDK腳本。
from mailtrap import Mail, Address, MailtrapClient
# Create a Mail object with basic details for a plain text email
mail = Mail(
# Specify the sender“”s email address and optional name
sender=Address(email="mailtrap@example.com", name="Mailtrap Test"),
# Specify one or more recipients; here we use a list with a single recipient
to=[Address(email="your@email.com", name="Your Name")],
# Subject of the email
subject="Simple Plain Text Email",
# The plain text content of the email
text="This is a plain text email sent using the Mailtrap SDK. Simple and straightforward.",
# Optional: categorize this email for easier sorting or management in the Mailtrap service
category="Test",
# Optional: Additional headers can be specified, but are not required for plain text emails
headers={"X-Example-Header": "HeaderValue"})
# Initialize the MailtrapClient with your API token
client = MailtrapClient(token="your-api-key")
# Send the email using the client“”s send method
client.send(mail)
print("Plain text email sent successfully.")
在該腳本中:
- 考慮到此次要發(fā)送的是純文本消息,因此所導入的類有“MailtrapClient”、“Mail” 以及“Address”。
- “Mail”對象包含以下部分:
a.構造函數:即用于創(chuàng)建對象的“Mail”構造函數。
b.發(fā)件人信息:“Sender”字段,使用“Address”類來定義發(fā)件人的姓名和電子郵件地址。
c.收件人信息:“to”字段,在通常情況下可以是一個由“Address”對象構成的列表。不過由于這里是一封純文本電子郵件,所以它一般直接包含收件人信息,而非以列表形式呈現。
d.主題:電子郵件的主題,通過“subject”字段表示。
e.郵件內容:“text”字段,其中包含了電子郵件的內容,且是以純文本(“plaintext”)形式存在。
f.可選字段:“headers”和“category”,這兩個字段屬于可選設置,合理使用它們有助于你更高效地管理電子郵件。
g.客戶端創(chuàng)建與驗證:利用 API 令牌創(chuàng)建“MailtrapClient”,并完成相應的驗證工作。
h.郵件發(fā)送:調用“MailtrapClient”的“send”方法,將“mail”對象作為參數傳入,以此來實現電子郵件的發(fā)送操作。
i.操作確認:打印“Plain text email sent successfully.(純文本電子郵件發(fā)送成功)” 這一消息,用于確認電子郵件發(fā)送操作已成功完成。
- 電子郵件的發(fā)送流程如下:
重構腳本以包含 HTML 和附件
同樣地,使用“MIMEMultipart”類對腳本進行重構,從而實現更為復雜的電子郵件結構,則會變得非常簡單。
以下展示的是重構后的代碼:
import mailtrap as mt
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# Create a multipart email message
message = MIMEMultipart()
message["Subject"] = "HTML Email"
# Plain text version (for email clients that don“”t support HTML)
message.attach(MIMEText("This is the plain text version.", "plain"))
# HTML version
html_content = """\
<html>
<body>
<h1>Welcome to Mailtrap!</h1>
<p>This is an HTML email with some <b>bold text</b> and a <a >link</a>.</p>
</body>
</html>
"""
message.attach(MIMEText(html_content, "html"))
client = mt.MailtrapClient(token="your-api-key")
# Now send the email with Mailtrap“”s API
mail = mt.Mail(
sender=mt.Address(email="mailtrap@example.com", name="Mailtrap Test"),
to=[mt.Address(email="your@email.com")],
subject="You are awesome!",
html=message.as_string() # Pass the HTML content as a string)
client.send(mail)
生產環(huán)境設置
在詳細探討具體設置細節(jié)之前,在此提醒你一些安全方面的最佳實踐:
- 安全存儲 API 密鑰和憑證:在生產環(huán)境下,切勿將 API 密鑰、電子郵件登錄憑證或其他諸如機密信息這類敏感數據,直接硬編碼到源代碼中。一旦發(fā)生這樣操作,你的應用程序將面臨極大的安全風險。
- 使用環(huán)境變量:采用這種方式,不僅能夠有效保障憑證的安全性,還能讓你在不同的配置環(huán)境(例如開發(fā)環(huán)境、預發(fā)布環(huán)境【staging:指的是在正式生產環(huán)境之前的一個測試環(huán)境。它是軟件開發(fā)過程中的一個階段,用于模擬生產環(huán)境,進行最終的測試和驗證】以及生產環(huán)境)之間輕松實現切換。
接下來為你介紹具體的設置方法:
- 使用“python - dotenv”包從“.env”文件中加載環(huán)境變量,使用以下命令安裝該庫: pip install python-dotenv
- 在項目的根目錄下創(chuàng)建一個名為“.env”的文件,用于安全地存儲環(huán)境變量。該文件會存放諸如你的 Mailtrap API 密鑰、登錄憑證以及 SMTP 服務器詳細信息等敏感信息。以下為一個示例:
SMTP_SERVER=smtp.mailtrap.io
SMTP_PORT=587
SMTP_LOGIN=your_mailtrap_login
SMTP_PASSWORD=your_mailtrap_password
MAILTRAP_API_KEY=your_mailtrap_api_key
重要提示:確保此“.env”文件永遠不會推送到版本控制系統(tǒng)(如Git)中。請將它添加到你項目里的“.gitignore”文件中,以此避免敏感信息因意外情況而被暴露。
- 在創(chuàng)建好“.env”文件之后,你需要將其中的變量加載到Python腳本中。具體操作是,在腳本的頂部位置,導入“dotenv”包,然后調用“l(fā)oad_dotenv()”函數,以此來實現環(huán)境變量的加載。
from dotenv import load_dotenv
import os
# Load environment variables from the .env file
load_dotenv()
# Retrieve environment variables securely
smtp_server = os.getenv("SMTP_SERVER")
smtp_port = os.getenv("SMTP_PORT")
smtp_login = os.getenv("SMTP_LOGIN")
smtp_password = os.getenv("SMTP_PASSWORD")
mailtrap_api_key = os.getenv("MAILTRAP_API_KEY")
- 完成環(huán)境變量的加載后,你便能夠將腳本中原本硬編碼的憑證替換為這些環(huán)境變量。以下為一個示例:
import smtplib
from email.mime.text import MIMEText
from dotenv import load_dotenv
import os
# Load environment variables
load_dotenv()
# Fetching SMTP credentials from environment variables
smtp_server = os.getenv("SMTP_SERVER")
smtp_port = os.getenv("SMTP_PORT")
smtp_login = os.getenv("SMTP_LOGIN")
smtp_password = os.getenv("SMTP_PASSWORD")
sender_email = "mailtrap@example.com"
receiver_email = "new@example.com"
subject = "Plain text email"
text = """\
Hi,
Check out the new post on the Mailtrap blog:
https://blog.mailtrap.io/2018/09/27/cloud-or-local-smtp-server/
"""
# Create MIMEText object
message = MIMEText(text, "plain")
message["Subject"] = subject
message["From"] = sender_email
message["To"] = receiver_email
# Send email using environment variables
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls() # Secure the connection
server.login(smtp_login, smtp_password)
server.sendmail(sender_email, receiver_email, message.as_string())
print("Email sent successfully!")
專業(yè)提示:
首先,務必保證環(huán)境變量僅能被授權用戶訪問。在生產服務器環(huán)境下,通常表示僅通過部署配置來設定對環(huán)境變量的訪問權限(例如,使用 Heroku 的配置變量、AWS Secrets Manager,或者其他基于云的機密管理工具來實現)。
其次,建議在開發(fā)、預發(fā)布以及生產環(huán)境中使用不同的環(huán)境變量。這樣做能夠有效確保生產環(huán)境與開發(fā)流程中的其他階段相互隔離,進而為生產環(huán)境提供更妥善的保護。
一旦在本地完成環(huán)境變量的配置后,接下來就需要將應用程序部署到生產環(huán)境中。在此過程中,一定要在生產服務器或服務里設置相同的環(huán)境變量。
倘若你計劃將應用程序部署到諸如 Heroku、AWS或者谷歌云這類平臺,你可以使用這些平臺各自提供的環(huán)境變量管理工具,安全地存儲和訪問機密信息,由此一來便無需手動管理“.env”文件。
總結
這個快速教程為你提供了充足的內容,以幫助你使用Python發(fā)送電子郵件。需要注意的是,上述腳本具備進一步擴展的空間,能夠涵蓋 HTML 格式內容、多個收件人、附件、圖片等更多功能。
倘若你對這方面內容感興趣,或者希望了解更多安全提示與最佳實踐相關知識,可以訪問 Mailtrap 博客,獲取更為詳盡的教程。
譯者介紹
劉濤,51CTO社區(qū)編輯,某大型央企系統(tǒng)上線檢測管控負責人。
原文標題:How to Send Emails in Python using Mailtrap SMTP and the Email API,作者:Alex Tray