Python 發(fā)送郵件的三種方法
發(fā)送郵件是日常工作中非常常見的需求,無論是個(gè)人還是企業(yè),掌握如何使用Python發(fā)送郵件都是非常有用的技能。今天我們就來學(xué)習(xí)Python發(fā)送郵件的三種方法,分別是使用smtplib模塊、yagmail庫和email庫。每種方法都有其特點(diǎn)和適用場景,讓我們一起來看看吧!
1. 使用smtplib模塊發(fā)送郵件
smtplib 是 Python 標(biāo)準(zhǔn)庫中的一個(gè)模塊,用于發(fā)送郵件。它提供了 SMTP(Simple Mail Transfer Protocol)協(xié)議的實(shí)現(xiàn)。下面我們通過一個(gè)簡單的例子來學(xué)習(xí)如何使用 smtplib 發(fā)送郵件。
示例代碼:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 郵件發(fā)送方和接收方
sender = 'your_email@example.com'
receiver = 'recipient_email@example.com'
# 郵件內(nèi)容
message = MIMEText('這是一封測試郵件', 'plain', 'utf-8')
message['From'] = Header("發(fā)件人", 'utf-8')
message['To'] = Header("收件人", 'utf-8')
# 郵件主題
subject = 'Python SMTP 郵件測試'
message['Subject'] = Header(subject, 'utf-8')
# 連接 SMTP 服務(wù)器并發(fā)送郵件
try:
smtp_obj = smtplib.SMTP('smtp.example.com', 25) # SMTP服務(wù)器地址和端口
smtp_obj.login('your_email@example.com', 'your_password') # 登錄SMTP服務(wù)器
smtp_obj.sendmail(sender, receiver, message.as_string()) # 發(fā)送郵件
print("郵件發(fā)送成功")
except smtplib.SMTPException as e:
print("Error: 無法發(fā)送郵件", e)
finally:
smtp_obj.quit()
代碼解釋
- 導(dǎo)入模塊:首先導(dǎo)入 smtplib 和 email.mime.text 模塊。
- 設(shè)置郵件發(fā)送方和接收方:定義發(fā)送方和接收方的郵箱地址。
- 創(chuàng)建郵件內(nèi)容:使用 MIMEText 創(chuàng)建郵件內(nèi)容,并設(shè)置郵件的編碼格式。
- 設(shè)置郵件頭部信息:使用 Header 設(shè)置郵件的發(fā)送者、接收者和主題。
- 連接SMTP服務(wù)器:使用 smtplib.SMTP 連接到SMTP服務(wù)器,并使用 login 方法登錄。
- 發(fā)送郵件:使用 sendmail 方法發(fā)送郵件。
- 異常處理:使用 try-except 塊捕獲可能的異常。8. 關(guān)閉連接:使用 quit 方法關(guān)閉SMTP連接。
2. 使用yagmail庫發(fā)送郵件
yagmail 是一個(gè)簡化了 smtplib 和 email 庫使用的第三方庫,使得發(fā)送郵件更加方便。下面我們來看一個(gè)使用 yagmail 發(fā)送郵件的例子。
安裝yagmail:
pip install yagmail
示例代碼:
import yagmail
# 郵件發(fā)送方和接收方
sender = 'your_email@example.com'
receiver = 'recipient_email@example.com'
# 郵件內(nèi)容
subject = 'Python yagmail 郵件測試'
body = '這是一封使用 yagmail 發(fā)送的測試郵件'
# 創(chuàng)建 yagmail.SMTP 對象
yag = yagmail.SMTP(user=sender, password='your_password', host='smtp.example.com')
# 發(fā)送郵件
try:
yag.send(to=receiver, subject=subject, contents=body)
print("郵件發(fā)送成功")
except Exception as e:
print("Error: 無法發(fā)送郵件", e)
代碼解釋:
- 安裝yagmail:使用 pip install yagmail 安裝 yagmail 庫。
- 導(dǎo)入yagmail:導(dǎo)入 yagmail 模塊。
- 設(shè)置郵件發(fā)送方和接收方:定義發(fā)送方和接收方的郵箱地址。
- 創(chuàng)建郵件內(nèi)容:定義郵件的主題和內(nèi)容。
- 創(chuàng)建SMTP對象:使用 yagmail.SMTP 創(chuàng)建一個(gè)SMTP對象,并傳入發(fā)送方的郵箱地址、密碼和SMTP服務(wù)器地址。
- 發(fā)送郵件:使用 send 方法發(fā)送郵件。
- 異常處理:使用 try-except 塊捕獲可能的異常。
3. 使用email庫發(fā)送郵件
email 庫是 Python 標(biāo)準(zhǔn)庫中的一個(gè)模塊,用于構(gòu)建復(fù)雜的郵件內(nèi)容。結(jié)合 smtplib,可以發(fā)送包含附件、HTML 內(nèi)容等復(fù)雜郵件。下面是一個(gè)使用 email 庫發(fā)送帶附件的郵件的例子。
示例代碼:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
# 郵件發(fā)送方和接收方
sender = 'your_email@example.com'
receiver = 'recipient_email@example.com'
# 創(chuàng)建一個(gè) MIMEMultipart 對象
msg = MIMEMultipart()
# 設(shè)置郵件頭部信息
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = 'Python email 庫郵件測試'
# 添加郵件正文
body = '這是一封使用 email 庫發(fā)送的測試郵件,包含附件'
msg.attach(MIMEText(body, 'plain'))
# 添加附件
filename = "example.txt"
attachment = open("path/to/example.txt", "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)
# 連接 SMTP 服務(wù)器并發(fā)送郵件
try:
smtp_obj = smtplib.SMTP('smtp.example.com', 25)
smtp_obj.login(sender, 'your_password')
smtp_obj.sendmail(sender, receiver, msg.as_string())
print("郵件發(fā)送成功")
except smtplib.SMTPException as e:
print("Error: 無法發(fā)送郵件", e)
finally:
smtp_obj.quit()
代碼解釋:
- 導(dǎo)入模塊:導(dǎo)入 smtplib 和 email 庫的相關(guān)模塊。
- 設(shè)置郵件發(fā)送方和接收方:定義發(fā)送方和接收方的郵箱地址。
- 創(chuàng)建MIMEMultipart對象:使用 MIMEMultipart 創(chuàng)建一個(gè)郵件對象。
- 設(shè)置郵件頭部信息:設(shè)置郵件的發(fā)送者、接收者和主題。
- 添加郵件正文:使用 MIMEText 創(chuàng)建郵件正文,并將其附加到郵件對象中。
- 添加附件:打開附件文件,使用 MIMEBase 創(chuàng)建附件對象,設(shè)置附件內(nèi)容并進(jìn)行 base64 編碼,最后將附件附加到郵件對象中。
- 連接SMTP服務(wù)器:使用 smtplib.SMTP 連接到SMTP服務(wù)器,并使用 login 方法登錄。
- 發(fā)送郵件:使用 sendmail 方法發(fā)送郵件。
- 異常處理:使用 try-except 塊捕獲可能的異常。
- 關(guān)閉連接:使用 quit 方法關(guān)閉SMTP連接。
實(shí)戰(zhàn)案例:自動(dòng)化發(fā)送每日天氣報(bào)告
假設(shè)我們需要每天自動(dòng)發(fā)送一封包含當(dāng)日天氣報(bào)告的郵件給指定的收件人。我們可以結(jié)合 requests 庫獲取天氣數(shù)據(jù),并使用 smtplib 或 yagmail 發(fā)送郵件。
獲取天氣數(shù)據(jù):
import requests
def get_weather(city):
url = f"http://api.weatherapi.com/v1/current.json?key=YOUR_API_KEY&q={city}"
response = requests.get(url)
data = response.json()
return data['current']['temp_c'], data['current']['condition']['text']
temperature, condition = get_weather('New York')
print(f"當(dāng)前溫度: {temperature}°C, 天氣狀況: {condition}")
發(fā)送郵件:
import yagmail
def send_weather_report(email, city):
temperature, condition = get_weather(city)
body = f"親愛的用戶,\n\n這是您訂閱的每日天氣報(bào)告。\n\n城市: {city}\n當(dāng)前溫度: {temperature}°C\n天氣狀況: {condition}\n\n祝您一天愉快!"
yag = yagmail.SMTP(user='your_email@example.com', password='your_password', host='smtp.example.com')
try:
yag.send(to=email, subject=f'{city} 每日天氣報(bào)告', contents=body)
print("郵件發(fā)送成功")
except Exception as e:
print("Error: 無法發(fā)送郵件", e)
send_weather_report('recipient_email@example.com', 'New York')
代碼解釋:
- 獲取天氣數(shù)據(jù):使用 requests 庫調(diào)用天氣 API 獲取指定城市的天氣數(shù)據(jù)。
- 發(fā)送郵件:使用 yagmail 庫發(fā)送包含天氣報(bào)告的郵件。
- 函數(shù)封裝:將獲取天氣數(shù)據(jù)和發(fā)送郵件的功能封裝成兩個(gè)函數(shù),便于調(diào)用和維護(hù)。
總結(jié)
今天我們學(xué)習(xí)了使用 Python 發(fā)送郵件的三種方法:smtplib 模塊、yagmail 庫和 email 庫。每種方法都有其特點(diǎn)和適用場景:
- smtplib 模塊適合基礎(chǔ)的郵件發(fā)送需求,適用于簡單的文本郵件。
- yagmail 庫簡化了郵件發(fā)送的過程,適合快速開發(fā)和調(diào)試。
- email 庫結(jié)合 smtplib 可以發(fā)送復(fù)雜的郵件,如包含附件和 HTML 內(nèi)容的郵件。
通過實(shí)戰(zhàn)案例,我們還學(xué)會(huì)了如何結(jié)合第三方 API 自動(dòng)化發(fā)送每日天氣報(bào)告。