# -*- 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") # Encode signature dalam Base64 dan ubah tipe byte menjadi string.
print('Signature setelah encoding Base64:' + Signature)
return Signature
def getUtf8Encoder(param):
# Encoding UTF-8.
# Ganti + dengan %20, * dengan %2A, dan %7E dengan ~ pada string yang telah di-encode.
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
# & Tambahkan parameter lain sesuai kebutuhan.
# & < Parameter permintaan umum >
protocol = "https"
method = "POST"
host = "dm.aliyuncs.com"
AccessKeySecret = os.environ['ALIBABA_CLOUD_ACCESS_KEY_SECRET'] # Rahasia AccessKey yang dikeluarkan oleh Alibaba Cloud. Ganti dengan Rahasia AccessKey Anda sendiri. Kami menyarankan agar Anda mengambilnya dari variabel lingkungan. Untuk informasi selengkapnya, lihat Konfigurasi Pasangan Kunci Akses dalam variabel lingkungan.
time1 = datetime.datetime.now()
time2 = time1 + datetime.timedelta(hours=-8)
print('Waktu sistem saat ini: ', time1.strftime("%Y-%m-%d %H:%M:%S"), ' dikurangi 8 jam, dikonversi ke UTC: ', time2.strftime("%Y-%m-%dT%H:%M:%SZ"))
params_dict = {}
# Tetapkan nilai untuk parameter.
params_dict["AccessKeyId"] = os.environ['ALIBABA_CLOUD_ACCESS_KEY_ID'] # ID AccessKey yang dikeluarkan oleh Alibaba Cloud. Ganti dengan ID AccessKey Anda sendiri. # Parameter yang diperlukan
params_dict["AccountName"] = 'test***@example.net' # Alamat pengirim yang dikonfigurasi di Konsol.
params_dict["Action"] = 'SingleSendMail' # Parameter yang diperlukan, seperti SingleSendMail atau BatchSendMail.
params_dict["AddressType"] = 1 # 0: akun acak. 1: alamat pengirim.
params_dict["Format"] = 'JSON' # Format nilai kembali. Nilai yang valid: JSON dan XML. Nilai default: XML. # Parameter yang diperlukan
params_dict["HtmlBody"] = 'Chinese body' # Isi HTML email.
params_dict["RegionId"] = 'cn-hangzhou' # Informasi data center. Untuk wilayah lain, lihat dokumen titik akhir API.
params_dict["ReplyToAddress"] = 'true' # true: Gunakan alamat balasan yang ditetapkan di Konsol.
params_dict["SignatureMethod"] = 'HMAC-SHA1' # Algoritma signature. Hanya HMAC-SHA1 yang didukung. # Parameter yang diperlukan
params_dict["SignatureNonce"] = str(uuid.uuid4()) # Parameter yang diperlukan. Bilangan acak unik untuk mencegah serangan replay. Gunakan bilangan acak berbeda untuk setiap permintaan. Anda dapat menggunakan UUID atau string kustom.
params_dict["SignatureVersion"] = 1.0 # Parameter yang diperlukan. Versi algoritma signature. Versi saat ini adalah 1.0.
params_dict["Subject"] = 'Custom subject' # Subjek email.
params_dict["TagName"] = 'Custom tag' # Tag email.
params_dict['Template'] = '{"TemplateData":{"username":"222"},"TemplateId":"411558"}'
params_dict["Timestamp"] = time2.strftime(
"%Y-%m-%dT%H:%M:%SZ") # Parameter yang diperlukan. Timestamp permintaan. Waktu harus dalam UTC dan mengikuti standar ISO 8601. Format: YYYY-MM-DDThh:mm:ssZ. Contoh: 2015-11-23T04:00:00Z adalah pukul 12:00:00 pada 23 November 2015 (UTC+8).
params_dict["ToAddress"] = 'test1***@example.net' # Alamat penerima.
params_dict["Version"] = '2015-11-23' # Parameter yang diperlukan
# Version:
# Nomor versi API dalam format YYYY-MM-DD. Versi yang direkomendasikan adalah 2015-11-23.
print('Parameter awal:', params_dict)
# Contoh encoding nilai HtmlBody:
# Parameter awal: params_dict["HtmlBody"] = 'Chinese body'
# message dalam fungsi getSignature: %25E4%25B8%25AD%25E6%2596%2587body, double URL encoded
# Pada URL yang dihasilkan akhir: %E4%B8%AD%E6%96%87body
# URL-encode dictionary parameter awal: dict-->str
# Urutan parameter untuk penandatanganan tidak boleh diubah.
# Kode ini mengurutkan dictionary untuk memastikan urutan parameter yang benar saat penandatanganan.
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('Setelah encoding URL pertama:' + url_dict_to_str)# Contoh: %E4%B8%AD%E6%96%87body
print('Menghasilkan signature...')
params_dict["Signature"] = getSignature(url_dict_to_str, method)
print('Signature berhasil dihasilkan.')
param = urlencode(params_dict)
print('Setelah menambahkan Signature ke parameter permintaan dan melakukan encoding URL lagi:' + param)# Contoh: %E4%B8%AD%E6%96%87body
# Hasilkan URL.
final_url = protocol + "://" + host
print('Contoh URL akhir yang dihasilkan:', protocol + "://" + host + "/?" + param)
# URL permintaan POST
response = requests.post(final_url, data=params_dict)
# Informasi yang dikembalikan. RequestId adalah pengidentifikasi unik yang dihasilkan oleh Alibaba Cloud untuk permintaan tersebut. Contoh: {"RequestId":"D0291CF2-BFDA-46F1-9DFD-6B32B5675B38","EnvId":"120414808748"}
print('Parameter yang dikembalikan:' + response.text)
# Cetak parameter URL.
# listurl = final_url.split("&")
# for i in listurl:
# print(i)Untuk informasi selengkapnya tentang cara mengonfigurasi Pasangan Kunci Akses dalam variabel lingkungan, lihat Konfigurasi Pasangan Kunci Akses dalam variabel lingkungan.
Untuk daftar titik akhir di wilayah lain, lihat Titik akhir API.
Contoh URL permintaan akhir untuk wilayah China (Hangzhou)
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