准备腾讯云 API 调用工具

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

安装腾讯云 API 命令行工具

命令行工具已经发布到 PIP 中, 可以直接使用 PIP 进行安装. 输入以下命令安装:
  1. pip install qcloudcli
命令行工具提供了一个自动补全的功能,使用以下命令启用
complete -C "$(which qcloud_completer)" qcloudcli
配置 API 密钥

配置命令行工具使用的密钥:
  1. qcloudcli configure
工具会要求您提供:
  • Qcloud API SecretId:黏贴您的 SecretId

     
  • Qcloud API SecretKey : 黏贴您的 SecretKey 
     
  • Region Id : gz
     
  • Output Formate : 输入 json
配置完成以后,测试一下。使用 CLI 获取云主机列表:
  1. qcloudcli cvm DescribeInstances
如果工具成功返回,请进入下一步,如失败,请到 /root/.qcloudcli 目录检查配置是否正确。
创建 CMQ Topic 主题模式队列

  • 登录腾讯云控制台从云产品中选择消息服务 CMQ
  • 点击主题订阅选项卡,并切换地域为华南地区(广州)
  • 点击新建按钮以新建队列,在弹出窗口中写入主题名 sendEmailQueue
  • 点击创建,完成队列创建。

使用 SCF 调用邮件服务

使用 API 创建一个无服务器云函数(以后统称为 SCF)并调用它。
创建函数目录
创建一个 SCF 命名为 sendEmail。 首先创建一个目录存放它:
  1. mkdir -p /data/sendEmail
  2.  
  3. 编写 sendEmail 函数
创建 sendEmail.py , 内容如下:
  1. # -*- coding: utf8 -*-
  2. import json
  3. import smtplib
  4. from email.mime.text import MIMEText
  5. from email.header import Header
  6.  
  7. # 第三方 SMTP 服务
  8. mail_host="smtp.qq.com" #SMTP服务器
  9. mail_user="3473058547@qq.com" #用户名
  10. mail_pass="xxxxxxx" #口令
  11. mail_port=465 #SMTP服务端口
  12.  
  13. def sendEmail(fromAddr,toAddr,subject,content):
  14. sender = fromAddr
  15. receivers = [toAddr] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
  16.  
  17. message = MIMEText(content, 'plain', 'utf-8')
  18. message['From'] = Header(fromAddr, 'utf-8')
  19. message['To'] = Header(toAddr, 'utf-8')
  20. message['Subject'] = Header(subject, 'utf-8')
  21.  
  22. try:
  23. smtpObj = smtplib.SMTP_SSL(mail_host, mail_port)
  24. smtpObj.login(mail_user,mail_pass)
  25. smtpObj.sendmail(sender, receivers, message.as_string())
  26. print("send success")
  27. except smtplib.SMTPException as e:
  28. print(e)
  29. print("Error: send fail")
  30.  
  31. def main_handler(event, context):
  32. cmqMsg = None
  33. if event is not None and "Records" in event.keys():
  34. if len(event["Records"]) >= 1 and "CMQ" in event["Records"][0].keys():
  35. cmqMsgStr = event["Records"][0]["CMQ"]["msgBody"]
  36. cmqMsg = json.loads(cmqMsgStr)
  37. print cmqMsg
  38. sendEmail(cmqMsg['fromAddr'], cmqMsg['toAddr'], cmqMsg['title'], cmqMsg['body'])
  39. 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 :

  1. qcloudcli scf CreateFunction \
  2. --functionName "sendEmail" \
  3. --code "@$(cd /data/sendEmail && zip -r - * | base64)" \
  4. --handler "sendEmail.main_handler" \
  5. --description "sendEmail SCF"
如果部署成功,会有 Success 返回,使用

ListFunctions

 

来查询自己账号下面有哪些 SCF:

  1. qcloudcli scf ListFunctions
    运行 sendEmail 函数
到控制台 查看 SCF 函数。点击名为 sendEmail 的 SCF,进入函数代码功能页面,注意:
属性
执行方法 index.main_handler
测试事件模板 Hello World 事件模板
  • 点击测试 按钮测试该函数,注意在选择测试事件模板的时候Hello World 事件模板的选择如上表所示。
测试代码:
  1. {
  2. "Records": [
  3. {
  4. "CMQ": {
  5. "type": "topic",
  6. "topicOwner":1253970226,
  7. "topicName": "sendEmailQueue",
  8. "subscriptionName":"sendEmailFunction",
  9. "publishTime": "2017-09-25T06:34:00.000Z",
  10. "msgId": "123345346",
  11. "requestId":"123345346",
  12. "msgBody": "{\"fromAddr\":\"3473058547@qq.com\",\"toAddr\":\"3473058547@qq.com\",\"title\":\"hello from scf & cmq\",\"body\":\"email content to send\"}",
  13. "msgTag": []
  14. }
  15. }
  16. ]
  17. }

  

其中:
字段
fromAddr

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

添加触发器

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

测试

