# -*- 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 エンコードし、バイト型を文字列に変換します。
print('Signature after Base64 encoding:' + 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 = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'] # Alibaba Cloud によって発行された AccessKey Secret。 ご自身の AccessKey Secret に置き換えてください。 環境変数から取得することを推奨します。 詳細については、「環境変数で AccessKey ペアを設定」をご参照ください。
time1 = datetime.datetime.now()
time2 = time1 + datetime.timedelta(hours=-8)
print('Current system time: ', time1.strftime("%Y-%m-%d %H:%M:%S"), ' -8 hours, converted to UTC: ', time2.strftime("%Y-%m-%dT%H:%M:%SZ"))
params_dict = {}
# パラメーターに値を割り当てます。
params_dict["AccessKeyId"] = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'] # Alibaba Cloud によって発行された AccessKey ID。 ご自身の AccessKey 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"] = 'Chinese body' # メールの HTML 本文。
params_dict["RegionId"] = 'cn-hangzhou' # データセンター情報。他のリージョンについては、API エンドポイントのドキュメントをご参照ください。
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"] = 'Custom subject' # メールの件名。
params_dict["TagName"] = 'Custom tag' # メールタグ。
params_dict['Template'] = '{"TemplateData":{"username":"222"},"TemplateId":"411558"}'
params_dict["Timestamp"] = time2.strftime(
"%Y-%m-%dT%H:%M:%SZ") # 必須パラメーター。リクエストのタイムスタンプ。時刻は UTC で、ISO 8601 標準に準拠している必要があります。フォーマット:YYYY-MM-DDThh:mm:ssZ。たとえば、2015-11-23T04:00:00Z は、2015 年 11 月 23 日 12:00:00 (UTC+08:00) です。
params_dict["ToAddress"] = 'test1***@example.net' # 受信者アドレス。
params_dict["Version"] = '2015-11-23' # 必須パラメーター
# バージョン:
# YYYY-MM-DD フォーマットの API バージョン番号。推奨バージョンは 2015-11-23 です。
print('Initial parameters:', params_dict)
# HtmlBody 値のエンコーディング例:
# 初期パラメーター:params_dict["HtmlBody"] = 'Chinese 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('After the first URL encoding:' + url_dict_to_str)# 例: %E4%B8%AD%E6%96%87body
print('Generating signature...')
params_dict["Signature"] = getSignature(url_dict_to_str, method)
print('Signature generated.')
param = urlencode(params_dict)
print('After adding Signature to the request parameters and URL-encoding again:' + param)# 例: %E4%B8%AD%E6%96%87body
# URL を生成します。
final_url = protocol + "://" + host
print('Example of the final generated URL:', protocol + "://" + host + "/?" + param)
# POST リクエスト URL
response = requests.post(final_url, data=params_dict)
# 戻り情報。RequestId は、Alibaba Cloud がリクエストに対して生成した一意の識別子です。例:{"RequestId":"D0291CF2-BFDA-46F1-9DFD-6B32B5675B38","EnvId":"120414808748"}
print('Returned parameters:' + response.text)
# URL パラメーターを出力します。
# listurl = final_url.split("&")
# for i in listurl:
# print(i)説明
環境変数で AccessKey ペアを設定する方法の詳細については、「環境変数で AccessKey ペアを設定」をご参照ください。
他のリージョンのエンドポイントのリストについては、「API エンドポイント」をご参照ください。
中国 (杭州) リージョンの最終的なリクエスト URL の例
https://dm.aliyuncs.com/?AccessKeyId=xxxxxxxx&AccountName=test%40t1.example.com&Action=SingleSendMail&AddressType=1&Format=JSON&HtmlBody=%E4%B8%AD%E6%96%87body&RegionId=cn-hangzhou&ReplyToAddress=true&SignatureMethod=HMAC-SHA1&SignatureNonce=a883f1bf-e415-4a4d-91ba-085ad3bc7741&SignatureVersion=1.0&Subject=%E8%87%AA%E5%AE%9A%E4%B9%89%E4%B8%BB%E9%A2%98&TagName=%E8%87%AA%E5%AE%9A%E4%B9%89%E6%A0%87%E7%AD%BE&Template=%7B%22TemplateData%22%3A%7B%22username%22%3A%22222%22%7D%2C%22TemplateId%22%3A%22411558%22%7D&Timestamp=2025-12-31T06%3A01%3A51Z&ToAddress=test%40example.com&Version=2015-11-23&Signature=%2Fapm1xqY3Ob9k9IgFbgZcrbeYrg%3D