• 使用CMQ和SCF实现邮件发送


    准备腾讯云 API 调用工具

     

    使用 API 命令行工具来管理和运行无服务器云函数(SCF),下面就先来安装配置该工具。
    安装 Python 和 PIP
    Python 环境是腾讯云命令行工具运行时的必要环境,腾讯云的 CentOS 镜像已经包含 Python 的发型版本,可以使用以下命令查看:
    python --version
    下一步,安装 Python 的包管理工具 PIP:
    通过以下命令安装 PIP:
    yum install python-pip -y

    安装腾讯云 API 命令行工具

    命令行工具已经发布到 PIP 中, 可以直接使用 PIP 进行安装. 输入以下命令安装:
    pip install qcloudcli
    命令行工具提供了一个自动补全的功能,使用以下命令启用
    complete -C "$(which qcloud_completer)" qcloudcli
    配置 API 密钥
    配置命令行工具使用的密钥:
    qcloudcli configure
    工具会要求您提供:
    • Qcloud API SecretId:黏贴您的 SecretId 
       
    • Qcloud API SecretKey : 黏贴您的 SecretKey 
       
    • Region Id : gz
       
    • Output Formate : 输入 json
    配置完成以后,测试一下。使用 CLI 获取云主机列表:
    qcloudcli cvm DescribeInstances
    如果工具成功返回,请进入下一步,如失败,请到 /root/.qcloudcli 目录检查配置是否正确。
    创建 CMQ Topic 主题模式队列
    • 登录腾讯云控制台从云产品中选择消息服务 CMQ
    • 点击主题订阅选项卡,并切换地域为华南地区(广州)
    • 点击新建按钮以新建队列,在弹出窗口中写入主题名 sendEmailQueue
    • 点击创建,完成队列创建。

    使用 SCF 调用邮件服务

    使用 API 创建一个无服务器云函数(以后统称为 SCF)并调用它。
    创建函数目录
    创建一个 SCF 命名为 sendEmail。 首先创建一个目录存放它:
    mkdir -p /data/sendEmail

    编写 sendEmail 函数
    创建 sendEmail.py , 内容如下:
    # -*- coding: utf8 -*-
    import json
    import smtplib
    from email.mime.text import MIMEText
    from email.header import Header
    
    # 第三方 SMTP 服务
    mail_host="smtp.qq.com"         #SMTP服务器
    mail_user="3473058547@qq.com"     #用户名
    mail_pass="xxxxxxx"        #口令 
    mail_port=465                   #SMTP服务端口
    
    def sendEmail(fromAddr,toAddr,subject,content):
        sender = fromAddr
        receivers = [toAddr]  # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
    
        message = MIMEText(content, 'plain', 'utf-8')
        message['From'] = Header(fromAddr, 'utf-8')
        message['To'] =  Header(toAddr, 'utf-8')
        message['Subject'] = Header(subject, 'utf-8')
    
        try:
            smtpObj = smtplib.SMTP_SSL(mail_host, mail_port) 
            smtpObj.login(mail_user,mail_pass)  
            smtpObj.sendmail(sender, receivers, message.as_string())
            print("send success") 
        except smtplib.SMTPException as e:
            print(e)
            print("Error: send fail") 
    
    def main_handler(event, context):
        cmqMsg = None
        if event is not None and "Records" in event.keys():
            if len(event["Records"]) >= 1 and "CMQ" in event["Records"][0].keys():
                cmqMsgStr = event["Records"][0]["CMQ"]["msgBody"]
                cmqMsg = json.loads(cmqMsgStr)
        print cmqMsg
        sendEmail(cmqMsg['fromAddr'], cmqMsg['toAddr'], cmqMsg['title'], cmqMsg['body'])
        return "send email success"
    

      

    点击这里 了解到如何开启 QQ 邮箱的 SMTP 功能. QQ 邮箱的 SMTP 功能开启后,相应的参数如下。
    参数
    mail_host smtp.qq.com
    mail_user
     
    自己的邮箱
    mail_pass
     
    SMTP 密码
    mail_port
     
    465

    部署 sendEmail 函数

    使用 
    CreateFunction API
     
     来创建并部署一个 SCF :
    qcloudcli scf CreateFunction 
    --functionName "sendEmail" 
    --code "@$(cd /data/sendEmail && zip -r - * | base64)" 
    --handler "sendEmail.main_handler" 
    --description "sendEmail SCF"
    如果部署成功,会有 Success 返回,使用 
    ListFunctions
     
     来查询自己账号下面有哪些 SCF:
    qcloudcli scf ListFunctions
    运行 sendEmail 函数
    到控制台 查看 SCF 函数。点击名为 sendEmail 的 SCF,进入函数代码功能页面,注意:
    属性
    执行方法 index.main_handler
    测试事件模板 Hello World 事件模板
    • 点击测试 按钮测试该函数,注意在选择测试事件模板的时候Hello World 事件模板的选择如上表所示。
    测试代码:
    {
      "Records": [
        {
          "CMQ": {
            "type": "topic",
            "topicOwner":1253970226,
            "topicName": "sendEmailQueue",
            "subscriptionName":"sendEmailFunction",
            "publishTime": "2017-09-25T06:34:00.000Z",
            "msgId": "123345346",
            "requestId":"123345346",
            "msgBody": "{"fromAddr":"3473058547@qq.com","toAddr":"3473058547@qq.com","title":"hello from scf & cmq","body":"email content to send"}",
            "msgTag": []
          }
        }
      ]
    }
    

      

    其中:
    字段
    fromAddr
     
    发件方邮箱
    toAddr 收件方邮箱
    title 邮件标题
    body 邮件内容
    • 点击运行按钮,观察运行结果。如果在结果中发现返回值和日志中均显示 "send email success",且设置的邮箱收到邮件则此程序运行正常

    添加触发器

    • 在刚刚创建的 sendEmail 函数详情页中,选择 触发方式,点击添加触发方式按钮.
    • 选择 CMQ主题订阅触发,CMQ Topoic 选择 sendEmailQueue,点击保存.

    测试

    此时本 SCF 全部完成!现在可以按以下方式测试设置:
    • 前往 消息服务CMQ,在左侧栏选择主题订阅,从列表中找到创建好的队列 sendEmailQueue,点击此队列提供的操作 发送消息,并在弹出的窗口中输入如下消息:
    {
    "fromAddr":"xxx@qq.com",
    "toAddr":"xxx@qq.com",
    "title":"hello from scf & cmq",
    "body":"email content to send"
    }
    您需要根据自身情况修改消息内的内容,包括:
    字段
    fromAddr 发件邮箱
    toAddr 收件邮箱
    title 邮件标题
    body 邮件内容
    • 无服务器云函数控制台中找到 sendEmail函数,选择日志选项查看函数被调用的日志记录。
    • 登录进入您的收件邮箱,查询是否收到邮件,邮件内容是否正确。
    完成测试后,您可以在您的应用代码中嵌入 CMQ SDK,对 sendEmailQueue 这个队列发送在示例说明中所定义的消息,来完成邮件发送。
  • 相关阅读:
    ubuntu 启用apache运行状态信息查看
    Loadrunner生成随机字符
    Linux 如何在 vi 里搜索关键字
    Loadrunnber 报错误:Error memory violation : Exception ACCESS_VIOLATION received.的一种情况
    Could not load file or assembly 'XXX' or one of its dependencies.
    C# 显示年月日星期
    C#中timer类的用法
    详解SQL Server的两个存储过程:sp_MSforeachtable/sp_MSforeachdb
    C# winform DataGridView 的18种常见属性
    WdatePicker日历控件使用方法
  • 原文地址:https://www.cnblogs.com/pejsidney/p/8624381.html
Copyright © 2020-2023  润新知