請(qǐng)求示例(Python3.6及以上)
更新時(shí)間:
# -*- coding: utf-8 -*-
import hmac
import uuid
import base64
import datetime
import requests
import os
from hashlib import sha1
from urllib.parse import urlencode
from urllib.parse import quote
def getSignature(param, method):
utf8 = getUtf8Encoder(param)
toSign = method + "&" + quote('/', 'utf-8') + "&" + utf8
message = toSign.encode(encoding='UTF-8', errors='strict')
print("message:", message)
key = (AccessKeySecret + "&").encode(encoding='UTF-8', errors='strict')
bytes = hmac.new(key, message, sha1)
Signature = str(base64.b64encode(bytes.digest()), encoding="utf-8") # base64編碼并把byte類型轉(zhuǎn)為字符串
print('Signature base64編碼后:' + Signature)
return Signature
def getUtf8Encoder(param):
# utf-8編碼
# 把編碼后的字符串中加號(hào) + 替換成 %20、星號(hào) * 替換成 %2A、%7E 替換回波浪號(hào) ~,
return quote(param.replace('+', '%20').replace('*', '%2A'), encoding="utf-8")
if __name__ == '__main__':
# https://dm.aliyuncs.com/?Action=SingleSendMail
# & AccountName = test @ example.com
# & AddressType = 1
# & ReceiversName = test2
# & TemplateName = test1
# & 可繼續(xù)增加參數(shù)
# & < 公共請(qǐng)求參數(shù) >
protocol = "https"
method = "POST"
host = "dm.aliyuncs.com"
AccessKeySecret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'] # 阿里云頒發(fā)給用戶的訪問服務(wù)所用的密鑰 ID。需要替換為對(duì)應(yīng)的內(nèi)容。建議配置到環(huán)境變量中獲取,請(qǐng)參考文檔:在環(huán)境變量中配置身份驗(yàn)證AccessKey。
time1 = datetime.datetime.now()
time2 = time1 + datetime.timedelta(hours=-8)
print('當(dāng)前系統(tǒng)時(shí)間: ', time1.strftime("%Y-%m-%d %H:%M:%S"), ' -8小時(shí),轉(zhuǎn)換為國際標(biāo)準(zhǔn)時(shí)間:', time2.strftime("%Y-%m-%dT%H:%M:%SZ"))
params_dict = {}
# 參數(shù)賦值
params_dict["AccessKeyId"] = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'] # 阿里云頒發(fā)給用戶的訪問服務(wù)所用的密鑰 ID。需要替換為對(duì)應(yīng)的內(nèi)容。 #公共請(qǐng)求參數(shù)
params_dict["AccountName"] = 'test***@example.net' # 管理控制臺(tái)中配置的發(fā)信地址。
params_dict["Action"] = 'SingleSendMail' # 系統(tǒng)規(guī)定參數(shù)SingleSendMail/BatchSendMail等接口
params_dict["AddressType"] = 1 # 0:為隨機(jī)賬號(hào) 1:為發(fā)信地址
params_dict["Format"] = 'JSON' # 返回值的類型,支持 JSON 與 XML。默認(rèn)為 XML。 #公共請(qǐng)求參數(shù)
params_dict["HtmlBody"] = '中文body' # html郵件內(nèi)容
params_dict["RegionId"] = 'cn-hangzhou' # 機(jī)房信息。其他區(qū)域請(qǐng)參考API服務(wù)地址文檔獲取。
params_dict["ReplyToAddress"] = 'true' # true 為使用控制臺(tái)設(shè)置的回信地址,
params_dict["SignatureMethod"] = 'HMAC-SHA1' # 簽名方式,目前支持 HMAC-SHA1。 #公共請(qǐng)求參數(shù)
params_dict["SignatureNonce"] = str(uuid.uuid4()) # 公共請(qǐng)求參數(shù),唯一隨機(jī)數(shù),用于防止網(wǎng)絡(luò)重放攻擊。不同的請(qǐng)求要使用不同的隨機(jī)數(shù)值。您可以使用UUID(隨機(jī)串),也可以自定義。
params_dict["SignatureVersion"] = 1.0 # 公共請(qǐng)求參數(shù),簽名算法版本,目前版本是1.0。
params_dict["Subject"] = '自定義主題' # 郵件主題
params_dict["TagName"] = '自定義標(biāo)簽' # 郵件標(biāo)簽
params_dict["Timestamp"] = time2.strftime(
"%Y-%m-%dT%H:%M:%SZ") # 公共請(qǐng)求參數(shù),請(qǐng)求的時(shí)間戳。日期格式按照 ISO8601 標(biāo)準(zhǔn)表示,并需要使用 UTC 時(shí)間。格式為YYYY-MM-DDThh:mm:ssZ。 例如,2015-11-23T04:00:00Z(為北京時(shí)間 2015年11月23日12點(diǎn)0分0秒)。
params_dict["ToAddress"] = 'test1***@example.net' # 收件地址
params_dict["Version"] = '2015-11-23' # 公共請(qǐng)求參數(shù)
# Version:
# API 版本號(hào),為日期形式:YYYY-MM-DD。推薦版本為2015-11-23。
print('初始參數(shù):', params_dict)
# htmlbody的值為例進(jìn)行編碼:
# 初始參數(shù):params_dict["HtmlBody"] = '中文body'
# getSignature函數(shù)內(nèi)的message:%25E4%25B8%25AD%25E6%2596%2587body ,二次URL編碼
# 最終生成的URL中:%E4%B8%AD%E6%96%87body
# 對(duì)初始參數(shù)字典進(jìn)行URL 編碼 dict-->str
#服務(wù)器參數(shù)順序不可變更
#字典排序處理代碼,增加傳參時(shí)的順序自由度
params_dict_sorted = {}
for i in sorted(params_dict):
params_dict_sorted[i] = params_dict[i]
print(params_dict_sorted)
url_dict_to_str = urlencode(params_dict_sorted)
print('第一次URL編碼后:' + url_dict_to_str)# 例:%E4%B8%AD%E6%96%87body
print('生成Signature開始。。。')
params_dict["Signature"] = getSignature(url_dict_to_str, method)
print('生成Signature結(jié)束。。。')
param = urlencode(params_dict)
print('請(qǐng)求參數(shù)添加Signature后,再次URL編碼后:' + param)#例:%E4%B8%AD%E6%96%87body
# 生成URL
final_url = protocol + "://" + host
print('最終生成的URL參考:', protocol + "://" + host + "/?" + param)
# post請(qǐng)求URL
response = requests.post(final_url, data=params_dict)
# 返回信息 RequestId 阿里云為該請(qǐng)求生成的唯一標(biāo)識(shí)符。例:{"RequestId":"D0291CF2-BFDA-46F1-9DFD-6B32B5675B38","EnvId":"120414808748"}
print('返回參數(shù):' + response.text)
# 打印url參數(shù)
# listurl = final_url.split("&")
# for i in listurl:
# print(i)
說明
如何將AccessKeySecret和AccessKeyId配置到環(huán)境變量中,請(qǐng)參考:在環(huán)境變量中配置身份驗(yàn)證AccessKey
如何獲取其他區(qū)域的RegionId,請(qǐng)參考:API服務(wù)地址
杭州服務(wù)區(qū)域最后發(fā)出的URL請(qǐng)求示例如下
https://dm.aliyuncs.com/?AccessKeyId=XXXXXXXXXXX&AccountName=XXXXXXXXXXX%40XXXX.cn&Action=SingleSendMail&AddressType=1&Format=JSON&HtmlBody=%E4%B8%AD%E6%96%87body&RegionId=cn-hangzhou&ReplyToAddress=true&SignatureMethod=HMAC-SHA1&SignatureNonce=2e2775c5-00cc-40f6-b37d-31e1d908c180&SignatureVersion=1.0&Subject=%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%BB%E9%A2%98&Timestamp=2021-06-10T04%3A00%3A18Z&ToAddress=XXXXXXXXXXX%40XXXX.com&Version=2015-11-23&Signature=tBINlvjpfiyFy6Of91xgTlHsPmk%3D
文檔內(nèi)容是否對(duì)您有幫助?