真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何基于Serverless使用SCF+COS給未來寫封信

這期內(nèi)容當(dāng)中小編將會給大家?guī)碛嘘P(guān)如何基于Serverless使用 SCF+COS 給未來寫封信,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比定安網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式定安網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋定安地區(qū)。費用合理售后完善,十載實體公司更值得信賴。

或許你有用過或者聽說過《給未來寫封信》,這是由全知工坊開發(fā)的一款免費應(yīng)用,你可以在此刻給自己或他人寫下一封信,然后選擇在未來的某一天寄出,想必那時收到信的人看著這封來自過往的信時一定會十分感動吧。

這次我就帶大家一起來使用無服務(wù)器云函數(shù) SCF 和對象存儲 COS,快速開發(fā)一個屬于自己的「給未來寫封信」應(yīng)用。

效果展示

寫下一封信,然后投遞:

如何基于Serverless使用 SCF+COS 給未來寫封信

一封來自很久以前的信:

如何基于Serverless使用 SCF+COS 給未來寫封信

寫給未來的自己

如何基于Serverless使用 SCF+COS 給未來寫封信

你也可以訪問letter.idoo.top/letter來親自體驗一下(僅供測試之用,不保證服務(wù)一直可用)

操作步驟

第一步:新建 python 云函數(shù)

參見我之前的系列文章《萬物皆可 Serverless 之使用 SCF+COS 快速開發(fā)全棧應(yīng)用》

第二步:編寫云函數(shù)

Life is short, show me the code.

老規(guī)矩,直接上代碼

import json
import datetime
import random
from email.mime.text import MIMEText
from email.header import Header
import smtplib

# 是否開啟本地debug模式
debug = False

# 騰訊云對象存儲依賴
if debug:
    from qcloud_cos import CosConfig
    from qcloud_cos import CosS3Client
    from qcloud_cos import CosServiceError
    from qcloud_cos import CosClientError
else:
    from qcloud_cos_v5 import CosConfig
    from qcloud_cos_v5 import CosS3Client
    from qcloud_cos_v5 import CosServiceError
    from qcloud_cos_v5 import CosClientError

# 配置存儲桶
appid = '66666666666'
secret_id = 'xxxxxxxxxxxxxxx'
secret_key = 'xxxxxxxxxxxxxxx'
region = 'ap-chongqing'
bucket = 'name'+'-'+appid

#配置發(fā)件郵箱
mail_host = "smtp.163.com"
mail_user = "xxxxxxxxxx@163.com"
mail_pass = "xxxxxxxxxxxxxx"
mail_port = 465

# 對象存儲實例
config = CosConfig(Secret_id=secret_id, Secret_key=secret_key, Region=region)
client = CosS3Client(config)

#smtp郵箱實例
smtpObj = smtplib.SMTP_SSL(mail_host, mail_port)

# cos 文件讀寫
def cosRead(key):
    try:
        response = client.get_object(Bucket=bucket, Key=key)
        txtBytes = response['Body'].get_raw_stream()
        return txtBytes.read().decode()
    except CosServiceError as e:
        return ""


def cosWrite(key, txt):
    try:
        response = client.put_object(
            Bucket=bucket,
            Body=txt.encode(encoding="utf-8"),
            Key=key,
        )
        return True
    except CosServiceError as e:
        return False

#獲取所有信件
def getletters():
    letterMap = {}
    letterTxt = cosRead('letters.txt')  # 讀取數(shù)據(jù)
    if len(letterTxt) > 0:
        letterMap = json.loads(letterTxt)
    return letterMap

#添加信件
def addletter(date, email, letter):
    letterMap = getletters()
    if len(letterMap) > 0:
        letterMap[date+'_'+randomKey()] = email+'|'+letter
    return cosWrite('letters.txt', json.dumps(letterMap, ensure_ascii=False)) if len(letterMap) > 0 else False

#刪除信件
def delletter(letter):
    letterMap = getletters()
    if len(letterMap) > 0:
        letterMap.pop(letter)
    return cosWrite('letters.txt', json.dumps(letterMap, ensure_ascii=False)) if len(letterMap) > 0 else False


# 獲取今日日期
def today():
    return datetime.datetime.now().strftime("%Y-%m-%d")

# 判斷信件是否到期
def checkDate(t):
    return t[0:10] == today()

# 根據(jù)時間生成uuid
def randomKey():
    return ''.join(random.sample('zyxwvutsrqponmlkjihgfedcba0123456789', 6))

