Net::SMTP 3.16 没有预连接 SOCKS 构造函数
Net::SMTP 3.16 并未记录预连接套接字的构造函数选项。选择代理传输集成时,请保持 SMTP 问候、EHLO 与 TLS 顺序不变。
Net::SMTP 3.16 没有记录 SOCKS 或预连接套接字的构造函数参数。用继承而来的 new_from_fd 包装文件描述符并不会运行它的 SMTP 构造函数。成功的 SOCKS 连接提供的是流,而不是已初始化的邮件会话。
对于普通 SMTP,包括之后的 STARTTLS 升级,服务器先开口:
SOCKS: connection to smtp.example.net:587 succeeds
server: 220 smtp.example.net ready
client: EHLO client.example.net
server: 250-smtp.example.net
server: 250-STARTTLS
server: 250 AUTH ...这是示意图;实际公布的扩展各不相同。问候本身可能跨多行:响应码后跟连字符表示继续,最后一行则终止该响应。在 EHLO 之前必须读完整个问候。否则客户端可能在等待 EHLO 的 250 时读到旧的 220,从而在正常的连接上乱序。
隐式 TLS 的顺序不同:先建立 SOCKS 连接,再进行 TLS 握手,然后在 TLS 内部进行 SMTP 问候。STARTTLS 从可读的问候和 EHLO 开始,升级数据流,之后再重新获取能力。
公开构造函数通常负责套接字配置、保存的连接参数与问候信息、初始响应,以及在适当情况下带 HELO 回退的 EHLO:
use Net::SMTP;
my $smtp = Net::SMTP->new(
'smtp.example.net',
Port => 587,
Hello => 'client.example.net',
Timeout => 30,
) or die "SMTP connection failed: $@";
$smtp->starttls()
or die "STARTTLS failed: " . $smtp->message;这个公开示例使用 STARTTLS,并未配置 SOCKS。服务器名选择邮件目标;Hello 提供客户端的 SMTP 身份。对于隐式 TLS,请使用有文档记载的 SSL 构造函数选项以及服务的端口。
SendHello => 0 抑制的是自动 EHLO/HELO,而不是读取问候或构建传输。先调用行读取器再调用 hello() 也不是有文档记载的初始化替代方案:Net::Cmd 将其低层响应读取器归类为受保护的子类方法。
如果 SOCKS 是必需的,请选择支持 SOCKS 接口的客户端,或针对特定 Net::SMTP 版本维护集成。请把上述顺序当作它的契约,而不要复制私有字段。单独的 TCP 适配器也需要有意识地处理 TLS 身份:证书必须标识真实的邮件服务,代理凭据与 SMTP 登录保持分离。