【實戰:python-Django發送郵件-短信-釘釘通知】

一 Python發送郵件

1.1 使用SMTP模塊發送郵件

import smtplib
from email.mime.text import MIMEText
from email.header import Headermsg_from = '306334678@qq.com'  # 發送方郵箱
passwd = 'luzdikipwhjjbibf'  # 填入發送方郵箱的授權碼(填入自己的授權碼,相當于郵箱密碼)
msg_to = ['616564099@qq.com']  # 收件人郵箱
# msg_to = '616564099@qq.com'  # 收件人郵箱subject = "郵件標題"  # 主題
# *************發送html的郵件**********
content = '''
<p>Python 郵件發送測試...</p>
<p><a href="http://www.baidu.com">這是一個鏈接</a></p>
'''
# 生成一個MIMEText對象
msg = MIMEText(content)
# 放入郵件主題
msg['Subject'] = subject
# 也可以這樣傳參
# msg['Subject'] = Header(subject, 'utf-8')
# 放入發件人
msg['From'] = msg_from
# 放入收件人
# msg['To'] = '616564099@qq.com'
# msg['To'] = '發給你的郵件啊'
try:# 通過ssl方式發送s = smtplib.SMTP_SSL("smtp.qq.com", 465)# 登錄到郵箱s.login(msg_from, passwd)# 發送郵件:發送方,收件方,要發送的消息s.sendmail(msg_from, msg_to, msg.as_string())print('成功')
except s.SMTPException as e:print(e)
finally:s.quit()

1.2 發送html格式郵件

import smtplib
from email.mime.text import MIMEText
from email.header import Headermsg_from = '306334678@qq.com'  # 發送方郵箱
passwd = 'ldoetnwqdjqqbjjj'  # 填入發送方郵箱的授權碼(填入自己的授權碼,相當于郵箱密碼)
msg_to = ['616564099@qq.com']  # 收件人郵箱
# msg_to = '616564099@qq.com'  # 收件人郵箱subject = "郵件標題"  # 主題
# *************發送html的郵件**********
content = '''
<p>Python 郵件發送測試...</p>
<p><a href="http://www.baidu.com">這是一個鏈接</a></p>
'''
# 生成一個MIMEText對象
msg = MIMEText(content)
# 放入郵件主題
msg['Subject'] = subject
# 也可以這樣傳參
# msg['Subject'] = Header(subject, 'utf-8')
# 放入發件人
msg['From'] = msg_from
# 放入收件人
# msg['To'] = '616564099@qq.com'
# msg['To'] = '發給你的郵件啊'
try:# 通過ssl方式發送s = smtplib.SMTP_SSL("smtp.qq.com", 465)# 登錄到郵箱s.login(msg_from, passwd)# 發送郵件:發送方,收件方,要發送的消息s.sendmail(msg_from, msg_to, msg.as_string())print('成功')
except s.SMTPException as e:print(e)
finally:s.quit()

1.3 發送帶附件格式

import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email import  encoders
msg_from = '306334678@qq.com'  # 發送方郵箱
passwd = '***'  # 填入發送方郵箱的授權碼(填入自己的授權碼,相當于郵箱密碼)
msg_to = ['616564099@qq.com']  # 收件人郵箱subject = "郵件標題"  # 主題
# 創建一個帶附件的實例
msg = MIMEMultipart()
# 放入郵件主題
msg['Subject'] = subject
# 也可以這樣傳參
# msg['Subject'] = Header(subject, 'utf-8')
# 放入發件人
msg['From'] = msg_from# 郵件正文內容
msg.attach(MIMEText('Python 郵件發送測試……', 'plain', 'utf-8'))# 構造附件1,傳送當前目錄下的 test.txt 文件
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 這里的filename可以任意寫,寫什么名字,郵件中顯示什么名字
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
msg.attach(att1)# 構造附件2,
with open('test.png', 'rb') as f:# 設置附件的MIME和文件名,這里是png類型:mime = MIMEBase('image', 'png', filename='test.png')# 加上必要的頭信息:mime.add_header('Content-Disposition', 'attachment', filename='test.png')mime.add_header('Content-ID', '<0>')mime.add_header('X-Attachment-Id', '0')# 把附件的內容讀進來:mime.set_payload(f.read())# 用Base64編碼:encoders.encode_base64(mime)# 添加到MIMEMultipart:msg.attach(mime)
# 構造附件3,圖片格式
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
# 定義圖片 ID,在 HTML 文本中引用
msgImage.add_header('Content-ID', '<image1>')
msg.attach(msgImage)
try:# 通過ssl方式發送s = smtplib.SMTP_SSL("smtp.qq.com", 465)# 登錄到郵箱s.login(msg_from, passwd)# 發送郵件:發送方,收件方,要發送的消息s.sendmail(msg_from, msg_to, msg.as_string())print('成功')
except s.SMTPException as e:print(e)
finally:s.quit()