# api網(wǎng)關(guān)回復(fù)消息格式化
def apiReply(reply, html=False, code=200):
    htmlStr = r'''



    
    
    給未來的自己寫封信
    



    
        
                     開始寫信

                     
                                      開始寫信

                             
                         
                送信日期

                             
                          

        
                         投遞         
                             '''     return {         "isBase64Encoded": False,         "statusCode": code,         "headers": {'Content-Type': 'text/html' if html else 'application/json', "Access-Control-Allow-Origin": "*"},         "body": htmlStr if html else json.dumps(reply, ensure_ascii=False)     } #登陸郵箱 def loginEmail():     try:         smtpObj.login(mail_user, mail_pass)         return True     except smtplib.SMTPException as e:         print(e)         return False #發(fā)送郵件 def sendEmail(letter):     temp=letter.split('|')     receivers = [temp[0]]     message = MIMEText(temp[1], 'plain', 'utf-8')     message['From'] = mail_user     message['To'] = temp[0]     message['Subject'] = '一封來自很久以前的信'     try:         smtpObj.sendmail(mail_user, receivers, message.as_string())         print("send email success")         return True     except smtplib.SMTPException as e:         print("Error: send email fail")         return False #每天定時檢查需要發(fā)送的信件 def check_send_letters():     loginEmail()     letters = getletters()     for date in letters.keys():         if checkDate(date):             sendEmail(letters[date]) def main_handler(event, context):     if 'Time' in event.keys():  # 來自定時觸發(fā)器         check_send_letters()         return     if 'httpMethod' in event.keys():  # 來自api網(wǎng)關(guān)觸發(fā)器         if event['httpMethod'] == 'GET':             return apiReply('', html=True)  # 返回網(wǎng)頁         if event['httpMethod'] == 'POST':  # 添加信件             body = json.loads(event['body'])             flag = addletter(body['date'], body['email'], body['letter'])             return apiReply({                 'ok': True if flag else False,                 'message': '添加成功' if flag else '添加失敗'             })     return apiReply('', html=True)

沒錯,這就是前面展示的網(wǎng)頁應(yīng)用的全部源碼了,使用云函數(shù) SCF 構(gòu)建一個完整的前后端的全棧應(yīng)用就是這么簡單。

代碼可能有點長,其實也沒多少知識點,下面咱們再一起捋一下這個云函數(shù) ~

import json
import datetime
import random
from email.mime.text import MIMEText
from email.header import Header
import smtplib

# 是否開啟本地debug模式
debug = False

# 騰訊云對象存儲依賴
if debug:
    from qcloud_cos import CosConfig
    from qcloud_cos import CosS3Client
    from qcloud_cos import CosServiceError
    from qcloud_cos import CosClientError
else:
    from qcloud_cos_v5 import CosConfig
    from qcloud_cos_v5 import CosS3Client
    from qcloud_cos_v5 import CosServiceError
    from qcloud_cos_v5 import CosClientError

首先是依賴的導(dǎo)入,這里主要導(dǎo)入了 python 自帶的 email 模塊和騰訊云對象存儲 SDK,來實現(xiàn)信件的發(fā)送和后端存儲需求。

這里需要注意一點,在騰訊云的云函數(shù)在線運行環(huán)境中,已經(jīng)安裝了 qcloud\_cos\_v5 對象存儲 SDK,而我在本地環(huán)境安裝的對象存儲 SDK 是 qcloud\_cos,為了方便本地調(diào)試,這里我設(shè)置了一個 debug 開關(guān),來動態(tài)導(dǎo)入 qcloud\_cos 依賴,這一點我在之前的系列文章《萬物皆可Serverless之使用SCF+COS快速開發(fā)全棧應(yīng)用》中有講到。

# 配置存儲桶
appid = '66666666666'
secret_id = 'xxxxxxxxxxxxxxx'
secret_key = 'xxxxxxxxxxxxxxx'
region = 'ap-chongqing'
bucket = 'name'+'-'+appid

#配置發(fā)件郵箱
mail_host = "smtp.163.com"
mail_user = "xxxxxxxxxx@163.com"
mail_pass = "xxxxxxxxxxxxxx"
mail_port = 465

然后配置一下自己的郵箱信息和騰訊云對象存儲桶信息

配置完成之后,我們再來看一下云函數(shù)的入口函數(shù) main_handler(event, context)

def main_handler(event, context):
    if 'Time' in event.keys():  # 來自定時觸發(fā)器
        check_send_letters()
        return
    if 'httpMethod' in event.keys():  # 來自api網(wǎng)關(guān)觸發(fā)器
        if event['httpMethod'] == 'GET':
            return apiReply('', html=True)  # 返回網(wǎng)頁
        if event['httpMethod'] == 'POST':  # 添加信件
            body = json.loads(event['body'])
            flag = addletter(body['date'], body['email'], body['letter'])
            return apiReply({
                'ok': True if flag else False,
                'message': '添加成功' if flag else '添加失敗'
            })
    return apiReply('', html=True)

