• 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'))
  • 相关阅读:
    mysql delete 不支持表别名
    查找应用编译时所找的动态库:LD_DEBUG
    ng
    linux 开机启动自动执行某用户的脚步、程序
    理解Linux系统中的load average(图文版)
    char指针与数组(转载)
    堆 栈 静态区
    linux下which、whereis、locate、find 命令的区别
    linux c动态库编译好了,不能用。有些方法报(undefined reference)错误。
    浅谈管理系统操作日志设计(附操作日志类)
  • 原文地址:https://www.cnblogs.com/xwupiaomiao/p/16116447.html
Copyright © 2020-2023  润新知