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. אחרת הלקוח עלול לקרוא 220 ישן כשהוא מצפה ל-250 של EHLO ולצאת מקצב על חיבור תקין.

ל-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.

מאמרים קשורים