這里我們根據(jù)event的keys里有無'Time'來判斷云函數(shù)是否是通過定時器來觸發(fā)的,

這一點我在之前的系列文章《萬物皆可 Serverless 之使用 SCF+COS 快速開發(fā)全棧應(yīng)用》中有講到。

#每天定時檢查需要發(fā)送的信件
def check_send_letters():
    loginEmail()
    letters = getletters()
    for date in letters.keys():
        if checkDate(date):
            sendEmail(letters[date])

檢查云函數(shù)是否是通過定時器觸發(fā),是因為在后面我們會給這個云函數(shù)添加定時觸發(fā)器來每天定時檢查需要發(fā)送的信件。

這里的 check\_send\_letters 函數(shù)的作用就是登錄我們的郵箱并讀取在 cos 中的所有信件,然后逐封檢查信件的發(fā)信日期,如果信件發(fā)信日期與當(dāng)前的日期相符,就會向指定的郵箱發(fā)送信件,完成在指定日期投放信件的功能。

if event['httpMethod'] == 'GET':
    return apiReply('', html=True)  # 返回網(wǎng)頁
if event['httpMethod'] == 'POST':  # 添加信件
    body = json.loads(event['body'])
    flag = addletter(body['date'], body['email'], body['letter'])
    return apiReply({
         'ok': True if flag else False,
         'message': '添加成功' if flag else '添加失敗'
    })

如果我們的云函數(shù)是通過 api 網(wǎng)關(guān)觸發(fā)的話,就判斷一下 http 請求的方法是 GET 還是 POST





    
    
    給未來的自己寫封信
    



    
        
        
            開始寫信

                                                            開始寫信

                                                       
                送信日期

                             
                          

        
                         投遞         
                            

如果是 GET 請求就返回上面的前端網(wǎng)頁,也就是文章開頭第一張圖,再來瞅一眼

如何基于Serverless使用 SCF+COS 給未來寫封信

再來看下前端網(wǎng)頁的發(fā)信過程

function send() {
    if (datex.length < 1 || myEmail.value.length < 1 || myLetter.value.length < 1) {
        alert('信件內(nèi)容、送信日期或投遞郵箱不能為空');
        return;
    }
    fetch(window.location.href, {
            method: 'POST',
            body: JSON.stringify({
                date: datex,
                email: myEmail.value,
                letter: myLetter.value
            })
        }).then(res => res.json())
        .catch(error => console.error('Error:', error))
        .then(response => alert(response.ok ? '添加成功:)' : '添加失敗:('));
}

這里我們是向當(dāng)前網(wǎng)頁地址,也是云函數(shù)的 api 網(wǎng)關(guān)地址 POST 了一個包含所有信件信息的 json 字符串

if event['httpMethod'] == 'POST':  # 添加信件
    body = json.loads(event['body'])
    flag = addletter(body['date'], body['email'], body['letter'])
    return apiReply({
         'ok': True if flag else False,
         'message': '添加成功' if flag else '添加失敗'
    })

回到云函數(shù)后端,我們在收到 POST 請求之后,在 event 里拿到 POST 的請求體,并重新將 json 字符串轉(zhuǎn)成 map 對象,之后將 body 傳給 addletter 函數(shù),將信件信息保存到 cos 里,然后向網(wǎng)頁前端回復(fù)信件是否添加成功。

這樣整個應(yīng)用的前后端只用一個云函數(shù)就都實現(xiàn)了,是不是很酸爽呀( ?? ω ?? )y~

第三步:配置云函數(shù)觸發(fā)器

找到本地云函數(shù)文件夾下面的 template.yaml 配置文件

Resources:
  default:
    Type: 'TencentCloud::Serverless::Namespace'
    letter:
      Properties:
        CodeUri: ./
        Type: Event
        Environment:
          Variables:
        Description: 給未來寫封信云函數(shù)
        Handler: index.main_handler
        MemorySize: 64
        Timeout: 3
        Runtime: Python3.6
        Events:
          timer:
            Type: Timer
            Properties:
              CronExpression: '0 0 8 * * * *'
              Enable: True
          letter_apigw:
            Type: APIGW
            Properties:
              StageName: release
              ServiceId:
              HttpMethod: ANY
      Type: 'TencentCloud::Serverless::Function'

這里主要配置了一下云函數(shù)的名稱,timer 觸發(fā)器和 api 網(wǎng)關(guān)觸發(fā)器,可以自行設(shè)置。

第四步:上線發(fā)布云函數(shù),api 網(wǎng)關(guān)啟用響應(yīng)集成

第五步:綁定備案域名

上述就是小編為大家分享的如何基于Serverless使用 SCF+COS 給未來寫封信了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。


新聞名稱:如何基于Serverless使用SCF+COS給未來寫封信
文章URL:http://weahome.cn/article/jipece.html

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部