文档

请求示例(Python3.6及以上)

更新时间:

# -*- coding: utf-8 -*-
import hmac
import uuid
import base64
import datetime
import requests

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类型转为字符串
    print('Signature base64编码后:' + Signature)
    return Signature


def getUtf8Encoder(param):
    # utf-8编码
    # 把编码后的字符串中加号 + 替换成 %20、星号 * 替换成 %2A、%7E 替换回波浪号 ~,
    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
    # & 可继续增加参数
    # & < 公共请求参数 >

    protocol = "https"
    method = "POST"
    host = "dm.aliyuncs.com"
    AccessKeySecret = 'yourAccessKeySecret'  # 阿里云颁发给用户的访问服务所用的密钥 ID。需要替换为对应的内容。

    time1 = datetime.datetime.now()
    time2 = time1 + datetime.timedelta(hours=-8)

    print('当前系统时间: ', time1.strftime("%Y-%m-%d %H:%M:%S"), ' -8小时,转换为国际标准时间:', time2.strftime("%Y-%m-%dT%H:%M:%SZ"))

    params_dict = {}
    # 参数赋值
    params_dict["AccessKeyId"] = 'yourAccessKeyId'  # 阿里云颁发给用户的访问服务所用的密钥 ID。需要替换为对应的内容。                #公共请求参数
    params_dict["AccountName"] = 'test***@example.net'  # 管理控制台中配置的发信地址。
    params_dict["Action"] = 'SingleSendMail'  # 系统规定参数SingleSendMail/BatchSendMail等接口
    params_dict["AddressType"] = 1  # 0:为随机账号 1:为发信地址
    params_dict["Format"] = 'JSON'  # 返回值的类型,支持 JSON 与 XML。默认为 XML。  #公共请求参数
    params_dict["HtmlBody"] = '中文body'  # html邮件内容
    params_dict["RegionId"] = 'cn-hangzhou'  # 机房信息 ,目前支持 cn-hangzhou、ap-southeast-1、ap-southeast-2。
    params_dict["ReplyToAddress"] = 'true'  # true 为使用控制台设置的回信地址,
    params_dict["SignatureMethod"] = 'HMAC-SHA1'  # 签名方式,目前支持 HMAC-SHA1。                #公共请求参数
    params_dict["SignatureNonce"] = str(uuid.uuid4())  # 公共请求参数,唯一随机数,用于防止网络重放攻击。不同的请求要使用不同的随机数值。您可以使用UUID(随机串),也可以自定义。
    params_dict["SignatureVersion"] = 1.0  # 公共请求参数,签名算法版本,目前版本是1.0。
    params_dict["Subject"] = '自定义主题'  # 邮件主题
    params_dict["TagName"] = '自定义标签'  # 邮件标签
    params_dict["Timestamp"] = time2.strftime(
        "%Y-%m-%dT%H:%M:%SZ")  # 公共请求参数,请求的时间戳。日期格式按照 ISO8601 标准表示,并需要使用 UTC 时间。格式为YYYY-MM-DDThh:mm:ssZ。 例如,2015-11-23T04:00:00Z(为北京时间 2015年11月23日12点0分0秒)。
    params_dict["ToAddress"] = 'test1***@example.net'  # 收件地址
    params_dict["Version"] = '2015-11-23'  # 公共请求参数
    # Version:
    # API 版本号,为日期形式:YYYY-MM-DD。如果参数 RegionID 是 cn-hangzhou,则版本对应为2015-11-23;
    # 如参数 RegionID 是cn-hangzhou 以外其他 Region,比如 ap-southeast-1,则版本对应为2017-06-22。

    print('初始参数:', params_dict)
    # htmlbody的值为例进行编码:
    # 初始参数:params_dict["HtmlBody"] = '中文body'
    # getSignature函数内的message:%25E4%25B8%25AD%25E6%2596%2587body ,二次URL编码
    # 最终生成的URL中:%E4%B8%AD%E6%96%87body
    # 对初始参数字典进行URL 编码 dict-->str

    #服务器参数顺序不可变更
    #字典排序处理代码,增加传参时的顺序自由度
    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结束。。。')
    param = urlencode(params_dict)
    print('请求参数添加Signature后,再次URL编码后:' + param)#例:%E4%B8%AD%E6%96%87body
    # 生成URL
    final_url = protocol + "://" + host
    print('最终生成的URL参考:', protocol + "://" + host + "/?" + param)
    # post请求URL
    response = requests.post(final_url, data=params_dict)
    # 返回信息 RequestId 阿里云为该请求生成的唯一标识符。例:{"RequestId":"D0291CF2-BFDA-46F1-9DFD-6B32B5675B38","EnvId":"120414808748"}
    print('返回参数:' + response.text)
    # 打印url参数
    # listurl = final_url.split("&")
    # for i in listurl:
    #     print(i)

杭州服务区域最后发出的URL请求示例如下

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

  • 本页导读 (0)