关于SMS Gateway中DLR URL的用途及Python实现方法咨询
DLR URL 用途及Python实现方案
一、DLR URL的具体用途
你对DLR的理解完全准确,DLR全称Delivery Receipt(短信递送回执),这个URL是你提供给SMS网关的回调地址,核心作用有这些:
- 接收网关推送的短信发送状态:比如短信是否成功送达用户手机、是否因号码无效/运营商故障失败、是否处于待发送队列等
- 获取关键回执数据:网关通常会通过POST请求把状态码、短信唯一ID、接收号码、实际送达时间、失败原因(如果失败)等参数传给这个URL
- 实现业务闭环:你可以基于这些数据更新本地业务状态(比如订单通知已送达)、统计短信送达率、给用户补发通知等
二、用Python创建DLR回调端点
方案1:Flask快速搭建(适合入门)
- 先安装依赖:
pip install flask
- 编写回调代码:
from flask import Flask, request, jsonify app = Flask(__name__) # 对应你设置的dlr-url路径/dlr @app.route('/dlr', methods=['POST']) def process_dlr(): # 解析网关推送的数据,兼容JSON和表单格式 try: dlr_info = request.get_json() except: dlr_info = request.form.to_dict() # 这里可根据需求处理数据,比如写入日志或数据库 print("收到DLR回执:", dlr_info) # 必须返回200状态码,告知网关已成功接收 return jsonify({"result": "success"}), 200 if __name__ == '__main__': # 本地测试可启动,生产环境需部署到公网服务器 app.run(host='0.0.0.0', port=5000, debug=False)
方案2:FastAPI实现(现代轻量框架)
- 安装依赖:
pip install fastapi uvicorn
- 编写代码:
from fastapi import FastAPI, Request from fastapi.responses import JSONResponse app = FastAPI() @app.post("/dlr") async def process_dlr(request: Request): # 解析请求数据 try: dlr_info = await request.json() except: form_data = await request.form() dlr_info = dict(form_data) # 处理回执逻辑,比如存入数据库 print("DLR回执内容:", dlr_info) # 返回成功响应 return JSONResponse(content={"status": "received"}, status_code=200)
启动命令:
uvicorn main:app --host 0.0.0.0 --port 5000
关键注意事项
- DLR URL必须是公网可访问的,网关才能推送数据;本地测试可使用ngrok等工具临时暴露端口
- 务必返回200状态码给网关,否则网关会判定推送失败,可能重复发送回执
- 不同SMS网关的DLR参数格式可能有差异,要对照官方文档解析字段(比如状态码字段可能叫
status或delivery_status) - 生产环境要做好数据校验、异常捕获和日志留存,避免丢失重要回执信息
内容的提问来源于stack exchange,提问作者Kaiss B.
相关产品推荐
相关产品推荐

