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.
Es gibt mehrere Gründe, die REST-API zu verwenden.
REST-API-Anforderungen
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.
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. |
# 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
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 …
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'])
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 DirectMail Product Page Alibaba DirectMail Documentation Alibaba DirectMail Public parameters Alibaba DirectMail Request parameters Alibaba DirectMail Signature
Recommended Posts