בדיקת SMTP עם telnet

מדריך מעשי לבדיקת שרת אימייל ידנית. למדו מה עושה כל פקודת SMTP, כיצד השרת משיב, וכיצד להריץ מפגש אימות מלא עם telnet או openssl.

SMTP‏ (Simple Mail Transfer Protocol‏) הוא פרוטוקול טקסט-רגיל, מבוסס-שורות. משמעות הדבר היא שאפשר לשוחח עם שרת דואר ישירות מתוך טרמינל ולקרוא בדיוק מה הוא משיב — ללא צורך בתוכנה מיוחדת. זוהי הדרך השקופה ביותר לבדוק האם תיבת דואר קיימת, האם שרת נגיש, וכיצד הוא מוגדר.

1. התחברות לשרת דואר

תחילה מצאו את שרת הדואר (מארח MX‏) של הדומיין, ואז פתחו חיבור TCP‏ אל פורט ה-SMTP‏ שלו. הפורט הקלאסי הוא 25. פורטי ההגשה 587 ו-2525 משמשים עם STARTTLS‏; פורט 465 הוא TLS‏ מובלע (SMTPS‏).

חיבור רגיל (פורט 25):

telnet mail.example.com 25

פורט STARTTLS‏ (587 או 25) — telnet אינו תומך ב-TLS‏, השתמשו ב-openssl‏:

openssl s_client -connect mail.example.com:587 -starttls smtp -crlf

פורט TLS‏ מובלע (465):

openssl s_client -connect mail.example.com:465 -crlf

הערה: ספקי אינטרנט ביתיים וסלולריים רבים חוסמים את פורט 25 היוצא כדי להילחם בספאם. אם telnet ... 25 פשוט נתקע, זהו בדרך כלל הספק שלכם, לא שרת הדואר. בדקו משרת/VPS‏ שבו פורט 25 פתוח, או השתמשו בפורטי הגשה.

2. פקודות SMTP‏ בהסבר

אתם מקלידים פקודות (ללא רגישות לאותיות גדולות/קטנות); השרת משיב בקוד בן 3 ספרות ובטקסט. סיימו כל פקודה ב-Enter‏ (CRLF‏).

פקודהמה היא עושה
HELO domainברכת פתיחה ישנה. מזהה את המארח המתחבר לפי שם. השרת משיב 250.
EHLO domainברכת פתיחה מודרנית (HELO מורחב). זהה ל-HELO אך השרת גם מציג את ההרחבות הנתמכות (STARTTLS, AUTH, SIZE, PIPELINING…).
MAIL FROM:<addr>מתחיל הודעה חדשה ומגדיר את שולח המעטפה (ה“נתיב החוזר”). תשובת 250 אם התקבל.
RCPT TO:<addr>הפקודה המרכזית לאימות. מבקשת מהשרת לקבל נמען. 250 = תיבת הדואר התקבלה; 550 = אין משתמש כזה; 4xx = נסו מאוחר יותר (למשל greylisting‏).
DATAמתחיל את גוף ההודעה. השרת משיב 354; אתם שולחים כותרות + גוף ומסיימים בנקודה בודדת . בשורה משלה. (בבדיקת אימות לעולם אינכם מגיעים לשלב זה.)
RSETמאפס את הטרנזקציה הנוכחית (שוכח את MAIL FROM / RCPT TO‏) בלי לסגור את החיבור.
VRFY userמבקש מהשרת לאמת שם משתמש/כתובת. תוכנן בדיוק לשם כך, אך כמעט תמיד מושבת כיום (מחזיר 252 או 502) משום שהוא חושף כתובות תקפות לשולחי ספאם.
EXPN listמבקש מהשרת להרחיב רשימת תפוצה לחבריה. כמו VRFY‏, מושבת כמעט בכל מקום מאותה סיבת פרטיות.
STARTTLSמשדרג חיבור רגיל ל-TLS‏ מוצפן (בפורטים 25/587). מוצע רק אם צוין בתשובת ה-EHLO‏.
AUTH LOGIN / PLAINמאמת משתמש (נדרש כדי לשלוח דואר דרך פורטי הגשה, לא לצורך אימות).
NOOPאינו עושה דבר; השרת משיב 250. שימושי כדי לשמור חיבור פעיל או לבדוק תגובתיות.
HELPמבקש מהשרת להציג את הפקודות שהוא תומך בהן.
QUITמסיים את הסשן באדיבות. השרת משיב 221 וסוגר את החיבור.

