• 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'))
  • 相关阅读:
    希尔排序
    插入排序
    Unity创建一个简易的弹簧(弹动)效果
    看到个美到爆的菜单,忍不住扒下来~
    用avalon实现一个完整的todomvc(带router)
    页面动态加入<script>标签并执行代码
    一个简单粗暴的前后端分离方案
    常用的HTML5、CSS3新特性能力检测写法
    犀利的background-clip:text,实现K歌字幕效果
    用canvas开发H5游戏小记
  • 原文地址:https://www.cnblogs.com/xwupiaomiao/p/16116447.html
Copyright © 2020-2023  润新知