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 ...
随机推荐
- JAVA排序的方法
//冒泡排序法: package fuxi;public class Bubble { public static void main(String[] args) { int a ...
- shell 命令小记
if [ -d /abc ] if与后面括号要有空格 中括号与内部的变量也要有空格 for header in `ls *.h` do cp $header /usr/include/mymuduo ...
- 简单介绍Python中如何给字典设置默认值
这篇文章主要介绍了Python中如何给字典设置默认值问题,具有很好的参考价值,希望对大家有所帮助.如有错误或未考虑完全的地方,望不吝赐教 Python字典设置默认值 我们都知道,在 Python 的字 ...
- C# datatable group by分组
DataTable dt = new DataTable(); dt.Columns.Add("A"); dt.Columns.Add("B"); dt.Col ...
- http协议与tcp协议的理解
1.区别 tcp协议是对应于传输层,http协议是对应于应用层,从本质上来说,二者是没有可比性的.http协议是建立在tcp协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发送一次http请 ...
- N63050 第二周运维作业
1.显示/etc目录下,以非字母开头,后面跟了一个字母以及其它任意长度任意字符的文件或目录 1 [root@centos8 etc]#touch 5a.txt 9a.txt 2 [root@cento ...
- (pymssql._pymssql.OperationalError) (8152, b'String or binary data would be truncated.DB-Lib error message 20 018, severity 16:\nGeneral SQL Server error: Check messages from the SQL Server\n')
(pymssql._pymssql.OperationalError) (8152, b'String or binary data would be truncated.DB-Lib error m ...
- 7.Object
Object类 超类.基类,所以类的直接或间接父类,位于继承树的最顶层 任何类,如没有书写extends显示继承某个类,都默认直接继承Object类,否则为间接继承 Object类中所定义的方法,是所 ...
- Nextjs Contentful GraphQL Vercel Edges
配置contentful 1. 创建免费账号 2. 根据提示进行操作, Content Model - 创建页面属性模板 (personalWebsite) content entry - 根据属 ...
- 题解[LuoguP5591]小猪佩奇学数学
题解[LuoguP5591]小猪佩奇学数学 前置知识 基本数论推式子能力,如分配律结合律等 等比数列求和 \(\sum_{i=a}^bx^i=\dfrac{x^{b+1}-x^a}{x-1}\) 二项 ...