1.4 Django發送郵件

在setting中配置

# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 465
EMAIL_HOST_USER = '306334678@qq.com'  # 帳號
EMAIL_HOST_PASSWORD = '***'  # 密碼
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
#這樣收到的郵件,收件人處就會這樣顯示
#DEFAULT_FROM_EMAIL = 'lqz<'306334678@qq.com>'
EMAIL_USE_SSL = True   #使用ssl
#EMAIL_USE_TLS = False # 使用tls#EMAIL_USE_SSL 和 EMAIL_USE_TLS 是互斥的,即只能有一個為 True

view視圖函數

    from django.core.mail import send_mailimport threadingfrom mybbs import settingst = threading.Thread(target=send_mail, args=("您的文章%s新增了一條評論內容" ,'ddd',settings.EMAIL_HOST_USER,["616564099@qq.com"]))t.start()

一次性發多封郵件

from django.core.mail import send_mass_mailmessage1 = ('第一封郵件標題', '這是郵件內容', 'from@example.com', ['first@example.com', 'other@example.com'])
message2 = ('第二封郵件標題', '這是郵件內容', 'from@example.com', ['second@test.com'])
'''
fail_silently: (可選)布爾值。為 False 時, send_mail 會拋出 smtplib.SMTPException 異常。smtplib 文檔列出了所有可能的異常。 這些異常都是 SMTPException 的子類
'''
send_mass_mail((message1, message2), fail_silently=False)
'''
send_mail 每次發郵件都會建立一個連接,發多封郵件時建立多個連接。而 send_mass_mail 是建立單個連接發送多封郵件,所以一次性發送多封郵件時 send_mass_mail 要優于 send_mail。
'''

攜帶附件或發送html(需要接收方支持)

from django.core.mail import EmailMultiAlternatives
# subject 主題 content 內容 to_addr 是一個列表,發送給哪些人
msg = EmailMultiAlternatives('郵件標題', '郵件內容', '發送方', ['接收方'])
msg.content_subtype = "html"
# 添加附件(可選)
msg.attach_file('test.txt')
# 發送
msg.send()

備注:send_mail 每次發郵件都會建立一個連接,發多封郵件時建立多個連接。而 send_mass_mail 是建立單個連接發送多封郵件,所以一次性發送多封郵件時 send_mass_mail 要優于 send_mail

各大郵箱smtp服務器及端口

新浪郵箱smtp服務器
外發服務器:smtp.vip.sina.com
收件服務器:pop3.vip.sina.com
新浪免費郵件
外發服務器:smtp.sina.com.cn
收件服務器:pop3.sina.com.cn
163郵箱smtp服務器
pop: pop.163.com
smtp: smtp.163.com
QQ郵箱smtp服務器及端口
接收郵件服務器:imap.exmail.qq.com,使用SSL,端口號993
發送郵件服務器:smtp.exmail.qq.com,使用SSL,端口號465587
yahoo郵箱smtp服務器
接:pop.mail.yahoo.com.cn
發:smtp.mail.yahoo.com
126郵箱smtp服務器
pop: pop.126.com
smtp: smtp.126.com
新浪免費郵箱
POP3:pop.sina.com
SMTP:smtp.sina.com
SMTP端口號:25
新浪VIP郵箱
POP3:pop3.vip.sina.com
SMTP:smtp.vip.sina.com
SMTP端口號:25
新浪企業郵箱
POP3:pop.sina.com
SMTP:smtp.sina.com
SMTP端口號:25
雅虎郵箱
POP3:pop.mail.yahoo.cn
SMTP:smtp.mail.yahoo.cn
SMTP端口號:25
搜狐郵箱
POP3:pop3.sohu.com
SMTP:smtp.sohu.com
SMTP端口號:25
TOM郵箱
POP3:pop.tom.com
SMTP:smtp.tom.com
SMTP端口號:25
Gmail郵箱
POP3:pop.gmail.com
SMTP:smtp.gmail.com
SMTP端口號:58725
QQ郵箱
POP3:pop.exmail.qq.com
SMTP:smtp.exmail.qq.com
SMTP端口號:25
263郵箱
域名:263.net
POP3:263.net
SMTP:smtp.263.net
SMTP端口號:25
域名:x263.net
POP3:pop.x263.net
SMTP:smtp.x263.net
SMTP端口號:25
域名:263.net.cn
POP3:263.net.cn
SMTP:263.net.cn
SMTP端口號:25
域名:炫我型
POP3:pop.263xmail.com
SMTP:smtp.263xmail.com
SMTP端口號:25
21CN 免費郵箱
POP3:pop.21cn.com
SMTP:smtp.21cn.com
IMAP:imap.21cn.com
SMTP端口號:25
21CN 經濟郵郵箱
POP3:pop.21cn.com
SMTP:smtp.21cn.com
SMTP端口號:25
21CN 商務郵郵箱
POP3:pop.21cn.net
SMTP:smtp.21cn.net
SMTP端口號:25
21CN 快感郵箱
POP3:vip.21cn.com
SMTP:vip.21cn.com
SMTP端口號:25
21CN Y郵箱
POP3:pop.y.vip.21cn.com
SMTP:smtp.y.vip.21cn.com
SMTP端口號:25
中華網任我郵郵箱
POP3:rwpop.china.com
SMTP:rwsmtp.china.com
SMTP端口號:25
中華網時尚、商務郵箱
POP3:pop.china.com
SMTP:smtp.china.com
SMTP端口號:25

