すべてのプロダクト
Search
ドキュメントセンター

Direct Mail:リクエストの例 (Python 3.6 以降)

最終更新日:Jan 01, 2026

# -*- 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