#!/usr/bin/python3.8
# -*- coding:UTF-8 -*- import os, sys
sys.path.append(os.path.dirname(os.path.abspath(__file__))) import time, json
import requests
from function.conndb import condb
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.header import Header
import base64 class SendMail(object):
def __init__(self, username, passwd, email_host, recv, title, content, file=None, imagefile=None, ssl=False,
port=25, ssl_port=465):
'''
:param username: 用户名
:param passwd: 密码
:param email_host: smtp服务器地址
:param recv: 收件人,多个要传list ['a@qq.com','b@qq.com]
:param title: 邮件标题
:param content: 邮件正文
:param file: 附件路径,如果不在当前目录下,要写绝对路径,默认没有附件
:param imagefile: 图片路径,如果不在当前目录下,要写绝对路径,默认没有图片
:param ssl: 是否安全链接,默认为普通
:param port: 非安全链接端口,默认为25
:param ssl_port: 安全链接端口,默认为465
'''
self.username = username # 用户名
self.passwd = passwd # 密码
self.recv = recv # 收件人,多个要传list ['a@qq.com','b@qq.com]
self.title = title # 邮件标题
self.content = content # 邮件正文
self.file = file # 附件路径,如果不在当前目录下,要写绝对路径
self.imagefile = imagefile # 图片路径,如果不在当前目录下,要写绝对路径
self.email_host = email_host # smtp服务器地址
self.port = port # 普通端口
self.ssl = ssl # 是否安全链接
self.ssl_port = ssl_port # 安全链接端口 def send_mail(self):
# msg = MIMEMultipart()
msg = MIMEMultipart('mixed')
# 发送内容的对象
if self.file: # 处理附件的
file_name = os.path.split(self.file)[-1] # 只取文件名,不取路径
try:
f = open(self.file, 'rb').read()
except Exception as e:
raise Exception('附件打不开!!!!')
else:
att = MIMEText(f, "base64", "utf-8")
att["Content-Type"] = 'application/octet-stream'
# base64.b64encode(file_name.encode()).decode()
new_file_name = '=?utf-8?b?' + base64.b64encode(file_name.encode()).decode() + '?='
# 这里是处理文件名为中文名的,必须这么写
att["Content-Disposition"] = 'attachment; filename="%s"' % (new_file_name)
msg.attach(att)
if self.imagefile:
try:
sendimagefile = open(self.imagefile, 'rb').read()
except Exception as e:
raise Exception('图片无法打开!!!!')
else:
image = MIMEImage(sendimagefile)
image.add_header('Content-ID', '<image1>')
msg.attach(image)
text_html = MIMEText(self.content, 'html', 'utf-8')
msg.attach(text_html)
# msg.attach(MIMEText(self.content)) # 邮件正文的内容
msg['Subject'] = self.title # 邮件主题
msg['From'] = self.username # 发送者账号
msg['To'] = ','.join(self.recv) # 接收者账号列表
if self.ssl:
self.smtp = smtplib.SMTP_SSL(self.email_host, port=self.ssl_port)
else:
self.smtp = smtplib.SMTP(self.email_host, port=self.port)
# 发送邮件服务器的对象
self.smtp.login(self.username, self.passwd)
try:
self.smtp.sendmail(self.username, self.recv, msg.as_string())
pass
except Exception as e:
print('出错了。。', e)
else:
print('发送成功!{}'.format(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())))
self.smtp.quit() def calculate_time(last_time):
"""
计算两个时间相差天数
:param lastdate: 类型为日期类型
:return: 返回与当前时间相差的天数
"""
timestamp_day1 = time.mktime(time.strptime(last_time, "%Y-%m-%d"))
timestamp_day2 = time.mktime(time.strptime(time.strftime("%Y-%m-%d", time.localtime()), "%Y-%m-%d"))
result = (timestamp_day1 - timestamp_day2) // 60 // 60 // 24
return int(result) def report(username, book, givetime, datenumber):
"""
发送消息到飞书机器人
:param username:
:param book:
:param givetime:
:param datenumber:
:return:
"""
data = {"msg_type": "post", "content": {"post": {
"zh_cn": {"title": "书籍借阅通知", "content": [
[{"tag": "text", "text": "姓名:%s" % (username)}],
[{"tag": "text", "text": "借阅书籍:%s" % (book)}],
[{"tag": "text", "text": "归还时间:%s" % (givetime)}],
[{"tag": "text", "text": "距离归还时间还有(%s)天" % (datenumber)}]
]}}}}
headers = {"Content-Type": "application/json"}
requests.post(url='https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxx',
headers=headers, data=json.dumps(data)) if __name__ == '__main__':
re, reall = condb('SELECT book.name,gtime,chinesename FROM book INNER JOIN person ON book.pid = person.id;')
res, resall = condb('SELECT id,chinesename,mail,birthday FROM person;') for dt in reall:
givetime = dt.get('gtime').strftime("%Y-%m-%d")
day_diff = calculate_time(givetime)
if 0 <= day_diff < 3:
report(dt.get('chinesename'), dt.get('name'), givetime, day_diff) for bd in resall:
date1 = bd.get('birthday').strftime("%m-%d")
date2 = time.strftime("%m-%d", time.localtime())
if date1 == date2:
m = SendMail(
username='xxxxxx@qq.com',
passwd='xxxxxx',
email_host='smtp.exmail.qq.com',
recv=[bd.get('mail')],
title='祝您生日快乐',
content="""
<html>
<head></head>
<body>
<p>Hi!<br>
How are you?<br>
Here is the <a href="http://www.baidu.com">link</a> you wanted.<br>
</p>
<img src="cid:image1">
</body>
</html>
""",
imagefile=r'test.png',
ssl=True,
)
m.send_mail()
# print('生日快乐', bd.get('chinesename'))

https://open.feishu.cn/document/ukTMukTMukTM/ucTM5YjL3ETO24yNxkjN   #飞书机器 人指南

最新文章

  1. iOS:JSON格式字符串转字典,字典转JSON格式字符串
  2. 同一web系统,不同端口的跨域问题
  3. hihocode 1077 : RMQ问题再临-线段树
  4. JQuery识别键盘操作 &amp; 键盘快捷键
  5. 我的cnblogs设置代码
  6. Win32 的dll导入
  7. prototype对象的真正作用
  8. iOS8中的动态文本
  9. nrm是什么?以及nrm的安装与命令
  10. CommonsChunkPlugin并不是分离第三方库的好办法(DllPlugin科学利用浏览器缓存)
  11. Linux-安装FFmpeg
  12. 04 SimpleAdapter
  13. .NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发
  14. count性能
  15. debian9 开启rc.local服务
  16. Kafka实战-实时日志统计流程
  17. 对类方法进行约束(类的抽象方法ABC+raise抛出异常 )
  18. 【01月22日】A股滚动市盈率PE最低排名
  19. 关于PRD、MRD、BRD文档
  20. 《Effective Java》 学习笔记 —— 并发

热门文章

  1. LeetCode-396 选转函数
  2. 五子棋 framebuffer版
  3. asp输入框input通用输入限制
  4. CRM管理系统界面
  5. 魔兽世界2009年更换代理,九城CEO至全体员工公开信
  6. 实践:腾讯云IM搭建应用内类微信社交聊天模块
  7. 项目管理 VS. 个人计划
  8. 2021年全国II巻高考作文刚刚认真看了一下发现很经典,用漫画书法的形式告诉做人的道理!!!说说自己的想法
  9. 51nod 1594 Gcd and Phi
  10. Dependency Analyzer