1.5 qq郵箱配置smtp

登錄qq郵箱:

[img]

在這里插入圖片描述

在這里插入圖片描述

開啟smtp服務,生成授權碼

二 Python發送短信

# 發送短信需要借助于第三方短信平臺,比較知名的有-騰訊云短信:https://cloud.tencent.com/act/pro/csms-阿里短信:https://cn.aliyun.com/product/sms?from_alibabacloud=-容聯云短信:https://www.yuntongxun.com/sms/note-inform

在這里插入圖片描述

2.1 騰訊云發送短信-準備

# 訪問地址,完成以下操作:https://console.cloud.tencent.com/smsv21)申請短信簽名 - 國內短信 > 簽名管理【需要有公眾號/備案網站/小程序等】
2)申請短信模塊 - 國內短信 > 正文模板管理【發送短信的格式】
3)使用Python-sdk發送短信-https://cloud.tencent.com/document/product/382/43196

在這里插入圖片描述

2.2 測試發送短信

# 1 安裝模塊
pip install --upgrade tencentcloud-sdk-python
# 2 復制官方代碼測試
# -*- coding: utf-8 -*-
from tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 導入對應產品模塊的client models。
from tencentcloud.sms.v20210111 import sms_client, models# 導入可選配置類
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
try:# 必要步驟:# 實例化一個認證對象,入參需要傳入騰訊云賬戶密鑰對secretId,secretKey。# 這里采用的是從環境變量讀取的方式,需要在環境變量中先設置這兩個值。# 您也可以直接在代碼中寫死密鑰對,但是小心不要將代碼復制、上傳或者分享給他人,# 以免泄露密鑰對危及您的財產安全。# SecretId、SecretKey 查詢: https://console.cloud.tencent.com/cam/capicred = credential.Credential("AKIDqLdhZJvQk9QaXLvHOMRKzQuMhqrlibOy", "YuIYggjdaKuc7Seo16zkKnL3kNpAPTQK")# cred = credential.Credential(#     os.environ.get(""),#     os.environ.get("")# )# 實例化一個http選項,可選的,沒有特殊需求可以跳過。httpProfile = HttpProfile()# 如果需要指定proxy訪問接口,可以按照如下方式初始化hp(無需要直接忽略)# httpProfile = HttpProfile(proxy="http://用戶名:密碼@代理IP:代理端口")httpProfile.reqMethod = "POST"  # post請求(默認為post請求)httpProfile.reqTimeout = 30    # 請求超時時間,單位為秒(默認60秒)httpProfile.endpoint = "sms.tencentcloudapi.com"  # 指定接入地域域名(默認就近接入)# 非必要步驟:# 實例化一個客戶端配置對象,可以指定超時時間等配置clientProfile = ClientProfile()clientProfile.signMethod = "TC3-HMAC-SHA256"  # 指定簽名算法clientProfile.language = "en-US"clientProfile.httpProfile = httpProfile# 實例化要請求產品(以sms為例)的client對象# 第二個參數是地域信息,可以直接填寫字符串ap-guangzhou,支持的地域列表參考 https://cloud.tencent.com/document/api/382/52071#.E5.9C.B0.E5.9F.9F.E5.88.97.E8.A1.A8client = sms_client.SmsClient(cred, "ap-guangzhou", clientProfile)# 實例化一個請求對象,根據調用的接口和實際情況,可以進一步設置請求參數# 您可以直接查詢SDK源碼確定SendSmsRequest有哪些屬性可以設置# 屬性可能是基本類型,也可能引用了另一個數據結構# 推薦使用IDE進行開發,可以方便的跳轉查閱各個接口和數據結構的文檔說明req = models.SendSmsRequest()# 基本類型的設置:# SDK采用的是指針風格指定參數,即使對于基本類型您也需要用指針來對參數賦值。# SDK提供對基本類型的指針引用封裝函數# 幫助鏈接:# 短信控制臺: https://console.cloud.tencent.com/smsv2# 騰訊云短信小助手: https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81# 短信應用ID: 短信SdkAppId在 [短信控制臺] 添加應用后生成的實際SdkAppId,示例如1400006666# 應用 ID 可前往 [短信控制臺](https://console.cloud.tencent.com/smsv2/app-manage) 查看req.SmsSdkAppId = "1400635776"# 短信簽名內容: 使用 UTF-8 編碼,必須填寫已審核通過的簽名# 簽名信息可前往 [國內短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [國際/港澳臺短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的簽名管理查看req.SignName = "小猿取經公眾號"# 模板 ID: 必須填寫已審核通過的模板 ID# 模板 ID 可前往 [國內短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [國際/港澳臺短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看req.TemplateId = "1049981"# 模板參數: 模板參數的個數需要與 TemplateId 對應模板的變量個數保持一致,,若無模板參數,則設置為空req.TemplateParamSet = ["8888",'5']# 下發手機號碼,采用 E.164 標準,+[國家或地區碼][手機號]# 示例如:+8613711112222, 其中前面有一個+號 ,86為國家碼,13711112222為手機號,最多不要超過200個手機號req.PhoneNumberSet = ["+8618953675221"]# 用戶的 session 內容(無需要可忽略): 可以攜帶用戶側 ID 等上下文信息,server 會原樣返回req.SessionContext = ""# 短信碼號擴展號(無需要可忽略): 默認未開通,如需開通請聯系 [騰訊云短信小助手]req.ExtendCode = ""# 國內短信無需填寫該項;國際/港澳臺短信已申請獨立 SenderId 需要填寫該字段,默認使用公共 SenderId,無需填寫該字段。注:月度使用量達到指定量級可申請獨立 SenderId 使用,詳情請聯系 [騰訊云短信小助手](https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81)。req.SenderId = ""resp = client.SendSms(req)# 輸出json格式的字符串回包print(resp.to_json_string(indent=2))# 當出現以下錯誤碼時,快速解決方案參考# - [FailedOperation.SignatureIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.signatureincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)# - [FailedOperation.TemplateIncorrectOrUnapproved](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Afailedoperation.templateincorrectorunapproved-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)# - [UnauthorizedOperation.SmsSdkAppIdVerifyFail](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunauthorizedoperation.smssdkappidverifyfail-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)# - [UnsupportedOperation.ContainDomesticAndInternationalPhoneNumber](https://cloud.tencent.com/document/product/382/9558#.E7.9F.AD.E4.BF.A1.E5.8F.91.E9.80.81.E6.8F.90.E7.A4.BA.EF.BC.9Aunsupportedoperation.containdomesticandinternationalphonenumber-.E5.A6.82.E4.BD.95.E5.A4.84.E7.90.86.EF.BC.9F)# - 更多錯誤,可咨詢[騰訊云助手](https://tccc.qcloud.com/web/im/index.html#/chat?webAppId=8fa15978f85cb41f7e2ea36920cb3ae1&title=Sms)except TencentCloudSDKException as err:print(err)

