使用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. 注意事项

  1. SMTP 服务器和端口:不同的邮件服务提供商有不同的 SMTP 服务器地址和端口号。例如,Gmail 的 SMTP 服务器是 smtp.gmail.com,端口号为 587(使用 TLS)。请根据你的邮箱服务提供商进行调整。
  2. 授权码:某些邮箱服务(如 Gmail)需要使用授权码而不是密码进行登录。请在邮箱设置中生成授权码,并在代码中使用授权码代替密码。
  3. 附件路径:如果需要发送附件,请确保附件路径正确,并且文件存在。
  4. 异常处理:在实际使用中,可能会遇到网络问题、认证失败等问题。通过异常处理可以捕获这些错误,并返回详细的错误信息。

4. 总结

通过封装 sendEmail 函数,我们可以方便地实现邮件发送功能,支持纯文本正文和附件。在实际项目中,可以根据需求进一步扩展该函数,例如支持 HTML 格式邮件、批量发送邮件等。

posted @ 2025-07-09 15:51  莫颀  阅读(44)  评论(0)    收藏  举报