Cette fois, nous allons explorer ** Direct Mail ** de ** Alibaba Cloud DevOps ** en utilisant ** REST API ** avec ** Python **.
Alibaba Cloud Tech Share, auteur John Hanley. Tech Share encourage le partage des connaissances techniques et des meilleures pratiques au sein de la communauté cloud. Programme de motivation.
Mon langage préféré pour apprendre le prototypage rapide et les nouveaux services cloud est Python. Avec Python, la plupart des tâches sont si simples que vous pouvez tester votre nouvelle API en quelques minutes. Cela vous permet de vous concentrer sur l'apprentissage sans avoir à vous soucier des détails du fonctionnement de l'API dans une langue particulière. Mais j'utilise C ++ pour du code au niveau de l'entreprise qui peut coûter des millions de dollars si je fais une erreur.
DirectMail d'Alibaba (https://www.alibabacloud.com/product/directmail?spm=a2c65.11461447.0.0.38ad725bFhEjCQ) ne prend pas en charge Python. PHP, Java et C # sont pris en charge. Un cas d'utilisation très courant de DirectMail est d'envoyer des e-mails à des sites Web dynamiques et statiques. Est de livrer. Pour les sites Web dynamiques, PHP est le meilleur choix. Pour les sites Web statiques, DirectMail (https://www.alibabacloud.com/product/directmail?spm=a2c65.11461447.0.0.38ad725bFhEjCQ) et Function Compute (https://www.alibabacloud.com/ L'intégration produit / fonction-calcul? Spm = a2c65.11461447.0.0.38ad725bFhEjCQ) est parfaite. Cependant, Function Compute ne prend pas en charge PHP. Cela signifie développer dans une langue sur le bureau et dans une autre sur le cloud.
J'ai donc eu l'idée d'utiliser l'API REST de DirectMail. Cela signifie que vous pouvez utiliser Python pour apprendre à utiliser l'API REST et surtout comment créer des signatures moins documentées.
DirectMail prend en charge trois interfaces différentes (toutes les langues ne sont pas prises en charge).
1、Alibaba REST API 2、Alibaba Cloud SDK 3、Alibaba SMTP Interface Dans l'article précédent, j'ai présenté un exemple d'utilisation du SDK (Function Compute) en Python. Cette fois, je vais me concentrer sur l'API REST DirectMail et montrer un exemple de son fonctionnement en Python.
Il existe plusieurs raisons d'utiliser l'API REST.
Exigences de l'API REST
Ceci est un lien vers la documentation d'Alibaba sur les paramètres publics DirectMail.
Nom | type | Est-ce obligatoire | Explication |
---|---|---|---|
Format | String | No | Le type de valeur de réponse. JSON et XML sont pris en charge. XML est le format par défaut. Cet exemple utilise JSON. |
Version | String | Yes | Numéro de version de l'API. Le format est YYYY-MM-C'est DD. RegionID est cn-Pour hangzhou, le numéro de version est 2015-11-vingt trois. RegionID est cn-Si ce n'est pas Hangzhou, le numéro de version est ap-southeast-2017 pour 1 etc.-06-Il est 22 ans. Dans l'exemple 2017-06-Utilisez 22. |
AccessKeyId | String | Yes | AccessKeyId qu'Alibaba Cloud délivre aux utilisateurs pour accéder au service. |
SecurityToken | String | Depends | Ce paramètre n'est pas obligatoire si vous utilisez une clé d'accès définie par l'utilisateur. Si vous utilisez des rôles, le contexte.Un jeton de sécurité transmis à la fonction dans le cadre de l'objet d'informations d'identification. |
Signature | String | Yes | La chaîne du résultat de la signature. Pour plus d'informations sur le calcul de la signature, reportez-vous à "Signature"Prière de se référer à. |
SignatureMethod | String | Yes | Méthode de signature. HMAC-SHA1 est actuellement pris en charge. |
Timestamp | String | Yes | Demander un horodatage. Le format de la date estISO8601Ilestconformeàlanormeetadoptel'heureUTC.Leformatestlesuivant.AAAA-MM-DDThh:mm:ssZ.Exemple:2015-11-23T04:00:00Z(heuredePékin23novembre201512:00:Pour00). |
SignatureVersion | String | Yes | La version de l'algorithme de signature. La version actuelle est 1.C'est 0. |
SignatureNonce | String | Yes | Numéro aléatoire unique. Utilisé pour empêcher les attaques de relecture. Vous devez utiliser un nombre aléatoire différent pour chaque demande. |
RegionId | String | Yes | Informations sur le centre de données. cn-hangzhou、ap-southeast-1、ap-southeast-2 est actuellement pris en charge. |
Commentaires sur les paramètres ci-dessus:
** SignatureNonce **: Ce paramètre est ennuyeux depuis un certain temps. Au début, je pensais que c'était la valeur de sel utilisée lors de la signature de HMAC_SHA1. Cependant, il s'avère qu'il s'agit d'une chaîne générée par uuid.uuid4 () et contenue dans l'en-tête. La répétition de la valeur de cette chaîne dans une commande ultérieure rejettera la commande.
** AccessKeyId **: crée un nouvel utilisateur RAM avec des privilèges DirectMail uniquement. Dans ce cas, vous aurez besoin à la fois d'une clé d'accès et d'un secret de clé d'accès pour l'API REST.
** Horodatage **: Il est important que la date et l'heure du système soient correctes. Si cette heure est différente du service d'Alibaba, la demande sera rejetée. Si possible, utilisez un service de temps tel que NTP pour votre système.
Un lien vers la documentation Alibaba sur les paramètres de requête DirectMail (https://www.alibabacloud.com/help/doc-detail/29444.htm?spm=a2c65.11461447.0.0.38ad725bFhEjCQ).
Nom | type | Est-ce obligatoire | Explication |
---|---|---|---|
Action | String | Required | Nom de l'interface d'exploitation et paramètres requis par le système. Spécifiez la valeur. Envoyer un e-mail unique. |
AccountName | String | Required | L'adresse de l'expéditeur configurée dans la console. |
ReplyToAddress | Boolean | Required | L'adresse de réponse configurée dans la console (l'état doit être "vérifié"). |
AddressType | Number | Required | Plage de valeurs: 0-1. 0 indique un compte aléatoire et 1 indique une adresse d'expéditeur. |
ToAddress | String | Required | Adresse du destinataire. Plusieurs adresses peuvent être séparées par des virgules et prendre en charge jusqu'à 100 adresses. |
FromAlias | String | option | Surnom de l'expéditeur. Le surnom ne doit pas dépasser 15 caractères. Par exemple, le surnom de l'expéditeur est défini sur Daisy et l'adresse de l'expéditeur est [email protected]'est com. Le destinataire est Daisy[email protected]Reportez-vous à l'adresse de. |
Subject | String | Optional | Subject (Recommandation)。 |
HtmlBody | String | Optional | Affichez le corps de l'e-mail en HTML. |
TextBody | String | Optional | Affichez le corps de l'e-mail sous forme de texte. |
ClickTrace | String | Optional | Gamme de valeurs. 0-1. 1 indique que le suivi des destinataires est activé. 0 indique que le suivi des destinataires n'est pas activé. La valeur par défaut de ce paramètre est 0. |
# Correctly formatted date and time
now = datetime.datetime.utcnow()
# Date used by the HTTP "Date" header
date = now.strftime("%a, %d %b %Y %H:%M:%S GMT")
# Date used by the API parameter "Timestamp"
utc = now.isoformat(timespec='seconds') + 'Z'
# HTTP Host header
host = "dm.ap-southeast-1.aliyuncs.com"
# URL for POST
url = "https://dm.ap-southeast-1.aliyuncs.com/"
parameters = {}
# Add the DirectMail public request parameters
parameters["Format"] = "json"
parameters["AccessKeyId"] = credentials['AccessKey']
parameters["SignatureMethod"] = "HMAC-SHA1"
parameters["SignatureType"] = ""
parameters["SignatureVersion"] = "1.0"
parameters["SignatureNonce"] = get_uuid()
parameters["Timestamp"] = utc
parameters["Version"] = "2017-06-22"
parameters["RegionId"] = "ap-southeast-1"
# Add parameters that are always set
parameters["Action"] = "SingleSendMail"
parameters["AddressType"] = "1"
parameters["ReplyToAddress"] = "true"
# Add the DirectMail API parameters
parameters["AccountName"] = dm_account
parameters["FromAlias"] = dm_alias
parameters["ToAddress"] = to_list
parameters["Subject"] = subject
parameters["HtmlBody"] = body
parameters["textBody"] = body_text
def build_request_string(table):
""" Build canonical list """
items = sorted(iter(table.items()), key=lambda d: d[0])
enc = my_urlencode(items)
return enc
Précautions concernant les chaînes de requête
Les paramètres de chaîne de demande doivent être triés en premier. La chaîne est ensuite encodée en URL. Cela signifie que chaque paire clé / valeur aura un caractère &.
Le résultat final ressemble à l'exemple ci-dessous, mais avec une longueur plus longue.
AccessKeyId=LTAIQlgy6erobert&AccountName=test%40test.com&Action=SingleSendMail …
Ceci est un lien vers la documentation d'Alibaba sur DirectMail Signature.
# Build the request string for the signing process
params = build_request_string(parameters)
# Create the actual string to sign (method = "POST")
stringToSign = method + "&%2F&" + percentEncode(params)
Signature = sign(stringToSign, credentials['AccessKeySecret'])
Téléchargez sendEmail.zip.
############################################################
# Version 1.00
# Date Created: 2018-05-26
# Last Update: 2018-05-27
# https://www.neoprime.io
# Copyright (c) 2018, NeoPrime, LLC
############################################################
""" Alibaba Cloud DirectMail REST API With Signing """
import base64
import datetime
import hmac
import hashlib
import urllib
import uuid
import json
import requests
# My library for processing Alibaba Cloud Services (ACS) credentials
import mycred_acs
# From the DirectMail Console
dm_account = "<enter your value here>"
dm_alias = "<enter your value here>"
debug = 0
def set_connection_logging():
""" Enable HTTP connection logging """
if debug is 0:
return
import logging
import http.client as http_client
http_client.HTTPConnection.debuglevel = 1
# You must initialize logging, otherwise you'll not see debug output.
logging.basicConfig()
logging.getLogger().setLevel(logging.DEBUG)
requests_log = logging.getLogger("requests.packages.urllib3")
requests_log.setLevel(logging.DEBUG)
requests_log.propagate = True
return
def get_uuid():
""" return a uuid as a signing nonce """
return str(uuid.uuid4())
def percentEncode(path):
""" Encode a URL """
res = urllib.parse.quote(path)
res = res.replace('+', '%20')
res = res.replace('*', '%2A')
res = res.replace('%7E', '~')
return res
def my_urlencode(query):
""" Encode a Query """
res = urllib.parse.urlencode(query)
res = res.replace('+', '%20')
res = res.replace('*', '%2A')
res = res.replace('%7E', '~')
return res
def build_request_string(table):
""" Build canonical list """
items = sorted(iter(table.items()), key=lambda d: d[0])
enc = my_urlencode(items)
return enc
def sign(string, secret):
""" Sign REST API Request """
nsecret = secret + '&'
h = hmac.new(
bytes(nsecret, "utf-8"),
bytes(string, "utf-8"),
hashlib.sha1)
#sig = base64.b64encode(h.digest())
sig = str(base64.encodebytes(h.digest()).strip(), "utf-8")
return sig
def sendEmail(credentials, subject, body, body_text, to_list):
""" Send an email using Alibaba DirectMail """
# HTTP Method
method = "POST"
# Correctly formatted date and time
now = datetime.datetime.utcnow()
date = now.strftime("%a, %d %b %Y %H:%M:%S GMT")
utc = now.isoformat(timespec='seconds') + 'Z'
# HTTP Host header
host = "dm.ap-southeast-1.aliyuncs.com"
# URL for POST
url = "https://dm.ap-southeast-1.aliyuncs.com/"
parameters = {}
# Add the DirectMail public request parameters
parameters["Format"] = "json"
parameters["AccessKeyId"] = credentials['AccessKey']
parameters["SignatureMethod"] = "HMAC-SHA1"
parameters["SignatureType"] = ""
parameters["SignatureVersion"] = "1.0"
parameters["SignatureNonce"] = get_uuid()
parameters["Timestamp"] = utc
#parameters["Version"] = "2015-11-23"
parameters["Version"] = "2017-06-22"
parameters["RegionId"] = "ap-southeast-1"
# Add parameters that are always set
parameters["Action"] = "SingleSendMail"
parameters["AddressType"] = "1"
parameters["ReplyToAddress"] = "true"
# Add the DirectMail API parameters
parameters["AccountName"] = dm_account
parameters["FromAlias"] = dm_alias
parameters["ToAddress"] = to_list
parameters["Subject"] = subject
parameters["HtmlBody"] = body
parameters["textBody"] = body_text
# Build the request string for the signing process
params = build_request_string(parameters)
# Create the actual string to sign
stringToSign = method + "&%2F&" + percentEncode(params)
#print("String to Sign")
#print(stringToSign)
Signature = sign(stringToSign, credentials['AccessKeySecret'])
#print("Signature", Signature)
parameters["Signature"] = Signature
headers = {
'Date': date,
'Host': host
}
set_connection_logging()
print("Sending Email to", parameters["ToAddress"])
r = requests.post(url, data=parameters, headers=headers)
if r.status_code != 200:
print("Error: Email Send Failed:", r.status_code)
print(r.text)
return 1
#print(r.text)
result = json.loads(r.text)
print("Success: Request ID:", result['RequestId'])
return 0
# Load the Alibaba Cloud Credentials (AccessKey)
cred = mycred_acs.LoadCredentials()
dm_subject = "Welcome to Alibaba Cloud DirectMail"
dm_body = "<h2>Welcome to Alibaba Cloud DirectMail<h2>You are receiving this email as part of a test program.<br /><br />Click for <a href='https://www.neoprime.io/info/alibaba/'>more information<a>.<br /><br /><a href='https://www.alibabacloud.com/'><img src='https://www.neoprime.io/info/alibaba/img/alibaba-600x263.png' alt='Alibaba' width='700'><a>"
dm_body_text = "Welcome to Alibaba Cloud DirectMail\nYou are receiving this email as part of a test program."
dm_to_list = "[email protected], [email protected]
sendEmail(cred, dm_subject, dm_body, dm_body_text, dm_to_list)
Exécuter sur Python 3.x: python sendEmail.py
Alibaba DirectMail Product Page Alibaba DirectMail Documentation Alibaba DirectMail Public parameters Alibaba DirectMail Request parameters Alibaba DirectMail Signature