2.3 django中封裝

# 封裝包:-libssend_tx_sms  #包名__init__.pysettings.py #配置文件sms.py      # 核心文件
################ __init__.py ##############
from .sms import get_code,send_sms_by_phone################ settings.py ##############
SECRET_ID = 'AKIDqLdhZJvQk9QaXLvHOMRKzQuMhqrlibOy'
SECRET_KEY = 'YuIYggjdaKuc7Seo16zkKnL3kNpAPTQK'
APP_ID = '1400635776'
SIGN_NAME='小猿取經公眾號'
TEMPLATE_ID='1049981'################ sms.py  ##############
import randomfrom tencentcloud.common import credential
from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException
# 導入對應產品模塊的client models。
from tencentcloud.sms.v20210111 import sms_client, models# 導入可選配置類
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from . import settings# 獲取n位隨機數組驗證碼的函數
def get_code(num=4):code = ''for i in range(num):random_num = random.randint(0, 9)code += str(random_num)return code# 發送短信函數
def send_sms_by_phone(mobile, code):try:cred = credential.Credential(settings.SECRET_ID, settings.SECRET_KEY)httpProfile = HttpProfile()httpProfile.reqMethod = "POST"  # post請求(默認為post請求)httpProfile.reqTimeout = 30  # 請求超時時間,單位為秒(默認60秒)httpProfile.endpoint = "sms.tencentcloudapi.com"  # 指定接入地域域名(默認就近接入)# 非必要步驟:# 實例化一個客戶端配置對象,可以指定超時時間等配置clientProfile = ClientProfile()clientProfile.signMethod = "TC3-HMAC-SHA256"  # 指定簽名算法clientProfile.language = "en-US"clientProfile.httpProfile = httpProfileclient = sms_client.SmsClient(cred, "ap-guangzhou", clientProfile)req = models.SendSmsRequest()req.SmsSdkAppId = settings.APP_ID  # 騰訊短信創建app把app的id號復制過來https://console.cloud.tencent.com/smsv2/app-manage# 短信簽名內容: 使用 UTF-8 編碼,必須填寫已審核通過的簽名# 簽名信息可前往 [國內短信](https://console.cloud.tencent.com/smsv2/csms-sign) 或 [國際/港澳臺短信](https://console.cloud.tencent.com/smsv2/isms-sign) 的簽名管理查看req.SignName = settings.SIGN_NAME# 模板 ID: 必須填寫已審核通過的模板 ID# 模板 ID 可前往 [國內短信](https://console.cloud.tencent.com/smsv2/csms-template) 或 [國際/港澳臺短信](https://console.cloud.tencent.com/smsv2/isms-template) 的正文模板管理查看req.TemplateId = settings.TEMPLATE_ID# 模板參數: 模板參數的個數需要與 TemplateId 對應模板的變量個數保持一致,,若無模板參數,則設置為空req.TemplateParamSet = [code, '1']# 下發手機號碼,采用 E.164 標準,+[國家或地區碼][手機號]# 示例如:+8613711112222, 其中前面有一個+號 ,86為國家碼,13711112222為手機號,最多不要超過200個手機號req.PhoneNumberSet = ["+86" + mobile, ]# 用戶的 session 內容(無需要可忽略): 可以攜帶用戶側 ID 等上下文信息,server 會原樣返回req.SessionContext = ""req.ExtendCode = ""req.SenderId = ""resp = client.SendSms(req)# 輸出json格式的字符串回包# 字符串類型print(resp.to_json_string(indent=2))return Trueexcept TencentCloudSDKException as err:return False################ views.py ##############
from libs.send_tx_sms import get_code, send_sms_by_phone
def send(request):code = get_code()res = send_sms_by_phone('18953675221', code)if res:return HttpResponse('短信發送成功')else:return HttpResponse('短信發送失敗')

