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 로그인과 별개로 유지됩니다.

관련 글