在现代的软件开发和自动化流程中,发送电子邮件是一项常见的任务。Python 3 提供了强大的工具来实现这一功能,特别是通过使用 SMTP(Simple Mail Transfer Protocol)协议。本文将深入探讨 Python 3 中使用 SMTP 发送邮件的高级用法,展示其在不同场景下的灵活性和强大功能。
SMTP 是一种用于发送电子邮件的协议。它允许客户端(如 Python 程序)与邮件服务器进行通信,将邮件发送到收件人的邮箱中。Python 的smtplib
模块提供了一个简单的接口来使用 SMTP 协议发送邮件。
以下是一个使用 Python 3 的smtplib
模块发送简单文本邮件的示例:
import smtplib
from email.mime.text import MIMEText
# 邮件服务器设置
smtp_server = 'smtp.example.com'
smtp_port = 587
sender_email = '[email protected]'
receiver_email = '[email protected]'
password = 'your_password'
# 创建邮件内容
message = MIMEText('这是一封测试邮件。')
message['Subject'] = '测试邮件'
message['From'] = sender_email
message['To'] = receiver_email
# 连接邮件服务器并发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
在这个例子中,我们首先设置了邮件服务器的地址、端口、发送者和接收者的邮箱地址以及密码。然后,我们创建了一个包含邮件内容、主题、发送者和接收者信息的MIMEText
对象。最后,我们连接到邮件服务器,使用starttls
方法启动 TLS 加密,登录到邮箱,然后发送邮件。
发送 HTML 邮件
除了发送纯文本邮件,我们还可以发送 HTML 格式的邮件。这可以让我们在邮件中包含格式化的文本、链接、图片等内容。以下是一个发送 HTML 邮件的示例:
import smtplib
from email.mime.text import MIMEText
# 邮件服务器设置
smtp_server = 'smtp.example.com'
smtp_port = 587
sender_email = '[email protected]'
receiver_email = '[email protected]'
password = 'your_password'
# 创建 HTML 邮件内容
html_content = """
这是一封 HTML 邮件
这里是一些格式化的文本。
点击这里访问链接
"""
message = MIMEText(html_content, 'html')
message['Subject'] = 'HTML 邮件测试'
message['From'] = sender_email
message['To'] = receiver_email
# 连接邮件服务器并发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
发送带附件的邮件
有时候我们需要发送带有附件的邮件,比如文档、图片等。以下是一个发送带附件邮件的示例:
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
# 邮件服务器设置
smtp_server = 'smtp.example.com'
smtp_port = 587
sender_email = '[email protected]'
receiver_email = '[email protected]'
password = 'your_password'
# 创建邮件对象
message = MIMEMultipart()
message['Subject'] = '带附件的邮件测试'
message['From'] = sender_email
message['To'] = receiver_email
# 添加邮件正文
body = '这是一封带有附件的邮件。'
message.attach(MIMEText(body, 'plain'))
# 添加附件
attachment_filename = 'attachment.txt'
with open(attachment_filename, 'rb') as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename= {attachment_filename}')
message.attach(part)
# 连接邮件服务器并发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
发送多个收件人的邮件
我们可以将邮件发送给多个收件人,只需要在sendmail
方法中传入一个包含多个收件人邮箱地址的列表即可。以下是一个发送多个收件人邮件的示例:
import smtplib
from email.mime.text import MIMEText
# 邮件服务器设置
smtp_server = 'smtp.example.com'
smtp_port = 587
sender_email = '[email protected]'
receiver_emails = ['[email protected]', '[email protected]', '[email protected]']
password = 'your_password'
# 创建邮件内容
message = MIMEText('这是一封发送给多个收件人的邮件。')
message['Subject'] = '多收件人邮件测试'
message['From'] = sender_email
message['To'] = ', '.join(receiver_emails)
# 连接邮件服务器并发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_emails, message.as_string())
使用不同的邮件服务器
Python 的smtplib
模块可以与各种邮件服务器配合使用。不同的邮件服务器可能有不同的设置,比如端口号、加密方式等。以下是一个使用 Gmail 邮件服务器发送邮件的示例:
import smtplib
from email.mime.text import MIMEText
# 邮件服务器设置
smtp_server = 'smtp.gmail.com'
smtp_port = 587
sender_email = '[email protected]'
receiver_email = '[email protected]'
password = 'your_gmail_password'
# 创建邮件内容
message = MIMEText('这是一封通过 Gmail 发送的邮件。')
message['Subject'] = 'Gmail 邮件测试'
message['From'] = sender_email
message['To'] = receiver_email
# 连接邮件服务器并发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
请注意,使用 Gmail 邮件服务器发送邮件时,你可能需要在你的 Gmail 账户设置中启用 “允许 less secure apps” 选项,或者使用 OAuth2 进行身份验证。
自动化报告生成与发送
在数据分析、系统监控等场景中,我们可以使用 Python 生成报告,并通过 SMTP 自动发送给相关人员。例如,我们可以每天定时生成一份销售报告,并发送给销售团队。
import smtplib
from email.mime.text import MIMEText
import pandas as pd
# 生成销售报告
sales_data = pd.read_csv('sales_data.csv')
report_content = f"销售报告日期:{pd.Timestamp.now().strftime('%Y-%m-%d')}\n\n总销售额:{sales_data['sales_amount'].sum()}\n\n平均销售额:{sales_data['sales_amount'].mean()}"
# 邮件服务器设置
smtp_server = 'smtp.example.com'
smtp_port = 587
sender_email = '[email protected]'
receiver_email = '[email protected]'
password = 'your_password'
# 创建邮件内容
message = MIMEText(report_content)
message['Subject'] = '每日销售报告'
message['From'] = sender_email
message['To'] = receiver_email
# 连接邮件服务器并发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
系统监控与通知
当系统出现故障或异常情况时,我们可以使用 Python 监控系统状态,并通过 SMTP 发送通知邮件给管理员。例如,我们可以监控服务器的负载情况,如果负载过高,则发送邮件通知管理员。
import smtplib
from email.mime.text import MIMEText
import psutil
# 邮件服务器设置
smtp_server = 'smtp.example.com'
smtp_port = 587
sender_email = '[email protected]'
receiver_email = '[email protected]'
password = 'your_password'
# 检查服务器负载
cpu_percent = psutil.cpu_percent()
memory_percent = psutil.virtual_memory().percent
# 如果负载过高,则发送通知邮件
if cpu_percent > 80 or memory_percent > 80:
message = MIMEText(f"服务器负载过高!CPU 使用率:{cpu_percent}%,内存使用率:{memory_percent}%。")
message['Subject'] = '服务器负载过高通知'
message['From'] = sender_email
message['To'] = receiver_email
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
注册确认与密码重置邮件
在 Web 应用程序中,我们可以使用 SMTP 发送注册确认邮件和密码重置邮件给用户。例如,当用户注册成功后,我们可以发送一封包含确认链接的邮件给用户,用户点击链接后确认注册。当用户忘记密码时,我们可以发送一封包含密码重置链接的邮件给用户,用户点击链接后重置密码。
import smtplib
from email.mime.text import MIMEText
import secrets
import hashlib
# 邮件服务器设置
smtp_server = 'smtp.example.com'
smtp_port = 587
sender_email = '[email protected]'
receiver_email = '[email protected]'
password = 'your_password'
# 生成确认链接或密码重置链接
token = secrets.token_urlsafe(16)
hashed_token = hashlib.sha256(token.encode()).hexdigest()
# 注册确认邮件
if registration_mode:
confirmation_link = f'https://www.example.com/confirm_registration?token={token}'
message = MIMEText(f"感谢您注册我们的服务!请点击以下链接确认您的注册:{confirmation_link}。")
message['Subject'] = '注册确认邮件'
# 密码重置邮件
else:
reset_link = f'https://www.example.com/reset_password?token={token}'
message = MIMEText(f"您请求重置密码。请点击以下链接重置您的密码:{reset_link}。")
message['Subject'] = '密码重置邮件'
message['From'] = sender_email
message['To'] = receiver_email
# 连接邮件服务器并发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender_email, password)
server.sendmail(sender_email, receiver_email, message.as_string())
Python 3 的smtplib
模块提供了一种强大而灵活的方式来使用 SMTP 协议发送邮件。通过掌握高级用法,我们可以发送 HTML 邮件、带附件的邮件、发送给多个收件人的邮件,并使用不同的邮件服务器。在实际应用中,我们可以利用 SMTP 发送自动化报告、系统监控通知、注册确认邮件和密码重置邮件等。然而,在使用 SMTP 发送邮件时,我们需要注意邮件服务器的设置、安全性和合法性,以确保邮件能够正常发送并符合相关规定。