Livre de recettes Cloud DevOps, partie 4 - Explorez DevOps DirectMail en Python avec l'API REST

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.

API REST Alibaba Cloud DirectMail

Il existe plusieurs raisons d'utiliser l'API REST.

  1. Comprendre les API, les paramètres et les erreurs de bas niveau. 2, l'espace de code est petit. 3, temps de chargement et d'exécution raccourci. 4, il y a peu de dépendances. 5, il n'est pas nécessaire d'installer la bibliothèque SDK sur le système cible. 6, le SDK n'est pas disponible dans la langue cible.

Exigences de l'API REST

  1. Comprenez HTTPS, les en-têtes HTTP et les corps HTTP.
  2. Comprenez la différence entre les méthodes HTTP HEAD, DELETE, GET, POST et PUT.
  3. Comprenez comment envoyer des données pour chaque méthode HTTP.
  4. Comprenez les paramètres d'API qui doivent être inclus dans chaque méthode HTTP.
  5. Comprenez comment signer des requêtes HTTP.

Paramètres publics du cloud Alibaba

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.

Paramètres de requête Alibaba Cloud DirectMail

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.

Calculez la date correcte

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

Hôte et point de terminaison dans cet exemple (Singapour-> ap-sud-est-1)

# HTTP Host header
host = "dm.ap-southeast-1.aliyuncs.com"

# URL for POST
url = "https://dm.ap-southeast-1.aliyuncs.com/"

Construire une liste de paramètres de paramètres publics

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"

Construire une liste de paramètres de paramètres de requête

# 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

Créer une chaîne de demande pour la signature

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 …

Créer une signature à partir de la chaîne de demande

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'])

Un programme qui appelle l'API REST DirectMail pour envoyer du courrier

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

Document Alibaba

Alibaba DirectMail Product Page Alibaba DirectMail Documentation Alibaba DirectMail Public parameters Alibaba DirectMail Request parameters Alibaba DirectMail Signature

Recommended Posts

Livre de recettes Cloud DevOps, partie 4 - Explorez DevOps DirectMail en Python avec l'API REST
Implémentez rapidement l'API REST en Python
Extraction de texte avec l'API GCP Cloud Vision (Python3.6)
[WP REST API v2] Télécharger des images avec Python
[Cloud102] # 1 Premiers pas avec Python (première partie des premiers pas de Python)
Un débutant Python a essayé d'implémenter l'API REST en un jour
Jouer avec l'API d'intelligence artificielle locale de l'utilisateur en Python
Obtenez des données LEAD à l'aide de l'API REST de Marketo en Python
API Evernote en Python
API C en Python 3
API Nifty Cloud facile à utiliser avec botocore et python
Flux d'extraction de texte au format PDF avec l'API Cloud Vision
La première API à créer avec le framework Python Djnago REST
Génération de spécifications et génération de code dans le développement d'API REST (édition Python)
Mettez en place le géocodage inversé en japonais avec l'API Python Google Maps
Hit API de Mastodon en Python
Traitement d'image avec Python (partie 2)
Etudier Python avec freeCodeCamp part1
Utiliser l'API Trello avec python
Images en bordure avec python Partie 1
Grattage au sélénium en Python
Grattage avec Selenium + Python Partie 1
Exploitez LibreOffice avec Python
Grattage avec chromedriver en python
Utiliser l'API Twitter avec Python
Débogage avec pdb en Python
Gérer les sons en Python
Grattage avec du sélénium en Python
Etudier Python avec freeCodeCamp part2
Traitement d'image avec Python (partie 1)
Grattage avec Tor en Python
API Web avec Python + Falcon
Tweet avec image en Python
Résolution de Nampre avec Python (partie 2)
Combiné avec ordinal en Python
Traitement d'image avec Python (3)
UI Automation Partie 2 en Python
Grattage avec Selenium + Python Partie 2
API Blender Python dans Houdini (Python 3)
Appelez l'API avec python3.
Utiliser l'API subsonique avec python3
Faites fonctionner Jupyter avec l'API REST pour extraire et enregistrer le code Python
Une histoire sur l'ajout d'une API REST à un démon créé avec Python
Implémentation de CRUD à l'aide de l'API REST avec Python + Django Rest framework + igGrid
Créer une API REST qui renvoie l'heure actuelle avec Python3 + Falcon
Visualisez la fréquence des occurrences de mots dans les phrases avec Word Cloud. [Python]
Importation et téléchargement d'images sur le stockage Azure. Avec Python + requêtes + API REST
Émission de jetons d'authentification Firebase en Python et validation de jetons avec Fast API
J'ai essayé de refactoriser le code du modèle publié dans "Obtenir des images de l'API Flickr avec Python" (Partie 2)
Reconnaissance des nombres dans les images avec Python
Jouez des nombres manuscrits avec Python Partie 1
[Package cloud] Gérez les packages python avec le package cloud
Tester avec des nombres aléatoires en Python
Obtenir l'API arXiv en Python
Créer Awaitable avec l'API Python / C
Travailler avec LibreOffice en Python: import
Obtenez des avis avec l'API googlemap de python