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

libsoup是否支持带参数的SMTP HELO命令?迁移遇阻塞求助

从CURL迁移至libsoup实现SMTP HELO命令的问题解决
  • libsoup是专注于HTTP/HTTPS协议的库,完全不支持SMTP协议,这是你代码阻塞的核心原因。CURL能处理SMTP是因为它内置了多协议支持,而libsoup仅面向HTTP相关操作。
  • 你的代码逻辑错误:用HTTP会话处理SMTP请求,Soup.Session只能识别标准HTTP方法(GET/POST等),把HELO myService当作HTTP方法传入完全不符合协议规则,导致会话无法解析请求,最终陷入阻塞。

替代实现方案

直接使用GIO的Socket API手动实现SMTP协议流程(以GJS环境为例):

const { Gio, GLib } = imports.gi;

async function sendHelo() {
    const socketClient = new Gio.SocketClient();
    // 建立TLS连接到SMTPs的465端口
    const tlsConnection = await new Promise((resolve, reject) => {
        socketClient.connect_to_host_async("smtp.server.com", 465, null, (client, res) => {
            try {
                const rawConn = client.connect_to_host_finish(res);
                const tlsConn = Gio.TlsClientConnection.new(rawConn, null);
                tlsConn.handshake_async(null, (tls, tlsRes) => {
                    try {
                        tls.handshake_finish(tlsRes);
                        resolve(tlsConn);
                    } catch (e) {
                        reject(e);
                    }
                });
            } catch (e) {
                reject(e);
            }
        });
    });

    // 读取服务器初始响应
    const buffer = new GLib.Buffer(1024);
    let bytesRead = await new Promise((resolve) => {
        tlsConnection.read_async(buffer, 0, buffer.get_size(), GLib.PRIORITY_DEFAULT, null, (conn, res) => {
            resolve(conn.read_finish(res));
        });
    });
    log(`服务器初始响应: ${GLib.utf8_get_string(buffer.get_data(), bytesRead)}`);

    // 发送HELO命令
    const heloCmd = GLib.string_to_utf8("HELO myService\r\n");
    await new Promise((resolve) => {
        tlsConnection.write_async(heloCmd, GLib.PRIORITY_DEFAULT, null, (conn, res) => {
            conn.write_finish(res);
            resolve();
        });
    });

    // 读取HELO回复
    buffer.reset();
    bytesRead = await new Promise((resolve) => {
        tlsConnection.read_async(buffer, 0, buffer.get_size(), GLib.PRIORITY_DEFAULT, null, (conn, res) => {
            resolve(conn.read_finish(res));
        });
    });
    log(`HELO响应: ${GLib.utf8_get_string(buffer.get_data(), bytesRead)}`);

    tlsConnection.close(null);
}

sendHelo().catch(e => log(`错误: ${e.message}`));

也可以选择更上层的SMTP客户端库(如gmime,需安装对应绑定)来简化开发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 22:03:16