{"record":{"id":"9ca83748828e3a73","repo":"DIYgod/RSSHub","slug":"error-as-responsetext-string-responsetext","errorCode":null,"errorMessage":"${(error as { responseText: string }).responseText}","messagePattern":"(.+?)\\)\\.responseText\\}","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"lib/routes/mail/imap.ts","lineNumber":58,"sourceCode":"        port: Number.parseInt(String(mailConfig.port)),\n        secure: true,\n        auth: {\n            user: mailConfig.username,\n            pass: mailConfig.password,\n        },\n        proxy: config.proxyUri, // Note: socks5h is not supported\n        logger: {\n            debug: (log) => logger.debug(log.msg),\n            info: (log) => logger.info(log.msg),\n            warn: (log) => logger.warn(log.msg),\n            error: (log) => logger.error(log?.msg),\n        },\n    });\n\n    try {\n        await client.connect();\n    } catch (error) {\n        throw new Error((error as { responseText: string }).responseText, { cause: error });\n    }\n\n    /**\n    [\n        {\n          // https://imapflow.com/global.html#FetchMessageObject\n          seq: Number,\n          uid: Number,\n          envelope: {\n            // https://imapflow.com/global.html#MessageEnvelopeObject\n          },\n          id: 'md5-like-hash-string',\n          source: Buffer,\n        }\n      ]\n    */\n    const mails: any[] = [];\n    const lock = await client.getMailboxLock(folder);","sourceCodeStart":40,"sourceCodeEnd":76,"githubUrl":"https://github.com/DIYgod/RSSHub/blob/bed535e0879dc71c5aff6f1e7bd1ac21ede40115/lib/routes/mail/imap.ts#L40-L76","documentation":"Thrown by the Email IMAP handler (lib/routes/mail/imap.ts:58) when `client.connect()` from `imapflow` rejects. The caught error is cast to `{ responseText: string }` and its `responseText` becomes the message; if the underlying error has no such property the message is literally `\"undefined\"`, obscuring the real cause.","triggerScenarios":"Wrong IMAP host/port; bad credentials (auth rejected); network/firewall blocking 993; TLS mismatch; proxy misconfiguration (`config.proxyUri` unsupported scheme — note socks5h is unsupported per the comment); the IMAP server returns an error object without `responseText`.","commonSituations":"App password vs. regular password (Gmail/Yahoo require app passwords); corporate firewall blocking IMAP; host set to a POP3 server; expired credentials; `responseText` undefined producing a useless message.","solutions":["Verify IMAP host/port and that port 993 is reachable from the RSSHub host.","Use an app-specific password for providers that require it (Gmail, Yahoo, iCloud).","If `config.proxyUri` is set, ensure it is HTTP/HTTPS (not socks5h).","Improve the error cast so a missing `responseText` falls back to the real error message (see exampleFix)."],"exampleFix":"// before\ntry {\n    await client.connect();\n} catch (error) {\n    throw new Error((error as { responseText: string }).responseText, { cause: error });\n}\n\n// after: fall back to a useful message when responseText is absent\ntry {\n    await client.connect();\n} catch (error) {\n    const e = error as { responseText?: string; message?: string };\n    const message = e.responseText || e.message || 'IMAP connection failed';\n    throw new Error(message, { cause: error });\n}","handlingStrategy":"try-catch","validationCode":"// Pre-flight reachability check before IMAP connect.\nimport net from 'node:net';\nasync function imapReachable(host: string, port: number, timeoutMs = 5000): Promise<boolean> {\n    return await new Promise((resolve) => {\n        const socket = net.createConnection({ host, port });\n        socket.setTimeout(timeoutMs);\n        socket.once('connect', () => { socket.end(); resolve(true); });\n        socket.once('error', () => resolve(false));\n        socket.once('timeout', () => { socket.destroy(); resolve(false); });\n    });\n}","typeGuard":"function hasResponseText(e: unknown): e is { responseText: string } {\n    return typeof (e as any)?.responseText === 'string' && (e as any).responseText.length > 0;\n}","tryCatchPattern":"try {\n    await client.connect();\n} catch (error) {\n    const e = error as { responseText?: string; message?: string };\n    const message = e.responseText || e.message || 'IMAP connection failed';\n    throw new Error(message, { cause: error });\n}","preventionTips":["Use app passwords for providers that require them.","Confirm port 993 is reachable from the RSSHub host before configuring the route.","Always fall back to `error.message` when a typed field is missing."],"tags":["network","imap","email","error-handling","credentials"],"backgroundTag":null,"analyzedSha":"bed535e0879dc71c5aff6f1e7bd1ac21ede40115","analyzedAt":"2026-08-12T19:29:35.364Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}