使用Python发送电子邮件的函数方法封装
在日常编程任务中,发送电子邮件是一项常见的需求,无论是用于通知、报告生成还是自动化流程。Python 提供了强大的库来实现电子邮件的发送功能。本文将介绍如何封装一个通用的电子邮件发送函数,帮助开发者快速实现邮件发送功能。
1. Python 发送邮件的原理
Python 使用 smtplib 模块来处理 SMTP(简单邮件传输协议)通信,通过连接到邮件服务器(如 Gmail、Outlook 等),可以实现邮件的发送。邮件内容可以通过 email.mime 模块构建,支持纯文本、HTML 以及附件等多种形式。
2. 封装邮件发送函数
为了方便使用,我们将邮件发送功能封装为一个函数 sendEmail。该函数将处理邮件的构建、附件添加以及与 SMTP 服务器的交互。
2.1 函数参数说明
sender_email:发件人邮箱地址。sender_password:发件人邮箱密码或授权码(某些邮箱需要使用授权码)。recipient_email:收件人邮箱地址。subject:邮件主题。body:邮件正文内容。smtp_server(可选):SMTP 服务器地址,默认为"smtp.example.com"。smtp_port(可选):SMTP 服务器端口号,默认为587。attachment_path(可选):附件路径,如果不需要附件,可以设置为None。use_tls(可选):是否使用 TLS 加密,默认为True。
2.2 函数实现
以下是 sendEmail 函数的完整代码实现:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from email.utils import formataddr
def sendEmail(
sender_email,
sender_password,
recipient_email,
subject,
body,
smtp_server="smtp.example.com", # 默认SMTP服务器地址
smtp_port=587, # 默认SMTP端口号
attachment_path=None, # 可选附件路径
use_tls=True # 是否使用TLS加密
):
"""
发送邮件的封装方法
参数:
sender_email (str): 发件人邮箱地址
sender_password (str): 发件人邮箱密码(注意:某些邮箱需要使用授权码)
recipient_email (str): 收件人邮箱地址
subject (str): 邮件主题
body (str): 邮件正文内容
smtp_server (str, optional): SMTP服务器地址,默认为 "smtp.example.com"
smtp_port (int, optional): SMTP服务器端口号,默认为 587
attachment_path (str, optional): 附件路径,如果不需要附件,可以设置为 None
use_tls (bool, optional): 是否使用TLS加密,默认为 True
返回:
dict: 包含发送结果的字典,格式为:
{
"code": 200 或 00,
"message": "发送成功" 或 "发送失败的原因"
}
"""
try:
# 创建邮件对象
msg = MIMEMultipart()
msg['From'] = formataddr(('Sender', sender_email))
msg['To'] = formataddr(('Recipient', recipient_email))
msg['Subject'] = subject
# 添加邮件正文
msg.attach(MIMEText(body, 'plain', 'utf-8'))
# 如果有附件,添加附件
if attachment_path:
try:
with open(attachment_path, 'rb') as attachment_file:
part = MIMEApplication(attachment_file.read(), Name=attachment_path.split('/')[-1])
part['Content-Disposition'] = f'attachment; filename="{attachment_path.split("/")[-1]}"'
msg.attach(part)
except FileNotFoundError:
return {
"code": 00,
"message": f"附件文件未找到:{attachment_path}"
}
except Exception as e:
return {
"code": 00,
"message": f"添加附件失败,原因:{str(e)}"
}
# 连接到SMTP服务器并发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
if use_tls:
server.starttls() # 启用TLS加密
server.login(sender_email, sender_password)
server.sendmail(sender_email, recipient_email, msg.as_string())
# 发送成功
return {
"code": 200,
"message": "邮件发送成功"
}
except smtplib.SMTPAuthenticationError:
return {
"code": 00,
"message": "SMTP认证失败,请检查邮箱地址和密码/授权码是否正确"
}
except smtplib.SMTPException as e:
return {
"code": 00,
"message": f"SMTP错误:{str(e)}"
}
except Exception as e:
return {
"code": 00,
"message": f"邮件发送失败,原因:{str(e)}"
}
2.3 示例用法
以下是一个简单的示例,展示如何使用 sendEmail 函数发送邮件:
if __name__ == "__main__":
sender_email = "your_email@example.com" # 替换为你的邮箱地址
sender_password = "your_email_password" # 替换为你的邮箱密码或授权码
recipient_email = "recipient@example.com" # 替换为收件人邮箱地址
subject = "测试邮件"
body = "这是一封测试邮件"
attachment_path = "path/to/your/attachment.pdf" # 如果没有附件,可以设置为 None
result = sendEmail(
sender_email,
sender_password,
recipient_email,
subject,
body,
attachment_path=attachment_path
)
print(result)
3. 注意事项
- SMTP 服务器和端口:不同的邮件服务提供商有不同的 SMTP 服务器地址和端口号。例如,Gmail 的 SMTP 服务器是
smtp.gmail.com,端口号为587(使用 TLS)。请根据你的邮箱服务提供商进行调整。 - 授权码:某些邮箱服务(如 Gmail)需要使用授权码而不是密码进行登录。请在邮箱设置中生成授权码,并在代码中使用授权码代替密码。
- 附件路径:如果需要发送附件,请确保附件路径正确,并且文件存在。
- 异常处理:在实际使用中,可能会遇到网络问题、认证失败等问题。通过异常处理可以捕获这些错误,并返回详细的错误信息。
4. 总结
通过封装 sendEmail 函数,我们可以方便地实现邮件发送功能,支持纯文本正文和附件。在实际项目中,可以根据需求进一步扩展该函数,例如支持 HTML 格式邮件、批量发送邮件等。
时间仓促,如有错误欢迎指出,欢迎在评论区讨论,如对您有帮助还请点个推荐、关注支持一下
作者:莫颀
出处:https://www.cnblogs.com/bokemoqi/p/18974960
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
若内容有侵犯您权益的地方,请公告栏处联系本人,本人定积极配合处理解决。

浙公网安备 33010602011771号