Python 实现 SMTP 邮箱发送

最近更新于 2025-05-11 14:51

没有使用第三方库,简单实现的一个样例

smtpclient.py

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header

class SmtpClient:
    smtpServer = None
    smtpPort = None
    senderName = None
    senderEmail = None
    senderPassword = None
    receiverEmail = None
    encryption = True

    @staticmethod
    def setEmailConfig(smtpServer: str, smtpPort: int, senderName: str, senderEmail: str, senderPassword: str, receiverEmail: str, encryption: str = 'SSL'):
        """设置发件信息

        Args:
            smtpServer (str): SMTP服务器地址
            smtpPort (int): SMTP服务器端口
            senderName (str): 发件人姓名
            senderEmail (str): 发件人邮箱
            senderPassword (str): 发件人邮箱密码
            receiverEmail (str): 收件人邮箱
            encryption (str): 加密方式(SSL 或 STARTTLS)
        """
        SmtpClient.smtpServer = smtpServer
        SmtpClient.smtpPort = smtpPort
        SmtpClient.senderName = Header(senderName, 'utf-8').encode()
        SmtpClient.senderEmail = senderEmail
        SmtpClient.senderPassword = senderPassword
        SmtpClient.receiverEmail = receiverEmail
        SmtpClient.encryption = encryption

    @staticmethod
    def sendEmail(subject, body) -> tuple[bool, Exception]:
        """发送邮件

        Args:
            subject (str): 邮件主题
            body (str): 邮件内容

        Returns:
            tuple[bool, Exception]: 发送成功返回 (True, None),发送失败返回 (False, Exception)
        """
        if False == all([SmtpClient, SmtpClient.smtpPort, SmtpClient.senderName, SmtpClient.senderEmail, SmtpClient.senderPassword, SmtpClient.receiverEmail]):
            return False, '请先设置发件信息'

        emailMsg = MIMEMultipart()
        emailMsg['From'] = f'{SmtpClient.senderName} <{SmtpClient.senderEmail}>'
        emailMsg['To'] = SmtpClient.receiverEmail
        emailMsg['Subject'] = subject
        emailMsg.attach(MIMEText(body, 'plain'))

        try:
            if SmtpClient.encryption == 'SSL':
                server = smtplib.SMTP_SSL(SmtpClient.smtpServer, SmtpClient.smtpPort)
            else:
                server = smtplib.SMTP(SmtpClient.smtpServer, SmtpClient.smtpPort)
                server.starttls()
            server.login(SmtpClient.senderEmail, SmtpClient.senderPassword)
            server.sendmail(SmtpClient.senderEmail, SmtpClient.receiverEmail, emailMsg.as_string())
            server.quit()
            return True, None
        except Exception as e:
            return False, e

def test():
    SmtpClient.setEmailConfig('邮箱服务器', 邮箱端口, '发件人', '邮箱', '密码', '收件人')
    status, err = SmtpClient.sendEmail('邮件标题', '邮件正文')
    if status:
        print('发送成功')
    else:
        print('发送失败')
        print(err)

if __name__ == '__main__':
    test()

我这里使用 QQ 邮箱的 SMTP
file

设置好邮箱信息,运行测试
file

收到邮件
file

Python 实现 SMTP 邮箱发送
Scroll to top