三 Python發送釘釘通知

# 在公司內部,我們可能會使用釘釘發送群通知或個人通知,需要使用釘釘軟件-手機端-pc端(mac,win)
# 釘釘發送通知主要有以下兩種方式-1 發送群通知【群機器人-webhook方式】-使用場景:發送消息到聊天群,需要創建一個聊天機器人-2 發送個人通知【API方式】-使用場景:給公司內某個同事-發送通知類的消息-如果請假審批通過,報銷單審批完成,員工生日祝福等

3.1 發送群通知

#1 文檔(定義群聊天機器人):
https://open.dingtalk.com/document/robots/custom-robot-access
# 2 參照文檔創建聊天機器人單擊群管理 > 機器人 > 添加機器人,選擇自定義機器人# 3 參照api文檔編寫消息發送
https://open.dingtalk.com/document/orgapp/robot-overview

3.1.1 創建機器人

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

3.1.2 發送消息

發送DING消息

# https://open.dingtalk.com/document/orgapp/robot-sends-nail-message
import requests
import time
import hmac
import base64
import hashlib
import urllib
timestamp = str(round(time.time() * 1000))
secret = 'SEC8e6b93d027b9d27443ed6fb24e67777eb89a23d6a6f07e2c6738c3fb98e9549a'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)url = 'https://oapi.dingtalk.com/robot/send?access_token=7f38316d68b269eac5a94aaded02839e5c27ed1365419e16fce6ad24f5e5198b&timestamp=%s&sign=%s'%(timestamp,sign)data = {"msgtype": "text","text": {"content": "通知:監控報警: 服務異常"}
}
res = requests.post(url, json=data)
print(res.text)

發送普通消息[鏈接、markdown消息,feedCard消息]

# https://oapi.dingtalk.com/robot/send?access_token=7f38316d68b269eac5a94aaded02839e5c27ed1365419e16fce6ad24f5e5198b
import requests
import time
import hmac
import base64
import hashlib
import urllib
timestamp = str(round(time.time() * 1000))
secret = 'SEC8e6b93d027b9d27443ed6fb24e67777eb89a23d6a6f07e2c6738c3fb98e9549a'
secret_enc = secret.encode('utf-8')
string_to_sign = '{}\n{}'.format(timestamp, secret)
string_to_sign_enc = string_to_sign.encode('utf-8')
hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest()
sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))
print(timestamp)
print(sign)url = 'https://oapi.dingtalk.com/robot/send?access_token=7f38316d68b269eac5a94aaded02839e5c27ed1365419e16fce6ad24f5e5198b&timestamp=%s&sign=%s'%(timestamp,sign)data = {"msgtype": "link","link": {"text": "這個即將發布的新版本,創始人xx稱它為紅樹林。而在此之前,每當面臨重大升級,產品經理們都會取一個應景的代號,這一次,為什么是紅樹林","title": "時代的火車向前開","picUrl": "","messageUrl": "https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI"}
}res = requests.post(url, json=data)
print(res.text)

發送互動卡片

