python制作发送各类内容的邮件,并设置定时自动触发,独立封装

文摘   科技   2023-06-20 12:51   北京  


是我,是你


《道德经》里讲:


“信言不美,美言不信;善者不辩,辩者不善。”




回顾上篇



python操作.ini配置文件增、删、改、查

九月de云,公众号:九月de云python操作.ini文件增、删、改、查,二次独立封装


开始本篇


自动发送邮件,是在工作中比较常用到的方式,比较适合固定流程的产物,本次以QQ邮箱为例


环境:

Pycharm

Python 3.9.16



安装:

pip install schedule==1.2.0    # 定时调度库

发邮件用到了stmplib包,它是python内置的库,不需要额外的安装



生成授权码


生成授权码是发送邮件的首先要条件,以下是操作步骤:

打开QQ邮箱主界面,点击【设置】,进入【帐户】页面,

找到

点击【开户服务】,需要验证身份,验证完成后:

中间的授权码就是发邮件所需要的,记录下来,发送邮件的代码中会用到


发送文本邮件


发送纯文本的邮件

# -*- coding: utf-8 -*-import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.header import Header
# 发送邮箱服务器smtp_server = 'smtp.qq.com'# 发送用户和密码user = '发送用户'password = 'ldmxxxxxxxxxxgi'# 发送邮箱sender = '发送邮箱'# 接收邮箱receiver = ['接收邮箱']# 抄送邮箱cc_receiver= ['抄送邮箱1', '抄送邮箱2']# 发送邮箱主题subject = '邮件主题'# 创建一个内容的实例msg = MIMEMultipart()msg['From'] = sendermsg['Subject'] = Header(subject, 'utf-8')msg['To'] = ','.join(receiver)msg['Cc'] = ','.join(cc_receiver)# 邮件正文内容msg.attach(MIMEText('邮件的正文内容', 'plain', 'utf-8'))# 连接发送邮件smtp = smtplib.SMTP()smtp.connect(smtp_server)smtp.login(user, password)smtp.sendmail(sender, receiver + cc_receiver, msg.as_string())smtp.quit()print("Success")

结果:


发送html内容邮件

发送html格式的内容邮件

