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 تمام سلام را مصرف کنید. در غیر این صورت کلاینت ممکن است وقتی 250 مربوط به EHLO را انتظار دارد 220 قدیمی بخواند و روی یک اتصال سالم از ریتم خارج شود.

TLS ضمنی ترتیب دیگری دارد: اتصال SOCKS، دست‌دادن TLS و سپس سلام SMTP درون TLS. STARTTLS با سلام خواندنی و EHLO آغاز می‌شود، جریان را ارتقا می‌دهد و پس از آن دوباره توانمندی‌ها را می‌گیرد.

سازندهٔ عمومی معمولاً پیکربندی سوکت، پارامترهای ذخیره‌شدهٔ اتصال و اطلاعات سلام، پاسخ آغازین و EHLO با جایگزین HELO را در جای مناسب مدیریت می‌کند:

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 باقی می‌مانند.

مقالات مرتبط