全部产品

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

   
  1. # -*- coding: utf-8 -*-
  2. import hmac
  3. import uuid
  4. import base64
  5. import datetime
  6. import requests
  7. from hashlib import sha1
  8. from urllib.parse import urlencode
  9. from urllib.parse import quote
  10. def getSignature(param, method):
  11. utf8 = getUtf8Encoder(param)
  12. toSign = method + "&" + quote('/', 'utf-8') + "&" + utf8
  13. message = toSign.encode(encoding='UTF-8', errors='strict')
  14. print("message:", message)
  15. key = (AccessKeySecret + "&").encode(encoding='UTF-8', errors='strict')
  16. bytes = hmac.new(key, message, sha1)
  17. Signature = str(base64.b64encode(bytes.digest()), encoding="utf-8") # base64编码并把byte类型转为字符串
  18. print('Signature base64编码后:' + Signature)
  19. return Signature
  20. def getUtf8Encoder(param):
  21. # utf-8编码
  22. # 把编码后的字符串中加号 + 替换成 %20、星号 * 替换成 %2A、%7E 替换回波浪号 ~,
  23. return quote(param.replace('+', '%20').replace('*', '%2A'), encoding="utf-8")
  24. if __name__ == '__main__':
  25. # https://dm.aliyuncs.com/?Action=SingleSendMail
  26. # & AccountName = test @ example.com
  27. # & AddressType = 1
  28. # & ReceiversName = test2
  29. # & TemplateName = test1
  30. # & 可继续增加参数
  31. # & < 公共请求参数 >
  32. protocol = "https"
  33. method = "POST"
  34. host = "dm.aliyuncs.com"
  35. AccessKeySecret = 'yourAccessKeySecret' # 阿里云颁发给用户的访问服务所用的密钥 ID。需要替换为对应的内容。
  36. time1 = datetime.datetime.now()
  37. time2 = time1 + datetime.timedelta(hours=-8)
  38. print('当前系统时间: ', time1.strftime("%Y-%m-%d %H:%M:%S"), ' -8小时,转换为国际标准时间: ', time2.strftime("%Y-%m-%dT%H:%M:%SZ"))
  39. params_dict = {}
  40. # 参数赋值
  41. params_dict["AccessKeyId"] = 'yourAccessKeyId' # 阿里云颁发给用户的访问服务所用的密钥 ID。需要替换为对应的内容。 #公共请求参数
  42. params_dict["AccountName"] = 'test@t1.test.cn' # 管理控制台中配置的发信地址。
  43. params_dict["Action"] = 'SingleSendMail' # 系统规定参数SingleSendMail/BatchSendMail等接口
  44. params_dict["AddressType"] = 1 # 0:为随机账号 1:为发信地址
  45. params_dict["Format"] = 'JSON' # 返回值的类型,支持 JSON 与 XML。默认为 XML。 #公共请求参数
  46. params_dict["HtmlBody"] = '中文body' # html邮件内容
  47. params_dict["RegionId"] = 'cn-hangzhou' # 机房信息 ,目前支持 cn-hangzhou、ap-southeast-1、ap-southeast-2。
  48. params_dict["ReplyToAddress"] = 'true' # true 为使用控制台设置的回信地址,
  49. params_dict["SignatureMethod"] = 'HMAC-SHA1' # 签名方式,目前支持 HMAC-SHA1。 #公共请求参数
  50. params_dict["SignatureNonce"] = str(uuid.uuid4()) # 公共请求参数 唯一随机数,用于防止网络重放攻击。不同的请求要使用不同的随机数值。您可以使用UUID(随机串),也可以自定义。
  51. params_dict["SignatureVersion"] = 1.0 # 公共请求参数 签名算法版本,目前版本是1.0。
  52. params_dict["Subject"] = '自定义主题' # 邮件主题
  53. params_dict["TagName"] = '自定义标签' # 邮件标签
  54. params_dict["Timestamp"] = time2.strftime(
  55. "%Y-%m-%dT%H:%M:%SZ") # 公共请求参数 请求的时间戳。日期格式按照 ISO8601 标准表示,并需要使用 UTC 时间。格式为YYYY-MM-DDThh:mm:ssZ。 例如,2015-11-23T04:00:00Z(为北京时间 2015年11月23日12点0分0秒)。
  56. params_dict["ToAddress"] = 'testToAddress@test.com' # 收件地址
  57. params_dict["Version"] = '2015-11-23' # 公共请求参数
  58. # Version:
  59. # API 版本号,为日期形式:YYYY-MM-DD。如果参数 RegionID 是 cn-hangzhou,则版本对应为2015-11-23;
  60. # 如参数 RegionID 是cn-hangzhou 以外其他 Region,比如 ap-southeast-1,则版本对应为2017-06-22。
  61. print('初始参数:', params_dict)
  62. # htmlbody的值为例进行编码:
  63. # 初始参数:params_dict["HtmlBody"] = '中文body'
  64. # getSignature函数内的message:%25E4%25B8%25AD%25E6%2596%2587body ,二次URL编码
  65. # 最终生成的URL中:%E4%B8%AD%E6%96%87body
  66. # 对初始参数字典进行URL 编码 dict-->str
  67. #服务器参数顺序不可变更
  68. #字典排序处理代码,增加传参时的顺序自由度
  69. params_dict_sorted = {}
  70. for i in sorted(params_dict):
  71. params_dict_sorted[i] = params_dict[i]
  72. print(params_dict_sorted)
  73. url_dict_to_str = urlencode(params_dict_sorted)
  74. print('第一次URL编码后:' + url_dict_to_str)# 例:%E4%B8%AD%E6%96%87body
  75. print('生成Signature开始。。。')
  76. params_dict["Signature"] = getSignature(url_dict_to_str, method)
  77. print('生成Signature结束。。。')
  78. param = urlencode(params_dict)
  79. print('请求参数添加Signature后,再次URL编码后:' + param)#例:%E4%B8%AD%E6%96%87body
  80. # 生成URL
  81. final_url = protocol + "://" + host
  82. print('最终生成的URL参考:', protocol + "://" + host + "/?" + param)
  83. # post请求URL
  84. response = requests.post(final_url, data=params_dict)
  85. # 返回信息 RequestId 阿里云为该请求生成的唯一标识符。例:{"RequestId":"D0291CF2-BFDA-46F1-9DFD-6B32B5675B38","EnvId":"120414808748"}
  86. print('返回参数:' + response.text)
  87. # 打印url参数
  88. # listurl = final_url.split("&")
  89. # for i in listurl:
  90. # 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