You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mailgun发送邮件偶尔挂起且无法发送的技术咨询

嘿,这种时好时坏的表单发送问题确实挺闹心的,结合你说的服务器无SSL、代码嵌在<body>里这些情况,我帮你梳理几个大概率的原因和解决办法:

1. 非SSL环境下的Mailgun连接阻塞问题

因为服务器没配置SSL,当PHP调用Mailgun的HTTPS API时,很可能因为SSL证书验证失败或者网络连接超时导致请求卡住。你可以调整cURL的配置来规避这个问题(虽然临时关闭证书验证不太安全,但能先排查问题):

// 假设你用cURL调用Mailgun
$ch = curl_init('https://api.mailgun.net/v3/your-domain.com/messages');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 临时关闭证书验证
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // 设置10秒连接超时
curl_setopt($ch, CURLOPT_TIMEOUT, 15); // 设置总请求超时
// 其他cURL配置(比如API密钥、表单参数)...
$response = curl_exec($ch);
// 捕获cURL错误
if(curl_errno($ch)) {
    error_log('Mailgun cURL错误: ' . curl_error($ch));
}
curl_close($ch);

如果条件允许,更推荐给服务器配置免费的SSL证书(比如Let's Encrypt),从根源解决HTTPS连接问题。

2. PHP代码嵌入<body>导致的同步执行阻塞

把表单处理的PHP代码直接放在<body>标签里,当用户提交表单时,页面会一直等待PHP执行完Mailgun请求才会刷新。如果请求超时,页面就会一直显示“waiting for url...”。解决办法有两个:

  • 把PHP处理逻辑移到页面最顶部:在HTML输出之前就完成表单处理,处理完后再跳转到结果页面或者返回提示,避免页面加载过程中卡住。
  • 改用AJAX异步提交:前端用JavaScript异步发送表单数据,这样页面不会挂起,还能给用户实时反馈(比如“发送中...”)。举个简单的jQuery示例:
<form id="contact-form">
    <!-- 你的表单字段 -->
    <button type="submit">发送</button>
</form>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
$('#contact-form').submit(function(e) {
    e.preventDefault();
    const $btn = $(this).find('button');
    $btn.text('发送中...').prop('disabled', true);
    $.ajax({
        url: 'submit-form.php', // 把PHP处理逻辑单独放在这个文件里
        method: 'POST',
        data: $(this).serialize(),
        success: function(res) {
            alert('发送成功!');
            $btn.text('发送').prop('disabled', false);
        },
        error: function() {
            alert('发送失败,请稍后重试');
            $btn.text('发送').prop('disabled', false);
        }
    });
});
</script>
3. 缺少错误日志导致无法排查问题

你说邮件未发送时无任何报错,大概率是PHP没开启错误日志,或者代码里没捕获请求错误。建议在PHP代码里加上错误捕获并记录日志:

error_reporting(E_ALL);
ini_set('log_errors', 1);
ini_set('error_log', '/path/to/your/error.log'); // 替换成服务器可写的路径

try {
    // 你的Mailgun发送代码
} catch (Exception $e) {
    error_log('Mailgun发送失败: ' . $e->getMessage());
    // 可以给前端返回错误标识,方便显示提示
    header('Location: contact.php?status=error');
    exit;
}

这样即使页面挂起,你也能通过错误日志看到具体是连接超时、API密钥错误还是参数问题。

4. 脚本执行时间限制

默认PHP脚本执行时间可能是30秒,但如果Mailgun请求超时,脚本可能会一直跑直到超时。可以在PHP开头设置更合理的超时时间:

set_time_limit(20); // 设置20秒超时,避免页面无限挂起

内容的提问来源于stack exchange,提问作者CalvinWylie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:09:05