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

Strato Webmail自动设置外出消息时会话过期问题求助

问题分析与修复方案

登录请求成功拿到会话ID,但调用邮件过滤接口时提示会话过期,核心原因在于会话维持方式错误、请求格式不匹配以及Curl配置破坏会话上下文,以下是具体修复步骤:


1. 会话传递:改用Cookie而非URL参数

Strato的API会话依赖Cookie维持,而非仅在URL中拼接session参数。登录后服务器会返回Set-Cookie头,后续请求必须携带这些Cookie才能保持会话有效性。

2. 请求格式修正:匹配JSON类型

设置外出消息的请求体是JSON字符串,但原代码强制使用application/x-www-form-urlencoded的Content-Type,服务器无法正确解析请求,导致会话验证失败。

3. 禁用强制新建连接

CURLOPT_FRESH_CONNECT会强制每次请求新建连接,破坏会话的持久连接上下文,直接导致会话失效,需关闭该配置。

4. 复用Cookie Jar

每次调用Curl都新建实例且不保存Cookie,会话无法延续。需用临时Cookie文件保存登录后的会话信息,后续请求复用。


修复后的完整代码

<?php
$myJson = '{
    "actioncmds": [
        {
            "addresses": [
                "mail@domain.de"
            ],
            "days": "7",
            "id": "vacation",
            "subject": "My Subject",
            "text": "My Message"
        }
    ],
    "active": true,
    "flags": [
        "vacation"
    ],
    "id": 5,
    "position": 0,
    "rulename": "Abwesenheitsbenachrichtigung",
    "test": {
        "id": "allof",
        "tests": [
            {
                "comparison": "ge",
                "datepart": "date",
                "datevalue": [
                    1672272000000
                ],
                "id": "currentdate",
                "zone": "+0100"
            },
            {
                "comparison": "le",
                "datepart": "date",
                "datevalue": [
                    1672876800000
                ],
                "id": "currentdate",
                "zone": "+0100"
            }
        ]
    }
}';

// 创建临时Cookie文件
$cookieFile = tempnam(sys_get_temp_dir(), 'STRATO_COOKIE');

function stratoCurl($url, $type, $parameter, $cookieFile, $contentType = 'application/x-www-form-urlencoded') {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $type);
    curl_setopt($ch, CURLOPT_HEADER, FALSE);
    curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
    curl_setopt($ch, CURLOPT_TIMEOUT, 30);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2TLS);
    curl_setopt($ch, CURLOPT_ENCODING, '');
    
    // 启用Cookie保存与复用
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile);
    
    // 设置请求体与Content-Type
    if (!empty($parameter)) {
        curl_setopt($ch, CURLOPT_POSTFIELDS, $parameter);
    }
    curl_setopt($ch, CURLOPT_HTTPHEADER, [
        "Content-Type: {$contentType}",
        "Accept: application/json"
    ]);
    
    $response = json_decode(curl_exec($ch), true);
    curl_close($ch);
    return $response;
}

// 登录请求:表单编码
$stratoLogin = stratoCurl(
    "https://webmail.strato.de/appsuite/api/login", 
    "POST", 
    http_build_query([
        "action" => "login",
        "name" => "myUserName",
        "password" => "myPassword"
    ]),
    $cookieFile
);

// 设置外出消息:JSON编码
$setMessage = stratoCurl(
    "https://webmail.strato.de/appsuite/api/mailfilter/v2?action=update", 
    "PUT", 
    $myJson,
    $cookieFile,
    'application/json'
);

echo '<pre>';
print_r($stratoLogin);
print_r($setMessage);
echo '</pre>';

// 清理临时Cookie文件
unlink($cookieFile);
?>

额外注意事项

  • 对照抓包原始请求:确认手动操作时的Content-Type是否为application/json,以及Cookie中是否包含会话相关字段
  • 动态生成日期:示例中datevalue是固定时间戳,实际使用时需根据外出时间段生成对应毫秒级时间戳
  • 添加错误排查:可在Curl执行后添加curl_error($ch)检查连接或解析错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:15:38