在CSDN上自学了一下python下QQ邮件的发送,想在这里记录一下。
(ps:是个小白,欢迎批评指正)
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 15 23:04:57 2022
构建发邮件类
@author: lhy
"""
#================构建发邮件类==================
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
class send_email_by_qq:
def __init__(self,from_addr,password,to_addr,fro="None",to="None",subject="None"):
self.fro = fro #发送者名字
self.to = to #接受者名字
self.subject = subject #邮件主题
self.from_addr = from_addr #发件方邮箱
self.password = password #授权码(可从QQ邮箱顶部设置中的账户中POP3/SMTP服务(开启)进行获取)
self.to_addr = to_addr #收件方邮箱
#传入一个列表,支持多个邮件地址同时发送
def con_head(self,content):
#构造邮件头信息
#传入MIMEImage、MIMEText、MIMEMultipart对象
content['From'] = Header(self.fro,'utf-8') #发件者名字
content['To'] = Header(self.to,'utf-8') #收件者名字
content['Subject'] = Header(self.subject,'utf-8') #邮件主题
def send(self,content):
#连接、登录邮箱,发送邮件
#传入MIMEImage、MIMEText、MIMEMultipart对象
smtp_server = 'smtp.qq.com' #发送邮件服务器:smtp.qq.com
server = smtplib.SMTP_SSL(smtp_server) #使用SSL,端口号465或587
server.connect(smtp_server,465) #连接
server.login(self.from_addr, self.password) #登录
server.sendmail(self.from_addr, self.to_addr, content.as_string()) #发送
server.quit() #退出
def text(self,content=None,form = "plain",txt_addr=None,file_name="None"):
#发送普通文本或超文本或txt文档:
#发送普通文本或超文本,传入文本内容和格式(form可为plain,html)
#发送txt文档,传入文档地址和想要发送的文档名
if txt_addr==None:
#发送普通文本或超文本
txt = MIMEText(content,form,"utf-8") #在这里html以文本显示(不是附件)
else:
#发送txt文档附件
file = open(txt_addr, 'rb')
txt_content = file.read()
file.close()
txt = MIMEText(txt_content, 'base64', 'utf-8') #构建邮件内容
txt["Content-Type"] = 'application/octet-stream'
txt.add_header('Content-Disposition', 'attachment', filename=file_name+'.txt') #命名发送的附件
try:
self.con_head(txt) #构造邮件头信息
self.send(txt) #发送
print('send text successful!')
except Exception as e:
print(e)
def image(self,image_addr,image_name="None"):
file = open(image_addr, 'rb')
image_content=file.read()
file.close()
image = MIMEImage(image_content) #构建邮件内容
image.add_header('Content-ID', '<image1>')
image.add_header("Content-Disposition",'attachment', filename=image_name+".jpg") #命名发送的附件
try:
self.con_head(image) #构造邮件头信息
self.send(image) #发送
print('send iamge successful!')
except Exception as e:
print(e)
def multiple(self,content_txt=None,content_html=None,image_addr=None,image_name="None",txt_addr=None,file_name="None"):
# 设置总的邮件体对象,对象类型为mixed
msg_root = MIMEMultipart('mixed')
#添加文本内容(1个参数 content_txt)
if content_txt!=None:
# 构造文本内容
text = MIMEText(content_txt, "plain", 'utf-8')
msg_root.attach(text) #添加至邮件对象中
#添加html内容(1个参数 content_html)
if content_html!=None:
html = MIMEText(content_html, "html", 'utf-8')
# 如果不加下边这行代码的,会把超文本的内容当做文本显示(若有文本内容,文本内容无法显示)
html["Content-Disposition"] = 'attachment; filename="csdn.html"' #把超文本的内容加入附件
# 把 构造的内容(文本/html) 写到邮件体中
msg_root.attach(html)
#添加图片(2个参数 image_addr,image_name)
if image_addr!=None:
file = open(image_addr, 'rb')
image_content=file.read()
file.close()
image = MIMEImage(image_content)
image.add_header('Content-ID', '<image1>')
image.add_header("Content-Disposition",'attachment', filename=image_name+".jpg")
msg_root.attach(image)
# 添加txt附件(2个参数 txt_addr,file_name)
if txt_addr != None:
file = open(txt_addr, 'rb')
txt_file_content = file.read()
file.close()
txt_file = MIMEText(txt_file_content, 'base64', 'utf-8')
txt_file["Content-Type"] = 'application/octet-stream'
txt_file.add_header('Content-Disposition', 'attachment', filename=file_name+'.txt')# 命名发送的附件
msg_root.attach(txt_file)
try:
self.con_head(msg_root)
self.send(msg_root)
print('send email successful!')
except Exception as e:
print(e)
if __name__ == '__main__':
#=============测试=============
#传入fro,to,subject,from_addr,password,to_addr
se = send_email_by_qq("**@qq.com",'**',["**@qq.com"],"A","B","A Test")
#====发送文本(2个参数 content,form)
se.text(content = "This is a test", form = "plain")
#====发送html(2个参数 content,form)
url = "https://www.icourse163.org/"
html_info = """
<p>Another World</p>
<p><a href="%s">click me</a></p>
""" % url
se.text(content = html_info, form = "html")
#====发送txt文件(2个参数 txt_addr,file_name)
se.text(txt_addr="D:\\0AAAAAAAAAAAAAAAAAsmalldeskbook\\Python学习\\学习\\邮件\\text.txt",file_name="C")
#====发送图片(2个参数 image_addr,image_name)
se.image(image_addr = "D:\\0AAAAAAAAAAAAAAAAAsmalldeskbook\\Python学习\\学习\\邮件\\dlk.jpg",image_name="迪卢克")
#====多附件发送(content_txt,content_html,image_addr,image_name,txt_addr,file_name)
url = "https://www.icourse163.org/"
html_info = """
<p>Another World</p>
<p><a href="%s">click me</a></p>
""" % url
se.multiple(content_txt="This is a test",
content_html = html_info,
image_addr="D:\\0AAAAAAAAAAAAAAAAAsmalldeskbook\\Python学习\\学习\\邮件\\dlk.jpg", image_name = "迪卢克",
txt_addr="D:\\0AAAAAAAAAAAAAAAAAsmalldeskbook\\Python学习\\学习\\邮件\\text.txt", file_name="C")
下面是多附件发送的结果展示