Python发送飞书消息
#!/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 #飞书机器 人指南
Python发送飞书消息的更多相关文章
- Python调用飞书发送消息
一.创建飞书机器人 自定义飞书机器人操作步骤,具体详见飞书官方文档:<机器人 | 如何在群聊中使用机器人?>
- 使用Python发送、订阅消息
使用Python发送.订阅消息 使用插件 paho-mqtt 官方文档:http://shaocheng.li/post/blog/2017-05-23 Paho 是一个开源的 MQTT 客户端项目, ...
- 使用Python发送企业微信消息
准备工作: 到企业微信官网,注册一个企业:登录企业微信后台,创建一个“自建”应用, 获取企业ID.agentid.secret这3个必要的参数:在企业微信的通讯录中,创建多个测试账号:在手机端安装“企 ...
- Python 发送企业微信消息
1.获取企业微信信息 1)我的企业 --> 企业信息 --> 企业ID 2)创建一个应用,记录该应用的 AgentId.Secret 2.python代码 #!/usr/bin/env p ...
- python发送钉钉消息
import requests import time import hashlib import hmac import base64 import re def SendMessage(messa ...
- Jenkins+Allure测试报告+飞书机器人发送通知
一.前言 之前讲了jenkins如何设置定时任务执行脚本,结合实际情况,本篇讲述在jenkins构建成功后,如何生成测试报告,以及推送飞书(因为我公司用的是飞书,所以是发送到飞书机器人). 本次实践搞 ...
- 火山引擎MARS-APM Plus x 飞书 |降低线上OOM,提高App性能稳定性
通过使用火山引擎MARS-APM Plus的memory graph功能,飞书研发团队有效分析定位问题线上case多达30例,线上OOM率降低到了0.8‰,降幅达到60%.大幅提升了用户体验,为飞书的 ...
- Python并发编程-RabbitMQ消息队列
RabbitMQ队列 RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...
- python 发送post和get请求
摘自:http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201231085444250/ 测试用CGI,名字为test.py,放在ap ...
- 使用Python发送HTML格式的邮件(收到的邮件有发送方才是正解)
发送html格式的和普通文本格式差不多,只是MIMEText(content,"html","utf-8"))与MIMEText(content,"p ...
随机推荐
- [转载]危险操作一追到底--Linux的历史记录
转自:https://zhuanlan.zhihu.com/p/524921170 危险操作一追到底--Linux的历史记录 KellanFan 为了更好的自己 概述 在Linux下使用his ...
- Linux改密码失败authentication token manipulation error 的处理办法
给root改密码时提示:passwd authentication token manipulation error 代表一是有可能是磁盘存储不足了,另一个原因是因为密码文件被赋予了特殊权限,不可被修 ...
- vscode 开发c++
makefile.mk #makefile.mk 公共头文件 ifndef TARGET # /root/make/src/test_include # notdir TARGET:=$(notdir ...
- 动态class 及 动态style
动态改变某一范围内的字体颜色 低于90 大于90小于95 大于95 两种方法都可以 <div class="dhd-num4" :style="{'col ...
- Windows10安装VMware
系统环境: Windows 10 安装步骤: 1.下载vmware https://my.vmware.com/cn/web/vmware/downloads 2.安装(这里安装语言我选择的是中文) ...
- vue-cli4.3中配置publicPath和router后,报错chunk-vendors.js:1 Uncaught SyntaxError: Unexpected token '<'
- kubeSphere+kubernetes 集群更新证书
模拟问题点 使用kubernetes时错误提示 yang@master:~$ kubectl get nodes Unable to connect to the server: x509: cert ...
- crontal 计划任务
crontab每分钟定时执行: */1 * * * * service mysqld restart //每隔1分钟执行一次 */10 * * * * service mysqld restart / ...
- python_类 对象 属性
1, 类 (class) 类的概念表示某种对象的集合,用于表示某一种相同对象的模板.例如:人作为一个类 由这个"人"类定义出来的内容就是这个类定义出来的对象,类还拥有属性和功能,属 ...
- Visual Studio Code 如何设置成中文语言
Visual Studio Code 是一款微软的代码编辑器,这款软件是比较不错的,用起来也比较方便,但是好多人在第一次安装的时候展现的是英文的,这对于一些小伙伴是比较头疼的问题,那如何调整为中文的呢 ...