最近更新于 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
设置好邮箱信息,运行测试
收到邮件
Python 实现 SMTP 邮箱发送