Cloud DevOps-Kochbuch Teil 4 - Entdecken Sie DevOps DirectMail in Python mit der REST-API

Dieses Mal werden wir ** Direct Mail ** von ** Alibaba Cloud DevOps ** mit ** REST API ** mit ** Python ** untersuchen.

Alibaba Cloud Tech Share, Autor John Hanley. Tech Share fördert den Austausch von technischem Wissen und Best Practices innerhalb der Cloud-Community. Incentive-Programm.

Meine Lieblingssprache zum Erlernen von Rapid Prototyping und neuen Cloud-Diensten ist Python. Mit Python sind die meisten Aufgaben so einfach, dass Sie Ihre neue API in wenigen Minuten testen können. Auf diese Weise können Sie sich auf das Lernen konzentrieren, ohne sich Gedanken über die Funktionsweise der API in einer bestimmten Sprache machen zu müssen. Aber ich verwende C ++ für Code auf Unternehmensebene, der Millionen von Dollar kosten kann, wenn ich einen Fehler mache.

Alibabas DirectMail (https://www.alibabacloud.com/product/directmail?spm=a2c65.11461447.0.0.38ad725bFhEjCQ) unterstützt Python nicht. PHP, Java und C # werden unterstützt. Ein sehr häufiger Anwendungsfall für DirectMail ist das E-Mailen von dynamischen und statischen Websites. Ist zu liefern. Für dynamische Websites ist PHP die beste Wahl. Für statische Websites DirectMail und Function Compute Die Integration von Produkt- / Funktionsberechnung (Spm = a2c65.11461447.0.0.38ad725bFhEjCQ) ist perfekt. Function Compute unterstützt jedoch kein PHP. Dies bedeutet, dass Sie in einer Sprache auf dem Desktop und in einer anderen in der Cloud entwickeln.

Daher kam mir die Idee, die REST-API von DirectMail zu verwenden. Das heißt, Sie können Python verwenden, um zu lernen, wie Sie die REST-API verwenden und insbesondere weniger dokumentierte Signaturen erstellen.

DirectMail unterstützt drei verschiedene Schnittstellen (nicht alle Sprachen werden unterstützt).

1、Alibaba REST API 2、Alibaba Cloud SDK 3、Alibaba SMTP Interface Im vorherigen Artikel habe ich ein Beispiel für die Verwendung von SDK (Function Compute) in Python vorgestellt. Dieses Mal werde ich mich auf die DirectMail-REST-API konzentrieren und ein Beispiel für die Funktionsweise in Python zeigen.

Alibaba Cloud DirectMail REST-API

Es gibt mehrere Gründe, die REST-API zu verwenden.

  1. Grundlegendes zu APIs, Parametern und Fehlern auf niedriger Ebene. In 2 ist der Codebereich klein. 3, verkürzte Lade- und Ausführungszeit. 4 gibt es wenige Abhängigkeiten. In 5 muss die SDK-Bibliothek nicht auf dem Zielsystem installiert werden. 6, SDK ist nicht in der Zielsprache verfügbar.

REST-API-Anforderungen

  1. Verstehen Sie HTTPS, HTTP-Header und HTTP-Körper.
  2. Verstehen Sie den Unterschied zwischen den Methoden HTTP HEAD, DELETE, GET, POST und PUT.
  3. Verstehen Sie, wie Sie Daten für jede HTTP-Methode senden.
  4. Verstehen Sie die API-Parameter, die in jeder HTTP-Methode enthalten sein müssen.
  5. Verstehen, wie HTTP-Anforderungen signiert werden.

Öffentliche Parameter der Alibaba Cloud

Dies ist ein Link zu Alibabas Dokumentation zu öffentlichen DirectMail-Parametern.

Name Art Ist es obligatorisch? Erläuterung
Format String No Die Art des Antwortwerts. JSON und XML werden unterstützt. XML ist das Standardformat. In diesem Beispiel wird JSON verwendet.
Version String Yes API-Versionsnummer. Das Format ist JJJJ-MM-Es ist DD. RegionID ist cn-Für Hangzhou lautet die Versionsnummer 2015-11-dreiundzwanzig. RegionID ist cn-Wenn es nicht Hangzhou ist, ist die Versionsnummer ap-southeast-2017 für 1 etc.-06-Es ist 22. Im Beispiel 2017-06-Verwenden Sie 22.
AccessKeyId String Yes AccessKeyId, die von Alibaba Cloud an Benutzer ausgegeben wird, um auf den Dienst zuzugreifen.
SecurityToken String Depends Dieser Parameter ist nicht erforderlich, wenn Sie einen benutzerdefinierten Zugriffsschlüssel verwenden. Wenn Sie Rollen verwenden, Kontext.Ein Sicherheitstoken, das als Teil des Anmeldeinformationsobjekts an die Funktion übergeben wird.
Signature String Yes Die Zeichenfolge des Signaturergebnisses. Einzelheiten zur Berechnung der Signatur finden Sie unter "Signature"Bitte beziehen Sie sich auf.
SignatureMethod String Yes Signiermethode. HMAC-SHA1 wird derzeit unterstützt.
Timestamp String Yes Zeitstempel anfordern. Das Datumsformat istISO8601EsentsprichtdemStandardundübernimmtdieUTC-Zeit.DasFormatistwiefolgt.JJJJ-MM-DDThh:mm:ssZ.Beispiel:2015-11-23T04:00:00Z(PekingerZeit23.November201512:00:Für00).
SignatureVersion String Yes Die Version des Signaturalgorithmus. Aktuelle Version ist 1.Es ist 0.
SignatureNonce String Yes Eindeutige Zufallszahl. Wird verwendet, um Wiederholungsangriffe zu verhindern. Sie müssen für jede Anforderung eine andere Zufallszahl verwenden.
RegionId String Yes Informationen zum Rechenzentrum. cn-hangzhou、ap-southeast-1、ap-southeast-2 wird derzeit unterstützt.

Kommentare zu den oben genannten Parametern:

** SignatureNonce **: Dieser Parameter ist seit einiger Zeit ärgerlich. Zuerst dachte ich, dies sei der Salzwert, der beim Signieren von HMAC_SHA1 verwendet wird. Es stellt sich jedoch heraus, dass dies eine Zeichenfolge ist, die von uuid.uuid4 () generiert und im Header enthalten ist. Wenn Sie den Wert dieser Zeichenfolge in einem nachfolgenden Befehl wiederholen, wird der Befehl abgelehnt.

** AccessKeyId **: Erstellt einen neuen RAM-Benutzer mit Nur-DirectMail-Berechtigungen. In diesem Fall benötigen Sie sowohl einen Zugriffsschlüssel als auch ein Zugriffsschlüsselgeheimnis für die REST-API.

** Zeitstempel **: Es ist wichtig, dass Datum und Uhrzeit des Systems korrekt sind. Wenn diese Zeit vom Service von Alibaba abweicht, wird die Anfrage abgelehnt. Verwenden Sie nach Möglichkeit einen Zeitdienst wie NTP für Ihr System.

Alibaba Cloud DirectMail-Anforderungsparameter

Ein Link zur Alibaba-Dokumentation zu DirectMail-Anforderungsparametern (https://www.alibabacloud.com/help/doc-detail/29444.htm?spm=a2c65.11461447.0.0.38ad725bFhEjCQ).

Name Art Ist es obligatorisch? Erläuterung
Action String Required Name der Bedienoberfläche und vom System erforderliche Parameter. Geben Sie den Wert an. Single Mail senden.
AccountName String Required Die in der Konsole konfigurierte Absenderadresse.
ReplyToAddress Boolean Required Die in der Konsole konfigurierte Antwortadresse (Status muss "verifiziert" sein).
AddressType Number Required Wertebereich: 0-1. 0 gibt ein zufälliges Konto an und 1 gibt eine Absenderadresse an.
ToAddress String Required Empfängeradresse. Mehrere Adressen können durch Kommas getrennt werden und unterstützen bis zu 100 Adressen.
FromAlias String Möglichkeit Spitzname des Absenders. Der Spitzname darf nicht länger als 15 Zeichen sein. Beispielsweise wird der Spitzname des Absenders auf Daisy gesetzt und die Adresse des Absenders lautet [email protected] ist com. Der Empfänger ist Daisy[email protected]Siehe die Adresse von.
Subject String Optional Subject (Empfehlung)。
HtmlBody String Optional Zeigen Sie den E-Mail-Text in HTML an.
TextBody String Optional Zeigen Sie den E-Mail-Text als Text an.
ClickTrace String Optional Wertebereich. 0-1. 1 zeigt an, dass die Empfängerverfolgung aktiviert ist. 0 gibt an, dass die Empfängerverfolgung nicht aktiviert ist. Der Standardwert für diesen Parameter ist 0.

Berechnen Sie das richtige Datum

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

Host und Endpunkt in diesem Beispiel (Singapur-> ap-Südost-1)

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

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

Erstellen einer Parameterliste mit öffentlichen Parametern

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"

Erstellen einer Parameterliste mit Anforderungsparametern

# 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

Erstellen Sie eine Anforderungszeichenfolge zum Signieren

def build_request_string(table):
    """ Build canonical list """
    items = sorted(iter(table.items()), key=lambda d: d[0])
    enc = my_urlencode(items)
    return enc

Vorsichtsmaßnahmen bezüglich Anforderungszeichenfolgen

Anforderungszeichenfolgenparameter müssen zuerst sortiert werden. Die Zeichenfolge wird dann url-codiert. Dies bedeutet, dass jedes Schlüssel / Wert-Paar ein & -Zeichen hat.

Das Endergebnis sieht wie im folgenden Beispiel aus, jedoch mit einer längeren Länge.

AccessKeyId=LTAIQlgy6erobert&AccountName=test%40test.com&Action=SingleSendMail …

Erstellen Sie eine Signatur aus der Anforderungszeichenfolge

Dies ist ein Link zu Alibabas Dokumentation zur DirectMail-Signatur.

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

Ein Programm, das die DirectMail-REST-API aufruft, um E-Mails zu senden

Laden Sie [sendEmail.zip] herunter (https://alicloud-common.oss-ap-southeast-1.aliyuncs.com/sendEmail.zip?spm=a2c65.11461447.0.0.38ad725bFhEjCQ&file=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)

Führen Sie Python 3.x aus: python sendEmail.py

Alibaba-Dokument

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

Recommended Posts

Cloud DevOps-Kochbuch Teil 4 - Entdecken Sie DevOps DirectMail in Python mit der REST-API
Implementieren Sie die REST-API schnell in Python
Textextraktion mit GCP Cloud Vision API (Python3.6)
[WP REST API v2] Laden Sie Bilder mit Python hoch
[Cloud102] # 1 Erste Schritte mit Python (Teil 1 Python Erste Schritte)
Python-Anfänger haben versucht, die REST-API an einem Tag zu implementieren
Spielen mit der benutzerlokalen API für künstliche Intelligenz in Python
Holen Sie sich LEAD-Daten mit der REST-API von Marketo in Python
Evernote-API in Python
C-API in Python 3
Einfache Verwendung der Nifty Cloud API mit Botocore und Python
Ablauf des Extrahierens von Text in PDF mit der Cloud Vision API
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Generierung von Spezifikationen und Code in der REST-API-Entwicklung (Python Edition)
Stellen Sie die umgekehrte Geokodierung auf Japanisch mit der Python Google Maps-API bereit
Hit Mastodons API in Python
Bildverarbeitung mit Python (Teil 2)
Python mit freeCodeCamp Teil1 studieren
Verwenden Sie die Trello-API mit Python
Angrenzende Bilder mit Python Teil 1
Schaben mit Selen in Python
Schaben mit Selen + Python Teil 1
Betreiben Sie LibreOffice mit Python
Schaben mit Chromedriver in Python
Verwenden Sie die Twitter-API mit Python
Debuggen mit pdb in Python
Umgang mit Sounds in Python
Scraping mit Selen in Python
Python studieren mit freeCodeCamp part2
Bildverarbeitung mit Python (Teil 1)
Scraping mit Tor in Python
Web-API mit Python + Falcon
Tweet mit Bild in Python
Nampre mit Python lösen (Teil 2)
Kombiniert mit Ordnungszahl in Python
Bildverarbeitung mit Python (3)
UI-Automatisierung Teil 2 in Python
Schaben mit Selen + Python Teil 2
Blender Python API in Houdini (Python 3)
Rufen Sie die API mit python3 auf.
Verwenden Sie die Unterschall-API mit Python3
Führen Sie Jupyter mit der REST-API aus, um Python-Code zu extrahieren und zu speichern
Eine Geschichte über das Hinzufügen einer REST-API zu einem mit Python erstellten Daemon
Implementierung von CRUD mithilfe der REST-API mit Python + Django Rest Framework + igGrid
Erstellen Sie mit Python3 + Falcon eine REST-API, die die aktuelle Uhrzeit zurückgibt
Visualisieren Sie die Häufigkeit von Wortvorkommen in Sätzen mit Word Cloud. [Python]
Hochladen und Herunterladen von Bildern in Azure Storage. Mit Python + Anfragen + REST API
Ausgabe von Firebase-Authentifizierungstoken in Python und Token-Validierung mit Fast API
Ich habe versucht, den unter "Abrufen von Bildern von der Flickr-API mit Python" (Teil 2) veröffentlichten Vorlagencode zu überarbeiten.
Zahlenerkennung in Bildern mit Python
Spielen Sie handschriftliche Zahlen mit Python Part 1
[Paketwolke] Verwalten Sie Python-Pakete mit der Paketwolke
Testen mit Zufallszahlen in Python
Abrufen der arXiv-API in Python
Erstellen Sie Awaitable mit der Python / C-API
Arbeiten mit LibreOffice in Python: Importieren
Holen Sie sich Bewertungen mit Python Googlemap API