使用python发送QQ邮件
可以给多人发送邮件
可以添加附件
代码和使用方法如下
注:只能发送QQ邮件
首先按照一下步骤设置自己的邮箱,打开SMTP
开启后获取授权码才可以使用
import os
import datetime
import smtplib # smtplib 用于邮件的发信动作
from email.mime.text import MIMEText # email 用于构建邮件内容
from email.mime.multipart import MIMEMultipart # 用于实例化附件(处理多种形态的邮件主体我们需要 MIMEMultipart 类)
from email.header import Header # Header 用来构建邮件头
from email.mime.image import MIMEImage # 图片
from email.mime.application import MIMEApplication # pdf、word、csv、zip
from email.utils import formataddr
class SendQQEmail:
"""
注意:发送附件文件名如果是中文的话会乱码
发送QQ邮件
使用方式:
实例化发邮件这个类
qqEmail = SendQQEmail(sender="xxxx@qq.com", # 发送邮件的邮箱
password=r"xxxx", # 获取的授权码
senderName="发件人:你的姓名", # 你发的邮件得让人知道你是谁吧
receivers=["xxxx@qq.com", 'xxxx@qq.com']) # 接收人,多个就是list[str, str, ...]
# 设置邮件标题
qqEmail.setEmailTitle("Title")
# 设置邮件正文内容
qqEmail.setEmailContent("Content")
# 添加附件
qqEmail.addAttachFile(r"Path")
# 发送邮件
qqEmail.sendEmail()
"""
def __init__(self, sender, password, senderName, receivers: list):
"""
:param sender: 发送邮箱str
:param password: qq邮箱的授权码str
:param senderName: 发件人姓名
:param receivers: 接收邮箱list[str, str, str, ...]
"""
self._sender = sender
self._password = password
self._senderName = senderName
self._receivers = receivers
# 邮件内容
self._EmailContent = f"e-mail from {self._sender}."
# 设置邮件主体
self._EmailTitle = f"e-mail from {self._sender}."
# 保存附件
self._AttachFiles = []
def setEmailContent(self, message: str):
"""
设置发送邮件的内容
默认:"e-mail from {self._sender}."
:param message:
:return:
"""
self._EmailContent = message
def setEmailTitle(self, title: str):
"""
设置邮件主题
默认:"e-mail from {self._sender}."
:param title:
:return:
"""
self._EmailTitle = title
def addAttachFile(self, path):
"""
添加发送的附件,自动判断添加的附件使用对应的方法发送
:param path:
:return:
"""
# 文件名
baseName = os.path.basename(path)
# 后缀名:.pdf/.txt/.cxv/.zip
postfix = os.path.splitext(path)[-1]
if os.path.exists(path):
if postfix in ['.txt', ]:
# 这里就得是发送bin的数据,我尝试使用str转换格式,但是接收的图片不能查看
file = MIMEText(open(path, 'rb').read(), 'base64', 'utf-8')
file["content_Type"] = 'application/octet-stream'
# 表示这是附件,名字是啥
file["Content-Disposition"] = f'attachment; filename="{baseName}"'
self._AttachFiles.append(file)
elif postfix.lower() in ['.jpg', '.jpeg', '.png', '.bmp']:
file = MIMEImage(open(path, 'rb').read(), postfix)
file.add_header('Content-Disposition', 'attachment', filename=baseName)
self._AttachFiles.append(file)
# ['.pdf', '.doc', '.docx', '.csv', '.zip', '.json', '.ppt', '.pptx']
else:
file = MIMEApplication(open(path, 'rb').read())
file.add_header('Content-Disposition', 'attachment', filename=baseName)
self._AttachFiles.append(file)
else:
print(f"{path} not exist.")
def Application(self, path):
"""
发送pdf、word、zip、csv附件接口
['pdf', 'doc', 'docx', 'csv', 'zip', '.json']
:param path:
:return:
"""
# 文件名
baseName = os.path.basename(path)
# 后缀名
postfix = os.path.splitext(path)[-1]
if os.path.exists(path):
file = MIMEApplication(open(path, 'rb').read())
file.add_header('Content-Disposition', 'attachment', filename=baseName)
self._AttachFiles.append(file)
else:
print(f"{path} not exist.")
def Image(self, path):
"""
发送图片接口
:param path:
:return:
"""
# 文件名
baseName = os.path.basename(path)
# 后缀名
postfix = os.path.splitext(path)[-1]
if os.path.exists(path) and postfix.lower() in ['.jpg', '.jpeg', '.png', '.bmp']:
file = MIMEImage(open(path, 'rb').read(), postfix)
file.add_header('Content-Disposition', 'attachment', filename=baseName)
self._AttachFiles.append(file)
else:
print(f"{path} not exist.")
def sendEmail(self):
"""
使用该方法发送邮件
:return:
"""
if len(self._AttachFiles): # 带有附件
# 实例化附件邮件实例
message = MIMEMultipart()
# 发件人:name e-mail
message['From'] = formataddr((Header(self._senderName, 'utf-8').encode(), self._sender))
# 邮件主题
message['Subject'] = Header(self._EmailTitle)
# 收件人
message['To'] = Header(','.join(self._receivers))
# 邮件内容
information = f"{self._EmailContent}\n\n发件人:{self._senderName}\n{self.getDataTime()}"
content = MIMEText(information, 'plain', 'utf-8')
message.attach(content)
# 邮件附件
for file in self._AttachFiles:
message.attach(file)
else: # 只有文本
information = f"{self._EmailContent}\n\n发件人:{self._senderName}\n{self.getDataTime()}"
message = MIMEText(information, 'plain', 'utf-8')
# 发件人
message['From'] = formataddr((Header(self._senderName, 'utf-8').encode(), self._sender))
# 邮件主题
message['Subject'] = Header(self._EmailTitle)
# 收件人
message['To'] = Header(','.join(self._receivers))
try:
# 连接QQ邮箱的SMTP服务器和对应端口
server = smtplib.SMTP_SSL("smtp.qq.com", 465)
# 登录账号
server.login(self._sender, self._password)
# 发送邮件
server.sendmail(self._sender, self._receivers, message.as_string())
# 关闭服务器
server.quit()
print("send successful...")
except smtplib.SMTPException as E:
print('error', E)
finally:
# 不论发送成功还是失败,都要将本次添加的附件删除。否则会导致附件越来越多
self._AttachFiles.clear()
@staticmethod
def getDataTime():
return datetime.datetime.now().strftime('data:%Y-%m-%d(week:%w) time:%H:%M:%S')