اگر اپلیکیشن شما ایمیل ارسال میکند — تأییدیه ثبتنام، بازیابی رمز عبور، فاکتور، اطلاعرسانی — به تستهای خودکاری نیاز دارید که تأیید کنند آن ایمیلها واقعاً تحویل داده میشوند و محتوای صحیح را دارند. تیمهای زیادی را دیدهایم که تست ایمیل را نادیده میگیرند چون پیچیده به نظر میرسد. اینطور نیست، و این راهنما آن را اثبات خواهد کرد.
مشکل اساسی در تست فرآیندهای ایمیل این است که به صندوقهای ورودی واقعی و قابل دسترسی نیاز دارید که بتوانید بهصورت برنامهنویسی آنها را بخوانید. استفاده از حسابهای شخصی Gmail در پایپلاینهای CI شکننده، ناامن و غیرقابل مقیاس است. دقیقاً اینجاست که APIهای ایمیل یکبارمصرف جایگاه خود را در یک استک تست بالغ پیدا میکنند.
راهاندازی محیط تست ابتدا کلید API خود را از پنل مدیریت EvilMail دریافت کنید. آن را بهعنوان متغیر محیطی در سیستم CI خود ذخیره کنید — هرگز کلیدهای API را در سورسکنترل commit نکنید. ``` export EVILMAIL_API_KEY="your_api_key_here" ```
ایجاد آدرس ایمیل تست قبل از هر اجرای تست، یک ایمیل یکبارمصرف تازه ایجاد کنید: ``` curl -X POST https://evilmail.pro/api/temp-email \ -H 'Content-Type: application/json' \ -H 'X-API-Key: '"$EVILMAIL_API_KEY" \ -d '{"domain": "evilmail.pro", "ttlMinutes": 30}' ```
پاسخ شامل آدرس ایمیل و یک توکن نشست است. از آدرس ایمیل برای ثبتنام یک حساب تست در اپلیکیشن خود استفاده کنید.
بررسی صندوق ورودی پس از فعالسازی یک اقدام ارسال ایمیل در اپلیکیشن (ثبتنام، بازیابی رمز عبور و غیره)، اندپوینت صندوق ورودی را تا رسیدن پیام فراخوانی کنید: ``` curl https://evilmail.pro/api/inbox \ -H 'X-API-Key: '"$EVILMAIL_API_KEY" ```
در یک تست واقعی، این فراخوانی را در یک حلقه retry با timeout قرار میدهید. یک مثال عملی با Python: ``` import requests import time
API_KEY = os.environ['EVILMAIL_API_KEY'] BASE = 'https://evilmail.pro'
def wait_for_email(subject_contains, timeout=60): deadline = time.time() + timeout while time.time() < deadline: r = requests.get(f'{BASE}/api/inbox', headers={'X-API-Key': API_KEY}) messages = r.json().get('data', []) for msg in messages: if subject_contains in msg['subject']: return msg time.sleep(3) raise TimeoutError('Email not received') ```
ادغام با پایپلاینهای CI/CD این الگو با هر سیستم CI بهصورت تمیز کار میکند — GitHub Actions، GitLab CI، Jenkins، CircleCI. اصل کلیدی این است: هر اجرای تست یک آدرس یکبارمصرف منحصربهفرد میگیرد، assertionهای خود را اجرا میکند و آدرس بهصورت خودکار منقضی میشود. بدون اسکریپتهای پاکسازی، بدون صندوقهای ورودی مشترکی که شلوغ میشوند و بدون تستهای شکنندهای که بهخاطر ایمیلهای باقیمانده از اجراهای قبلی خراب میشوند.
یک مرحله از workflow در GitHub Actions ممکن است به این شکل باشد: ``` - name: Run email integration tests env: EVILMAIL_API_KEY: ${'{ secrets.EVILMAIL_API_KEY }'} run: pytest tests/email/ -v --timeout=120 ```
چه چیزهایی را باید Assert کنید فقط بررسی نکنید که ایمیل رسیده است. موضوع، آدرس فرستنده، وجود لینکهای حیاتی (URLهای تأیید، توکنهای بازیابی) و اینکه آن لینکها واقعاً به صفحات معتبر هدایت میشوند را تأیید کنید. یک تست ایمیل کامل، کل زنجیره از trigger تا تحویل تا صحت محتوا را اعتبارسنجی میکند.
مقیاسبندی تا صدها تست برای مجموعههای تست بزرگ که به آدرسهای ایمیل همزمان متعدد نیاز دارند، از اندپوینت ایجاد حساب برای راهاندازی آدرسها زیر دامنه خودتان استفاده کنید. این کار کنترل کامل بر فضای نام را به شما میدهد و از هرگونه محدودیت نرخ روی اندپوینت temp-email جلوگیری میکند: ``` curl -X POST https://evilmail.pro/api/accounts \ -H 'X-API-Key: '"$EVILMAIL_API_KEY" \ -H 'Content-Type: application/json' \ -d '{"email": "[email protected]", "password": "testpass"}' ```
پس از اتمام مجموعه تست، حسابهای تست را بهصورت دستهای حذف کنید: ``` curl -X DELETE https://evilmail.pro/api/accounts \ -H 'X-API-Key: '"$EVILMAIL_API_KEY" \ -H 'Content-Type: application/json' \ -d '{"emails": ["[email protected]"]}' ```
جمعبندی تست ایمیل نباید بخش شکننده و فراموششده مجموعه تستهای شما باشد. با یک API ایمیل یکبارمصرف مناسب، تست ایمیل به اندازه هر تست یکپارچهسازی دیگری قطعی و قابل اتکا میشود. با اطمینان از اینکه ایمیلهایتان واقعاً کار میکنند، محصول خود را منتشر کنید.
