学习笔记 / 网站程序

阿里云API邮件推送服务

迷失小白菜 · 10月14日 · 2019年 158次已读

邮件推送服务其实就是一个简单的API调用 ,但是官方的教程。。emmm

Python – 签名 & 推送

阿里云有提供SDK,但是签名算法目前只有JAVA、PHP、C#支持,其他需要自己写。在查了一些资料后,基于这篇文章,最终实现了邮件推送。

# coding=utf-8

import base64
import hmac
from hashlib import sha1
import urllib
import time
import uuid
from config.base import ALIYUN_ACCESS_KEY_ID, ALIYUN_ACCESS_KEY_SECRET


class AliyunMonitor:
    def __init__(self, url):
        self.access_id = ALIYUN_ACCESS_KEY_ID
        self.access_secret = ALIYUN_ACCESS_KEY_SECRET
        self.url = url

    # 签名
    def sign(self, accessKeySecret, parameters):
        sortedParameters = sorted(parameters.items(), key=lambda parameters: parameters[0])
        canonicalizedQueryString = ''

        for (k, v) in sortedParameters:
            canonicalizedQueryString += '&' + self.percent_encode(k) + '=' + self.percent_encode(v)

        stringToSign = 'GET&%2F&' + self.percent_encode(canonicalizedQueryString[1:])    # 使用get请求方法

        h = hmac.new(accessKeySecret + "&", stringToSign, sha1)
        signature = base64.encodestring(h.digest()).strip()
        return signature

    def percent_encode(self, encodeStr):
        encodeStr = str(encodeStr)
        # 下面这行挺坑的,使用上面文章中的方法会在某些情况下报错,后面详细说明
        res = urllib.quote(encodeStr.decode('utf-8').encode('utf-8'), '')
        res = res.replace('+', '%20')
        res = res.replace('*', '%2A')
        res = res.replace('%7E', '~')
        return res

    def make_url(self, params):
        timestamp = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
        parameters = {
            'Format': 'JSON',
            'Version': '2015-11-23',
            'AccessKeyId': self.access_id,
            'SignatureVersion': '1.0',
            'SignatureMethod': 'HMAC-SHA1',
            'SignatureNonce': str(uuid.uuid1()),
            'Timestamp': timestamp,
        }
        for key in params.keys():
            parameters[key] = params[key]

        signature = self.sign(self.access_secret, parameters)
        parameters['Signature'] = signature

        # return parameters
        url = self.url + "/?" + urllib.urlencode(parameters)
        return url

然后,我们写一个send_email的方法来调用:

# coding=utf-8

import requests
from lib.aliyun_monitor import AliyunMonitor


def send_email(email_address, subject, text):
    payload = {
        'Action': 'SingleSendMail',
        'AccountName': 'mail@mail.xxx.com',
        'ReplyToAddress': 'true',
        'AddressType': 0,
        'ToAddress': email_address,
        'FromAlias': 'TalkingCoder',
        'Subject': subject,
        'HtmlBody': text
    }

    aliyun = AliyunMonitor("http://dm.aliyuncs.com")
    url = aliyun.make_url(payload)

    request = requests.get(url)

    print request.text

send_email('test@test.com', '标题', '内容')

文章转载 方法SEO顾问

下载AliYun-sdk-php例程