调用Mailgun API发送邮件时HTTP请求无法正常工作
问题根因
代码存在4个直接导致请求失败的问题:
- 认证逻辑不符合Mailgun API规范:Mailgun不支持在请求头中直接传
api字段作为密钥,要求使用HTTP Basic认证,固定用户名为api,密码为账户对应的API密钥。 - Content-Type配置错误:Mailgun v3发信接口默认接收
application/x-www-form-urlencoded格式的请求体,配置的application/json会导致服务端无法解析参数,直接返回400错误。 - GML语法错误:
ds_map_create()后直接跟大括号批量写入键值对是非法语法,GML不支持这种数据结构初始化写法,会直接触发运行时报错。 - 缺少参数编码与响应处理逻辑:直接将DS Map作为POST请求体传入时,GML不会自动将其编码为接口要求的form格式,同时未编写HTTP异步回调逻辑,无法获取服务端返回的错误信息定位问题。
修正方案
- 生成符合要求的Basic认证头:将字符串
api:你的API密钥做Base64编码,拼接为Basic 编码结果的格式放入Authorization请求头。 - 将Content-Type修改为
application/x-www-form-urlencoded。 - 按照GML语法正确构建参数,手动将所有参数拼接为urlencoded格式的字符串,每个参数值用
url_encode()处理转义。 - 添加HTTP异步事件处理逻辑,打印请求返回的状态码、响应内容,方便后续排查问题。
修正后的可运行代码
// 构建请求头 header = ds_map_create(); // 替换为你自己的Mailgun API密钥 var _api_key = "你的实际Mailgun私钥"; var _auth_str = "api:" + _api_key; var _auth_b64 = base64_encode(_auth_str); header[? "Authorization"] = "Basic " + _auth_b64; header[? "Content-Type"] = "application/x-www-form-urlencoded"; // 构建POST请求体(form-urlencoded格式) var _from = url_encode("mailgun@lapaihui.org"); var _to = url_encode("你的收件人邮箱"); var _subject = url_encode("Dear user"); var _text = url_encode("This is your game talking"); var _post_body = "from=" + _from + "&to=" + _to + "&subject=" + _subject + "&text=" + _text; // 发送请求,保存请求ID用于异步回调匹配 request_id = http_request("https://api.mailgun.net/v3/lapaihui.org/messages", "POST", header, _post_body); // 销毁DS Map避免内存泄漏 ds_map_destroy(header);
需要在对应对象的
Async - HTTP事件中添加以下代码,获取请求返回结果排查问题:if (async_load[? "id"] == request_id) { if (async_load[? "status"] == 0) { show_debug_message("请求失败,请检查本地网络连接"); } else { show_debug_message("响应状态码:" + string(async_load[? "status"])); show_debug_message("响应内容:" + async_load[? "result"]); } }常见状态码对应问题:
- 401:API密钥错误,或认证头格式不符合要求
- 400:参数缺失、发件人域名未完成DNS验证、收件人邮箱格式错误;如果使用Mailgun默认沙盒域名,收件人必须提前在Mailgun后台完成授权验证,否则会被拦截
- 403:账号未激活,或当前使用的API密钥没有对应发信域名的操作权限
- 404:API请求地址错误,检查域名、路径是否和Mailgun后台显示的配置一致
内容的提问来源于stack exchange,提问作者Hats OFF
相关产品推荐
相关产品推荐