此时本 SCF 全部完成!现在可以按以下方式测试设置:
  • 前往 消息服务CMQ,在左侧栏选择主题订阅,从列表中找到创建好的队列 sendEmailQueue,点击此队列提供的操作 发送消息,并在弹出的窗口中输入如下消息:
  1. {
  2. "fromAddr":"xxx@qq.com",
  3. "toAddr":"xxx@qq.com",
  4. "title":"hello from scf & cmq",
  5. "body":"email content to send"
  6. }
您需要根据自身情况修改消息内的内容,包括:
字段
fromAddr 发件邮箱
toAddr 收件邮箱
title 邮件标题
body 邮件内容
  • 无服务器云函数控制台中找到 sendEmail函数,选择日志选项查看函数被调用的日志记录。
  • 登录进入您的收件邮箱,查询是否收到邮件,邮件内容是否正确。
完成测试后,您可以在您的应用代码中嵌入 CMQ SDK,对 sendEmailQueue 这个队列发送在示例说明中所定义的消息,来完成邮件发送。

使用CMQ和SCF实现邮件发送的更多相关文章

  1. .NET开发邮件发送功能的全面教程(含邮件组件源码)

    今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2)         ...

  2. J2EE 邮件发送那些事儿

    距离自己写的关于java邮件发送的第一篇博客已经有很长一段时间了,现在回过头看看.虽然代码质量方面有待提高,整体结构也不怎样,但是基本思路和过程还是比较纯的.现在有空写写J2EE中邮件发送的开发,实际 ...

  3. 结合ABP源码实现邮件发送功能

    1. 前言 2. 实现过程 1. 代码图(重) 2.具体实现 2.1 定义AppSettingNames及AppSettingProvider 2.2 EmailSenderConfiguration ...

  4. SSH项目里面 忘记密码的邮件发送功能

    package com.xxx.util; import java.util.Date; import java.util.Properties; import javax.mail.Address; ...

  5. [UWP]UWP中获取联系人/邮件发送/SMS消息发送操作

    这篇博客将介绍如何在UWP程序中获取联系人/邮件发送/SMS发送的基础操作. 1. 获取联系人 UWP中联系人获取需要引入Windows.ApplicationModel.Contacts名称空间. ...

  6. java spring 邮件发送

    开发中经常会遇到发送邮件进行用户验证,或者其它推送信息的情况,本文基于spring,完成邮件的发送,主要支持普通文本邮件的发送,html文本邮件的发送,带附件的邮件发送,没有实现群发.多个附件发送等需 ...

  7. Java邮件发送与接收原理

    一. 邮件开发涉及到的一些基本概念 1.1.邮件服务器和电子邮箱 要在Internet上提供电子邮件功能,必须有专门的电子邮件服务器.例如现在Internet很多提供邮件服务的厂商:sina.sohu ...

  8. c#实现邮件发送链接激活

    2016-08-24 10:09:52 public void MailSend(string email) { MailMessage MyMail = new MailMessage(); MyM ...

  9. .Net(C#)最简单的邮件发送案例

    一.序言 刚开始接触邮件发送功能的时候,在网上找的资料都挺复杂的!对于新手入门有点难(至少对于本人来说,第一次接触的时候确实不容易).这里就写一段简单的邮箱发送代码,备忘,也给新手一个参考(相关类的字 ...

随机推荐

  1. Android利用反射机制为实体类属性赋值

    在做android项目时,有时会遇到从网络上获取json类型数据,赋值给实体类,实体类属性少可以一个一个的赋值,如果实体类有很多属性,赋值可能就要耗很长的功夫了,幸好Java给我们提供了反射机制.下面 ...

  2. 【c++基础】vector中按照Point类型某一个变量进行排序

    code // sort(a.begin(), a.end(), cmpy); //subfunction bool cmpy(cv::Point const& a, cv::Point co ...

  3. ThinkPHP3.2.3整合smarty模板(三)

    在smarty模板中使用thinkphp框架的U方法时要主要的问题: 1.不能直接使用{:U('Index/index')}: 2.正确的使用方法为:<!--{U("Login/log ...

  4. com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone. 问题解决方法

    一.问题 今天用mybatis连接数据库时出现了如下错误: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The serve ...

  5. unicode汉字编码

    原来我使用的一直是 \u4e00-\u9fa5 ,今天在匹配中文标点的时候匹配不上,就查了一下相关资料,原来unicode跟中文有关的范围还有好几个. 字符范围表 1.标准CJK文字 范围:\u340 ...

  6. 【java规则引擎】《Drools7.0.0.Final规则引擎教程》第4章 4.1 规则文件

    转载至:https://blog.csdn.net/wo541075754/article/details/75150267 一个标准的规则文件的格式为已“.drl”结尾的文本文件,因此可以通过记事本 ...

  7. 做Global Admin

    globaladmin.4budget@nokia.com 10:22 https://ultima.int.net.nokia.com/eedb/Solutions/tools/ManageUser ...

  8. JS常用功能

    1.字符串转Json var json='[{"id":0,"text":"ddddd"},{"id":1," ...

  9. Hadoop学习笔记(1)(转)

    Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序. ...

  10. x86函数调用约定

    以下摘自<IDA Pro>,貌似有一些细节之处没有交代清楚呢,需要进一步思考.实践. 了解栈帧的基本概念后,接下来详细介绍它们的结构.下面的例子涉及x86体系结构和与常见的x86编译器(如 ...