#1 步驟:
步驟一:登錄開發者后臺,創建內部應用。步驟二:獲取AppKey和AppSecret。步驟三:申請機器人接口權限,搜索“機器人”,選擇機器人相關接口權限并申請。步驟四:獲取應用訪問憑證獲取企業內部應用的access_token。步驟五:登錄互動卡片普通版搭建平臺,搭建卡片模板。步驟六:調用互動卡片服務端接口。調用新版服務端API-機器人發送互動卡片接口,實現發送卡片信息。根據cardBizId卡片標識ID,調用新版服務端API-更新機器人發送互動卡片接口,實現更新卡片內容# 2 文檔地址:
https://open.dingtalk.com/document/resourcedownload/ding-card-interactive-card-operation-process?spm=ding_open_doc.document.0.0.616d40e9XD0pGZ# 3 安裝sdk
pip install alibabacloud_dingtalk

3.3 發送個人通知

# 1 給公司某個發送通知-https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages# 2 在釘釘開放平臺創建企業內部應用/釘釘應用-獲取應用憑證(AgentId、AppKey、AppSecret)-https://open-dev.dingtalk.com/fe/app#/corp/app# 3 獲取用戶token-https://open.dingtalk.com/document/orgapp/obtain-orgapp-token# 4 獲取部門id# 5 獲取部門下所有用戶# 6 獲取所有員工# 7 發送消息

3.3.1 創建應用

# 1 訪問地址:
https://open-dev.dingtalk.com/fe/app#/corp/app
# 2 創建應用# 3 得到應用基本信息
AgentId、AppKey、AppSecret

在這里插入圖片描述

在這里插入圖片描述

3.3.2 獲取token

# 1 文檔地址:
https://open.dingtalk.com/document/orgapp/obtain-orgapp-token# 2 編寫代碼獲取token
def get_access_token(appkey, appsecret):"""獲取access_tokenhttps://open.dingtalk.com/document/orgapp/obtain-orgapp-token"""url = 'https://oapi.dingtalk.com/gettoken'params = {'appkey': appkey,'appsecret': appsecret}res = requests.get(url, params=params)return res.json()

在這里插入圖片描述

3.3.4 獲取在職員工

# 1 接口文檔
https://open.dingtalk.com/document/orgapp/intelligent-personnel-query-the-list-of-on-the-job-employees-of-the# 2 給應用授權# 3 代碼獲取
def get_all_member(access_token):url = "https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob"data = {"access_token": access_token,}body={'status_list':3,'offset':0,'size':50}res_json = requests.post(url=url, params=data,json=body).json()return res_json

在這里插入圖片描述

3.3.5 發送消息

# 1 接口文檔地址
https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages# 2 給應用授權# 3 代碼發送消息
def send_message(access_token, body):"""發送應用消息https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages"""url = 'https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2'params = {'access_token': access_token,}res = requests.post(url, params=params, json=body)return res.json()ret = send_message(token['access_token'], {"agent_id": agent_id,#"userid_list": res['userIds'][0],"userid_list": res['result']['data_list'][0],"msg": {"msgtype": "text","text": {"content": "你好,釘釘"},},
})

3.3.6 獲取部門列表

