如何在 Django 中发送短信?

Posted

技术标签:

【中文标题】如何在 Django 中发送短信?【英文标题】:How can I send a sms in Django? 【发布时间】:2022-01-19 14:30:07 【问题描述】:

我在 Django 项目中尝试使用 SMSC 服务发送短信时遇到问题。

我发送电子邮件和短信的 Celery 任务:

 def order_created_retail(order_id):
    # Task to send an email when an order is successfully created
    order = OrderRetail.objects.get(id=order_id)
    subject = 'Order №.'.format(order_id)
    message_mail = 'Hello, ! You have successfully placed an order. Manager will contact you shortly'.format(order.first_name, order.id)
    message_sms = 'Your order № is accepted! Wait for operator call'
    mail_sent = send_mail(
        subject,
        message_mail,
        'email@email.com',
        [order.email]
    )
    smsc = SMSC()

    sms_sent = smsc.send_sms(
        [order.phone],
        str(message_sms)
    )
    return mail_sent, sms_sent

电子邮件发送正确,但对于短信我收到了错误:

Task orders.tasks.order_created_retail[f05458b1-65e8-493b-9069-fbaa55083e7a] raised unexpected: TypeError('quote_from_bytes() expected bytes')

SMSC 库中的函数:

    def send_sms(self, phones, message, translit=0, time="", id=0, format=0, sender=False, query=""):
        formats = ["flash=1", "push=1", "hlr=1", "bin=1", "bin=2", "ping=1", "mms=1", "mail=1", "call=1", "viber=1", "soc=1"]

        m = self._smsc_send_cmd("send", "cost=3&phones=" + quote(phones) + "&mes=" + quote(message) + \
                    "&translit=" + str(translit) + "&id=" + str(id) + ifs(format > 0, "&" + formats[format-1], "") + \
                    ifs(sender == False, "", "&sender=" + quote(str(sender))) + \
                    ifs(time, "&time=" + quote(time), "") + ifs(query, "&" + query, ""))

        # (id, cnt, cost, balance) или (id, -error)

        if SMSC_DEBUG:
            if m[1] > "0":
                print("Сообщение отправлено успешно. ID: " + m[0] + ", всего SMS: " + m[1] + ", стоимость: " + m[2] + ", баланс: " + m[3])
            else:
                print("Ошибка №" + m[1][1:] + ifs(m[0] > "0", ", ID: " + m[0], ""))

        return m

我做错了什么?

谢谢!

【问题讨论】:

这能回答你的问题吗? TypeError: quote_from_bytes() expected bytes after redirect 【参考方案1】:

为了解决这个问题,我开始调查出现错误的函数。

原来我传递的值不正确。该函数需要一个字符串。我花了很长时间才弄清楚为什么编辑没有帮助。

事实证明,每次编辑时都必须重置 CELERY。

【讨论】:

以上是关于如何在 Django 中发送短信?的主要内容,如果未能解决你的问题,请参考以下文章

Django--短信验证码

django-发送短信流程介绍

django之集成阿里云通信(发送手机短信验证码)

22 发送短信接口+短信登录接口

django使用celery异步发送短信

:如何将手机短信通过微信发送给朋友?