以下的html的页面内容后续封装的时候,可以直接读取html页面文件,这样会更清晰(文章最后附源码

# -*- coding: utf-8 -*-import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.header import Header
# 发送邮箱服务器smtp_server = 'smtp.qq.com'# 发送用户和密码user = '发送用户'password = 'ldmxxxxxxxxxxgi'# 发送邮箱sender = '发送邮箱'# 接收邮箱receiver = ['接收邮箱']# 抄送邮箱cc_receiver= ['抄送邮箱1', '抄送邮箱2']# 发送邮箱主题subject = '邮件主题'# 创建一个内容的实例msg = MIMEMultipart()msg['From'] = sendermsg['Subject'] = Header(subject, 'utf-8')msg['To'] = ','.join(receiver)msg['Cc'] = ','.join(cc_receiver)# 邮件正文内容email_html = '''<!DOCTYPE html><html><body><style> table { border-collapse: collapse; width: 45%; } th, td { border: 1px solid black; padding: 8px; } th { background-color: #f2f2f2; }</style> <h1>XXX公司</h1> <h2>个人信息表</h2> <table> <thead> <tr> <th>姓名</th> <th>年龄</th> </tr> </thead> <tbody> <tr> <td>张三</td> <td>21</td> </tr> <tr> <td>李四</td> <td>23</td> </tr> <tr> <td>王五</td> <td>32</td> </tr> </tbody> </table></body></html>'''# 将HTML内容添加到邮件对象中msg.attach(MIMEText(email_html, 'html'))# 连接发送邮件smtp = smtplib.SMTP()smtp.connect(smtp_server)smtp.login(user, password)smtp.sendmail(sender, receiver + cc_receiver, msg.as_string())smtp.quit()print("Success")

结果:


发送图片邮件

发送图片内容的邮件

图片的展示,其实也是以html格式引入图片

# -*- coding: utf-8 -*-import smtplibfrom email.mime.image import MIMEImagefrom email.mime.multipart import MIMEMultipartfrom email.header import Headerfrom email.mime.text import MIMEText
# 发送邮箱服务器smtp_server = 'smtp.qq.com'# 发送用户和密码user = '发送用户'password = 'ldmxxxxxxxxxxgi'# 发送邮箱sender = '发送邮箱'# 接收邮箱receiver = ['接收邮箱']# 抄送邮箱cc_receiver= ['抄送邮箱1', '抄送邮箱2']# 发送邮箱主题subject = '邮件主题'# 创建一个内容的实例msg = MIMEMultipart()msg['From'] = sendermsg['Subject'] = Header(subject, 'utf-8')msg['To'] = ','.join(receiver)msg['Cc'] = ','.join(cc_receiver)# 添加图片html_img = f'<p><p>以下是傍晚的海景:</p><br><img lay-src="cid:image1" width="500" height="350"></br></p>'with open('image.jpg', 'rb') as f: image_data = f.read() f.close()image = MIMEImage(image_data)image.add_header('Content-ID', '<image1>')msg.attach(image)msg.attach(MIMEText(html_img, 'html', 'utf-8'))# 连接发送邮件smtp = smtplib.SMTP()smtp.connect(smtp_server)smtp.login(user, password)smtp.sendmail(sender, receiver + cc_receiver, msg.as_string())smtp.quit()print("Success")

结果:


发送带附件邮件

发送带附件的邮件

# -*- coding: utf-8 -*-import smtplibfrom email.mime.multipart import MIMEMultipartfrom email.mime.text import MIMETextfrom email.header import Header
# 发送邮箱服务器smtp_server = 'smtp.qq.com'# 发送用户和密码user = '发送用户'password = 'ldmxxxxxxxxxxgi'# 发送邮箱sender = '发送邮箱'# 接收邮箱receiver = ['接收邮箱']# 抄送邮箱cc_receiver= ['抄送邮箱1', '抄送邮箱2']# 发送邮箱主题subject = '邮件主题'# 创建一个内容的实例msg = MIMEMultipart()msg['From'] = sendermsg['Subject'] = Header(subject, 'utf-8')msg['To'] = ','.join(receiver)msg['Cc'] = ','.join(cc_receiver)# 邮件构造附件with open("Pictures.zip"'rb'as f: attachment_data = f.read() f.close()attachment = MIMEText(attachment_data, 'base64', 'utf-8')attachment["Content-Type"] = 'application/octet-stream'attachment["Content-Disposition"] = 'attachment; filename="Pictures.zip"'msg.attach(attachment)# 连接发送邮件smtp = smtplib.SMTP()smtp.connect(smtp_server)smtp.login(user, password)smtp.sendmail(sender, receiver + cc_receiver, msg.as_string())smtp.quit()print("Success")

结果:


定时发送邮件

设置时间,每天下午7点整,定时发送邮件

# -*- coding: utf-8 -*-import scheduleimport time
# 设置定时任务schedule.every().day.at('19:00').do(send_email)
# 持续运行程序while True: schedule.run_pending()    time.sleep(1)

单独保存为一个运行.py文件,设置完时间后,直接运行即可~!


总结

  • 以上发送邮件的不同类型内容,可以自由组合

  • 其中【发送用户】user 和 【发送邮箱】sender 没有特殊情况下,是发送方的同一个邮箱号

  • 其中【密码】password 就是第一步获取到的授权码


源码及调用方式:

--config.ini:发送者信息

--email.html:测试发送html的页面

--Email_schedule.py:定时调度任务

--Email_tools.py:发送邮件主方法

--image.jpg:测试发送的图片

--Pictures.zip:测试发送的附件

其中在Email_tools中用到读取ini配置文件ini_tools工具,是上篇分享的:

python操作.ini文件增、删、改、查,二次独立封装

九月de云,公众号:九月de云python操作.ini文件增、删、改、查,二次独立封装


直接使用其中get_items()方法即可!



有需求的朋友可自取哟

后台回复“Email”即可获取~!


     

文章就分享到这儿,喜欢就点个吧!




推荐阅读  点击标题可跳转


ISEE小栈
没有花里胡哨,简单才是王道。
 最新文章