python3利用腾讯云发送短信

如何发送短信

首先,注册一个腾讯云的账号,然后点击这里

  1. 注册成功后,腾讯云会自动生成一个短信应用,如果没有默认应用,需要新建一下
  2. 记录一下应用的 appid 以及 appkey 一会要用到
  1. 配置短信的签名,用来限制短信接口的权限,防止被恶意调用

  2. 然后配置模板

  3. 好了,进入正题,下面安装腾讯云短信的sdk
    pip install qcloudsms_py

  4. 按照官网文档,准备必要的参数

    # 短信应用 SDK AppID
    appid = 1400009099  # SDK AppID 以1400开头
    # 短信应用 SDK AppKey
    appkey = "9ff91d87c2cd7cd0ea762f141975d1df37481d48700d70ac37470aefc60f9bad"
    # 需要发送短信的手机号码
    phone_numbers = ["21212313123", "12345678902", "12345678903"]
    # 短信模板ID,需要在短信控制台中申请
    template_id = 7839  # NOTE: 这里的模板 ID`7839` 只是示例,真实的模板 ID 需要在短信控制台中申请
    # 签名
    sms_sign = "腾讯云"  # NOTE: 签名参数使用的是`签名内容`,而不是`签名ID`。这里的签名"腾讯云"只是示例,真实的签名需要在短信控制台中申请
  5. 指定模板ID单发短信

    from qcloudsms_py import SmsSingleSender
    from qcloudsms_py.httpclient import HTTPError
    ssender = SmsSingleSender(appid, appkey)
    params = ["5678"]  # 当模板没有参数时,`params = []`可以发送随机数,用来做短信验证码,如果指定为["5678",'5'],则过期时间为5分钟
    try:
     	result = ssender.send_with_param(86, phone_numbers[0],
          template_id, params, sign=sms_sign, extend="", ext="") 
    except HTTPError as e:
     	print(e)
    except Exception as e:
     	print(e)
    print(result)
  6. 如果要群发短信,phone_numbers不取0值,发送全部


点击发送短信验证码

视图定义,获取手机号,这里,我是把上面的脚本封装成函数phone_s了,两个参数,分别为手机号和随机数验证码

class phoneView(APIView):

    def post(self,request):
        phone = request.POST.get('phone')
		# 随机数,用来做验证码
        uuid = random.randint(1000,9999)
        # 调用发送短信的接口,传入手机号和随机数验证码
        pwg = phone_s(phone,uuid)
        if pwg:
            # 连接redis
            redis_client = get_redis_connection('phone')

            redis_phone = redis_client.get(phone)
			# 防止频繁发送,如果redis中有,就不必再发
            if redis_phone:
                return Response({'code': 1003, 'msg': '频繁发送'})
            # 存入redis,邮箱为键,uuid为值
            redis_client = get_redis_connection('phone')  # 获取redis客户端
            redis_client.setex(phone, 60 * 5, uuid)
            return Response({'code':1000,'msg':'发送成功'})
        return Response({'code':1004,'msg':'发送失败'})

至于验证,只需要从redis中取出验证码来比对即可


邮箱验证码

发送邮箱验证码,我们使用的是QQ邮箱,打开QQ邮箱,打开设置,在里面找到

POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务

打开POP3/SMTP服务

获取到授权码之后,我们就可以直接可以开始

#定义参数
my_mail = "你申请授权的邮箱"
#授权码
my_pass = "授权码"

#定义发送邮件的方法
def mail(subject,content,mailaddr):

    #声明邮件对象
    msg = MIMEText(content,'plain','utf-8')

    #设置发送方对象
    msg['From'] = formataddr(['在线教育平台',my_mail])

    #设置收件方对象
    msg['To'] = formataddr(['尊敬的客户',mailaddr])

    #设置标题
    msg['Subject'] = subject

    #设置smtp服务器
    server = smtplib.SMTP_SSL("smtp.qq.com",465)

    #登录邮箱
    server.login(my_mail,my_pass)

    #发送邮件
    server.sendmail(my_mail,[mailaddr],msg.as_string())

    #关闭smtp链接
    server.quit()

然后定义视图

class Go_emailView(APIView):

    def post(self,request):
        # 验证邮箱有效性
        email = request.POST.get('email',None)
        try:
            re.match(r'[a-zA-Z0-9]{0,19{@(qq|163|126)\.(com|cn|net)$', email)
        except Exception as e:
            return Response({'code': 1002, 'msg': '电子邮箱不正确'})

        # 查询redis中是否有这个数据,如果有,则不需要再次发送
        # 验证邮箱验证码
        redis_client = get_redis_connection('email')
        # 获取redis中的库
        redis_email = redis_client.get(email)
        if redis_email:
            return Response({'code':1003,'msg':'频繁发送'})

        uuid = random.randint(0,9999)

        try:
            # 调用发送邮件的函数
            mail('龙潭技术博客验证', '您的验证码是{{,有限期为2分钟'.format(uuid), email)
            # 存入redis,邮箱为键,uuid为值
            redis_client = get_redis_connection('email')  # 获取redis客户端
            redis_client.setex(email, 60 * 2, uuid)
            return Response({'code':1000,'msg':'发送成功'})
        except Exception as e:
            print(e)
            return Response({'code':1001,'msg':'发送失败'})