发送邮件是日常工作中非常常见的需求,无论是个人还是企业,掌握如何使用Python发送邮件都是非常有用的技能。今天我们就来学习Python发送邮件的三种方法,分别是使用smtplib模块、yagmail库和email库。每种方法都有其特点和适用场景,让我们一起来看看吧!
1. 使用smtplib模块发送邮件
smtplib 是 Python 标准库中的一个模块,用于发送邮件。它提供了 SMTP(Simple Mail Transfer Protocol)协议的实现。下面我们通过一个简单的例子来学习如何使用 smtplib 发送邮件。
示例代码:
import smtplib
from email.mime.text import MIMEText
from email.header import Header
# 邮件发送方和接收方
sender = 'your_email@example.com'
receiver = 'recipient_email@example.com'
# 邮件内容
message = MIMEText('这是一封测试邮件', 'plain', 'utf-8')
message['From'] = Header("发件人", 'utf-8')
message['To'] = Header("收件人", 'utf-8')
# 邮件主题
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
# 连接 SMTP 服务器并发送邮件
try:
smtp_obj = smtplib.SMTP('smtp.example.com', 25) # SMTP服务器地址和端口
smtp_obj.login('your_email@example.com', 'your_password') # 登录SMTP服务器
smtp_obj.sendmail(sender, receiver, message.as_string()) # 发送邮件
print("邮件发送成功")
except smtplib.SMTPException as e:
print("Error: 无法发送邮件", e)
finally:
smtp_obj.quit()
代码解释
- 导入模块:首先导入 smtplib 和 email.mime.text 模块。
- 设置邮件发送方和接收方:定义发送方和接收方的邮箱地址。
- 创建邮件内容:使用 MIMEText 创建邮件内容,并设置邮件的编码格式。
- 设置邮件头部信息:使用 Header 设置邮件的发送者、接收者和主题。
- 连接SMTP服务器:使用 smtplib.SMTP 连接到SMTP服务器,并使用 login 方法登录。
- 发送邮件:使用 sendmail 方法发送邮件。
- 异常处理:使用 try-except 块捕获可能的异常。8. 关闭连接:使用 quit 方法关闭SMTP连接。
2. 使用yagmail库发送邮件
yagmail 是一个简化了 smtplib 和 email 库使用的第三方库,使得发送邮件更加方便。下面我们来看一个使用 yagmail 发送邮件的例子。
安装yagmail:
pip install yagmail
示例代码:
import yagmail
# 邮件发送方和接收方
sender = 'your_email@example.com'
receiver = 'recipient_email@example.com'
# 邮件内容
subject = 'Python yagmail 邮件测试'
body = '这是一封使用 yagmail 发送的测试邮件'
# 创建 yagmail.SMTP 对象
yag = yagmail.SMTP(user=sender, password='your_password', host='smtp.example.com')
# 发送邮件
try:
yag.send(to=receiver, subject=subject, contents=body)
print("邮件发送成功")
except Exception as e:
print("Error: 无法发送邮件", e)
代码解释:
- 安装yagmail:使用 pip install yagmail 安装 yagmail 库。
- 导入yagmail:导入 yagmail 模块。
- 设置邮件发送方和接收方:定义发送方和接收方的邮箱地址。
- 创建邮件内容:定义邮件的主题和内容。
- 创建SMTP对象:使用 yagmail.SMTP 创建一个SMTP对象,并传入发送方的邮箱地址、密码和SMTP服务器地址。
- 发送邮件:使用 send 方法发送邮件。
- 异常处理:使用 try-except 块捕获可能的异常。
3. 使用email库发送邮件
email 库是 Python 标准库中的一个模块,用于构建复杂的邮件内容。结合 smtplib,可以发送包含附件、HTML 内容等复杂邮件。下面是一个使用 email 库发送带附件的邮件的例子。
示例代码:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
# 邮件发送方和接收方
sender = 'your_email@example.com'
receiver = 'recipient_email@example.com'
# 创建一个 MIMEMultipart 对象
msg = MIMEMultipart()
# 设置邮件头部信息
msg['From'] = sender
msg['To'] = receiver
msg['Subject'] = 'Python email 库邮件测试'
# 添加邮件正文
body = '这是一封使用 email 库发送的测试邮件,包含附件'
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 服务器并发送邮件
try:
smtp_obj = smtplib.SMTP('smtp.example.com', 25)
smtp_obj.login(sender, 'your_password')
smtp_obj.sendmail(sender, receiver, msg.as_string())
print("邮件发送成功")
except smtplib.SMTPException as e:
print("Error: 无法发送邮件", e)
finally:
smtp_obj.quit()
代码解释:
- 导入模块:导入 smtplib 和 email 库的相关模块。
- 设置邮件发送方和接收方:定义发送方和接收方的邮箱地址。
- 创建MIMEMultipart对象:使用 MIMEMultipart 创建一个邮件对象。
- 设置邮件头部信息:设置邮件的发送者、接收者和主题。
- 添加邮件正文:使用 MIMEText 创建邮件正文,并将其附加到邮件对象中。
- 添加附件:打开附件文件,使用 MIMEBase 创建附件对象,设置附件内容并进行 base64 编码,最后将附件附加到邮件对象中。
- 连接SMTP服务器:使用 smtplib.SMTP 连接到SMTP服务器,并使用 login 方法登录。
- 发送邮件:使用 sendmail 方法发送邮件。
- 异常处理:使用 try-except 块捕获可能的异常。
- 关闭连接:使用 quit 方法关闭SMTP连接。
实战案例:自动化发送每日天气报告
假设我们需要每天自动发送一封包含当日天气报告的邮件给指定的收件人。我们可以结合 requests 库获取天气数据,并使用 smtplib 或 yagmail 发送邮件。
获取天气数据:
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"当前温度: {temperature}°C, 天气状况: {condition}")
发送邮件:
import yagmail
def send_weather_report(email, city):
temperature, condition = get_weather(city)
body = f"亲爱的用户,\n\n这是您订阅的每日天气报告。\n\n城市: {city}\n当前温度: {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} 每日天气报告', contents=body)
print("邮件发送成功")
except Exception as e:
print("Error: 无法发送邮件", e)
send_weather_report('recipient_email@example.com', 'New York')
代码解释:
- 获取天气数据:使用 requests 库调用天气 API 获取指定城市的天气数据。
- 发送邮件:使用 yagmail 库发送包含天气报告的邮件。
- 函数封装:将获取天气数据和发送邮件的功能封装成两个函数,便于调用和维护。
总结
今天我们学习了使用 Python 发送邮件的三种方法:smtplib 模块、yagmail 库和 email 库。每种方法都有其特点和适用场景:
- smtplib 模块适合基础的邮件发送需求,适用于简单的文本邮件。
- yagmail 库简化了邮件发送的过程,适合快速开发和调试。
- email 库结合 smtplib 可以发送复杂的邮件,如包含附件和 HTML 内容的邮件。
通过实战案例,我们还学会了如何结合第三方 API 自动化发送每日天气报告。