3. קודי תגובה

הספרה הראשונה אומרת לכם את הקטגוריה, כך שתוכלו לקרוא כל תשובה גם אם אינכם יודעים את הקוד המדויק:

  • 2xx — הצלחה (הפקודה התקבלה).
  • 3xx — ביניים, השרת רוצה קלט נוסף (למשל 354 אחרי DATA‏).
  • 4xx — כשל זמני: נסו שוב מאוחר יותר. ייתכן שהכתובת עדיין תקפה.
  • 5xx — כשל קבוע: הפקודה או הכתובת נדחו.
קודמשמעות
220השירות מוכן (כרזת הברכה).
221סוגר את החיבור (תשובה ל-QUIT‏).
250תקין — הפקודה התקבלה (התשובה שאתם רוצים אחרי RCPT TO‏).
251 / 252המשתמש אינו מקומי אך יועבר / לא ניתן לאמת אך ינסה למסור.
354התחילו לשלוח את גוף ההודעה (אחרי DATA‏).
421השירות אינו זמין, סוגר — לרוב הגבלת קצב.
450 / 451 / 452בעיה זמנית (תיבת הדואר עסוקה, שגיאה מקומית, אחסון נמוך). Greylisting מופיע כאן לעיתים קרובות.
502הפקודה אינה ממומשת (תשובה אופיינית ל-VRFY / EXPN‏).
550תיבת הדואר אינה זמינה / אין משתמש כזה — הכתובת אינה קיימת.
551 / 552 / 553 / 554המשתמש אינו מקומי / חריגה ממכסה / שם תיבת דואר שגוי / הטרנזקציה נכשלה.

4. דוגמה מלאה ומפורטת

בדיקה האם john@example.com קיים. השורות שאתם מקלידים מסומנות ב->; כל השאר הוא השרת:

$ telnet mail.example.com 25 220 mail.example.com ESMTP ready > EHLO checkemail.test 250-mail.example.com Hello checkemail.test 250-STARTTLS 250-SIZE 52428800 250 PIPELINING > MAIL FROM:<probe@checkemail.test> 250 2.1.0 Ok > RCPT TO:<john@example.com> 250 2.1.5 Ok ← mailbox EXISTS > RSET 250 2.0.0 Ok > QUIT 221 2.0.0 Bye

אם לעומת זאת הנמען אינו קיים, הייתם רואים משהו כמו:

> RCPT TO:<nosuchuser@example.com> 550 5.1.1 <nosuchuser@example.com>: Recipient address rejected: User unknown

5. דברים שהופכים את התוצאות ללא ודאיות

  • Greylisting — השרת מחזיר בכוונה תשובה זמנית 4xx בניסיון הראשון, ומבקש מכם לחזור מאוחר יותר. תשובת 4xx אינה אומרת שהכתובת אינה תקפה.
  • דומיינים מסוג catch-all — שרתים מסוימים מקבלים כל נמען בתשובת 250 וממיינים זאת מאוחר יותר. אז RCPT TO אינו יכול להוכיח שתיבת דואר ספציפית קיימת. כדי לזהות catch-all‏, נסו כתובת אקראית בבירור: אם גם היא מתקבלת, הדומיין הוא catch-all‏.
  • הגנות נגד ניצול לרעה — שרתים עשויים להשהות, להסתיר את הסטטוס האמיתי, או לחסום בדיקות חוזרות מאותו IP‏. בדקו באדיבות ואל תציפו שרת.
  • VRFY / EXPN‏ מושבתים — אל תסתמכו עליהם; RCPT TO הוא האות המעשי.

רוצים שזה ייעשה אוטומטית, כולל חיפוש MX‏, זיהוי catch-all ופסק דין נקי? השתמשו בבודק האימייל שלנו בדף הבית.