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
相关产品推荐
相关产品推荐