# 舊版本接口:https://open.dingtalk.com/document/orgapp/obtains-a-list-of-industry-departments
def get_dep_list(access_token):url = "https://oapi.dingtalk.com/department/list"data = {"access_token": access_token,}res_json = requests.get(url=url, params=data).json()print(res_json)return res_json['department'][0]['id']# 新版本接口
def get_dep_list(access_token):url = "https://oapi.dingtalk.com/topapi/v2/department/listsub"data = {"access_token": access_token,}body={# 'dept_id':0,# 'language':'zh_CN'}res_json = requests.post(url=url, params=data,json=body).json()print(res_json)return res_json['result'][0]['dept_id']

3.3.7 獲取部門下人員

# 舊版本接口
def get_memberList(access_token,depId):url = "https://oapi.dingtalk.com/user/getDeptMember"data = {"access_token": access_token,"deptId": depId,}res_json = requests.get(url=url, params=data).json()return res_json# 新版本接口:https://open.dingtalk.com/document/orgapp/obtains-the-list-of-people-under-a-department
def get_memberList(access_token):url = "https://oapi.dingtalk.com/topapi/industry/user/list"data = {"access_token": access_token,}body={"dept_id": 922598227,'cursor':1,'size':10}res_json = requests.post(url=url, params=data,json=body).json()return res_json

在這里插入圖片描述
**在這里插入圖片描述**

3.3.8 總代碼


import requestsdef get_access_token(appkey, appsecret):"""獲取access_tokenhttps://open.dingtalk.com/document/orgapp/obtain-orgapp-token:param appkey: 應用的唯一標識key:param appsecret: 應用的密鑰:return:{"errcode": 0,"access_token": "96fc7a7axxx","errmsg": "ok","expires_in": 7200}"""url = 'https://oapi.dingtalk.com/gettoken'params = {'appkey': appkey,'appsecret': appsecret}res = requests.get(url, params=params)return res.json()def send_message(access_token, body):"""發送應用消息https://open.dingtalk.com/document/orgapp/asynchronous-sending-of-enterprise-session-messages"""url = 'https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2'params = {'access_token': access_token,}res = requests.post(url, params=params, json=body)return res.json()def get_dep_list(access_token):url = "https://oapi.dingtalk.com/department/list"data = {"access_token": access_token,}res_json = requests.get(url=url, params=data).json()print(res_json)return res_json['department'][0]['id']def get_memberList(access_token,depId):url = "https://oapi.dingtalk.com/user/getDeptMember"data = {"access_token": access_token,"deptId": depId,}res_json = requests.get(url=url, params=data).json()return res_jsondef get_all_member(access_token):url = "https://oapi.dingtalk.com/topapi/smartwork/hrm/employee/queryonjob"data = {"access_token": access_token,}body={'status_list':3,'offset':0,'size':50}res_json = requests.post(url=url, params=data,json=body).json()return res_jsonif __name__ == '__main__':# 應用的唯一標識keyappkey = 'dingonm5dhwzzwc1sgnj'# 應用的密鑰appsecret = 'uIn2WinJ87THxLSjUAcuWQwg3hSVwG462UPm6yhi-mkvd2tb3ASjTOetYvuhvXef'# 發送消息時使用的微應用的AgentIDagent_id = '3017843676'# 接收者的userid列表userid_list = ''token = get_access_token(appkey, appsecret)print(token)# 獲取部門dept_id=get_dep_list(token['access_token'])# res=get_memberList(token['access_token'],dept_id)res=get_all_member(token['access_token'])print(res['result']['data_list'][0])# 發消息ret = send_message(token['access_token'], {"agent_id": agent_id,# "userid_list": res['userIds'][1],"userid_list": res['result']['data_list'][0],"msg": {"msgtype": "text","text": {"content": "你好,釘釘通知~~~~"},},})# print(ret)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45453.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45453.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45453.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙語言基礎類庫:【@ohos.uitest (UiTest)】 測試

UiTest UiTest提供模擬UI操作的能力&#xff0c;供開發者在測試場景使用&#xff0c;主要支持如點擊、雙擊、長按、滑動等UI操作能力。 該模塊提供以下功能&#xff1a; [By]&#xff1a;提供控件特征描述能力&#xff0c;用于控件篩選匹配查找。[UiComponent]&#xff1a;代…

實驗四:圖像的銳化處理

目錄 一、實驗目的 二、實驗原理 1. 拉普拉斯算子 2. Sobel算子 3. 模板大小對濾波的影響 三、實驗內容 四、源程序和結果 (1) 主程序(matlab) (2) 函數GrayscaleFilter (3) 函數MatrixAbs 五、結果分析 1. 拉普拉斯濾波 2. Sobel濾波 3. 不同大小模板的濾波…

單點登陸思路及流程

單點登錄&#xff08;Single Sign-On&#xff0c;簡稱SSO&#xff09;是一種流行的身份驗證和授權機制&#xff0c;允許用戶通過一次登錄獲得對多個應用程序或系統的訪問權限。實現單點登錄可以提高用戶體驗、簡化用戶管理和減少密碼重復輸入等問題。下面是一種常見的單點登錄實…

昇思25天學習打卡營第7天 | 基于MindSpore的GPT2文本摘要

本次打卡基于gpt2的文本摘要 數據加載及預處理 from mindnlp.utils import http_get# download dataset url https://download.mindspore.cn/toolkits/mindnlp/dataset/text_generation/nlpcc2017/train_with_summ.txt path http_get(url, ./)from mindspore.dataset impor…

以太坊(以太坊solidity合約)

以太坊&#xff08;以太坊solidity合約&#xff09; 1&#xff0c;以太坊2&#xff0c;開發名詞解釋&#xff08;1&#xff09;錢包&#xff08;2&#xff09;Solidity&#xff08;3&#xff09;Ether&#xff08;以太幣&#xff09;&#xff08;4&#xff09;Truffle&#xff…

Redis 7.x 系列【23】哨兵模式

有道無術&#xff0c;術尚可求&#xff0c;有術無道&#xff0c;止于術。 本系列Redis 版本 7.2.5 源碼地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目錄 1. 概述2. 工作原理2.1 監控2.2 標記下線2.3 哨兵領袖2.4 新的主節點2.5 通知更新 3. …

請求響應(后端必備)

一、請求 1.簡單參數 原始方式&#xff1a; 在原始的web程序中&#xff0c;獲取請求參數&#xff0c;需要通過HttpServletRequest對象手動獲取 RequestMapping("/simpleParam")public String simpleParam(HttpServletRequest request){String name request.getP…

什么叫價內期權?直接帶你了解期權價內期權怎么使用?!

今天帶你了解什么叫價內期權&#xff1f;直接帶你了解期權價內期權怎么使用&#xff1f;&#xff01;價內期權是具有內在價值的期權。期權持有人行權時&#xff0c;對看漲期權而言&#xff0c;行權價格低于標的證券結算價格&#xff1b;對看跌期權而言&#xff0c;標的證券結算…

js 請求blob:https:// 圖片

方式1 def get_file_content_chrome(driver, uri):result driver.execute_async_script("""var uri arguments[0];var callback arguments[1];var toBase64 function(buffer){for(var r,nnew Uint8Array(buffer),tn.length,anew Uint8Array(4*Math.ceil(t/…

前端Vue組件化實踐:自定義加載組件的探索與應用

在前端開發領域&#xff0c;隨著業務邏輯復雜度的提升和系統規模的不斷擴大&#xff0c;傳統的開發方式逐漸暴露出效率低下、維護困難等問題。為了解決這些挑戰&#xff0c;組件化開發作為一種高效、靈活的開發模式&#xff0c;受到了越來越多開發者的青睞。本文將結合實踐&…

Java基礎及進階

JAVA特性 基礎語法 一、Java程序的命令行工具 二、final、finally、finalize 三、繼承 class 父類 { //代碼 }class 子類 extends 父類 { //代碼 }四、Vector、ArrayList、LinkedList 五、原始數據類型和包裝類 六、接口和抽象類 JAVA進階 Java引用隊列 Object counter ne…

PostgreSQL行級安全策略探究

前言 最近和朋友討論oracle行級安全策略(VPD)時&#xff0c;查看了下官方文檔&#xff0c;看起來VPD的原理是針對應用了Oracle行級安全策略的表、視圖或同義詞發出的 SQL 語句動態添加where子句。通俗理解就是將行級安全策略動態添加為where 條件。那么PG中的行級安全策略是怎…

搭建基于 ChatGPT 的問答系統

搭建基于 ChatGPT 的問答系統 &#x1f4e3;1.簡介&#x1f4e3;2.語言模型&#xff0c;提問范式和 token?2.1語言模型?2.2Tokens?2.3Helper function輔助函數&#xff08;提問范式&#xff09; &#x1f4e3;3.評估輸入-分類&#x1f4e3;4.檢查輸入-審核?4.1審核4.1.1 我…

使用UDP通信接收與發送Mavlink2.0協議心跳包完整示例

1.克隆mavlink源碼 https://github.com/mavlink/mavlink.git 2.進入mavlink目錄,安裝依賴 python3 -m pip install -r pymavlink/requirements.txt 3.生成Mavlink的C頭文件 mavlink % python3 -m pymavlink.tools.mavgen --lang=C --wire-protocol=2.0 --output=generated…

1-5歲幼兒胼胝體的表面形態測量

摘要 胼胝體(CC)是大腦中的一個大型白質纖維束&#xff0c;它參與各種認知、感覺和運動過程。盡管CC與多種發育和精神疾病有關&#xff0c;但關于這一結構的正常發育(特別是在幼兒階段)還有很多待解開的謎團。雖然早期文獻中報道了性別二態性&#xff0c;但這些研究的觀察結果…

【Linux網絡】select{理解認識select/select與多線程多進程/認識select函數/使用select開發并發echo服務器}

文章目錄 0.理解/認識回顧回調函數select/pollread與直接使用 read 的效率差異 1.認識selectselect/多線程&#xff08;Multi-threading&#xff09;/多進程&#xff08;Multi-processing&#xff09;select函數socket就緒條件select的特點總結 2.select下echo服務器封裝套接字…

C++ 類和對象 賦值運算符重載

前言&#xff1a; 在上文我們知道數據類型分為自定義類型和內置類型&#xff0c;當我想用內置類型比較大小是非常容易的但是在C中成員變量都是在類(自定義類型)里面的&#xff0c;那我想給類比較大小那該怎么辦呢&#xff1f;這時候運算符重載就出現了 一 運算符重載概念&…

安全防御:防火墻基本模塊

目錄 一、接口 1.1 物理接口 1.2 虛擬接口 二、區域 三、模式 3.1 路由模式 3.2 透明模式 3.3 旁路檢測模式 3.4 混合模式 四、安全策略 五、防火墻的狀態檢測和會話表技術 一、接口 1.1 物理接口 三層口 --- 可以配置IP地址的接口 二層口&#xff1a; 普通二層…

Java面試題:分庫分表

分庫分表 當數據量非常大時,就需要通過分庫分表的方式進行壓力分攤,避免數據庫訪問壓力過大 分庫分表的前提: 業務數據達到一定量級:單表數據量達到1000w或20g 優化解決不了性能問題 分庫分表策略 垂直拆分 垂直分庫 以表為依據,根據業務將不同表拆分到不同庫中 eg:根…