---
title: "Playwright ईमेल OTP टेस्ट: अपने इनबॉक्स से सही कोड पढ़ें"
description: "अपने Gmail या Outlook इनबॉक्स से Playwright ईमेल OTP टेस्ट चलाएँ। सीमित polling, पुराने कोड की पहचान और CI में key व OTP की सुरक्षा समझें।"
url: https://mailera.app/hi/blog/playwright-email-otp-test
published: 2026-10-25
updated: 2026-10-25
---

# Playwright ईमेल OTP टेस्ट: अपने इनबॉक्स से सही कोड पढ़ें

अपने Gmail या Outlook मेलबॉक्स में आया OTP पढ़कर लॉगिन टेस्ट पूरा करें। प्रतीक्षा की समय-सीमा रखें और कोड भरने से पहले उसे उसी लॉगिन अनुरोध से मिलाएँ।

ईमेल OTP टेस्ट में आपका ऐप कोड भेजता है और टेस्ट उसी ईमेल से कोड पढ़ता है। यह TOTP बनाने की प्रक्रिया से अलग है। [Mailera मौजूदा मेलबॉक्स को REST API से जोड़ता है](https://mailera.app/hi/product); सामान्य प्रक्रिया के लिए [अपने इनबॉक्स से OTP पढ़ने की गाइड](https://mailera.app/hi/blog/email-otp-api) देखें।

## शुरू करने से पहले क्या चाहिए?

आपके पास अपना परीक्षण ऐप, अपने नियंत्रण वाला मेलबॉक्स और Playwright वाला Node.js/TypeScript प्रोजेक्ट होना चाहिए। वास्तविक उपयोगकर्ताओं के खातों पर यह उदाहरण न चलाएँ।

1. **मेलबॉक्स जोड़ें।** **मेलबॉक्स → मेलबॉक्स जोड़ें** खोलें। इसके लिए Admin या Leader भूमिका चाहिए। Outlook और Microsoft 365 में **Microsoft से साइन इन करें** वाला OAuth मार्ग अपनाएँ। [Microsoft कनेक्शन पेज](https://mailera.app/hi/providers/microsoft) में पूरा तरीका है; app password की समस्या हो तो [Outlook में OAuth अपनाने की गाइड](https://mailera.app/hi/blog/outlook-app-password-not-working) देखें।
2. **Gmail का सही कनेक्शन चुनें।** Mailera में Gmail के लिए ऐप पासवर्ड (app password) इस्तेमाल होता है। Google के अनुसार इसके लिए [दो-चरणीय सत्यापन चालू होना चाहिए](https://support.google.com/accounts/answer/185833)। [Gmail कनेक्शन पेज](https://mailera.app/hi/providers/gmail) और [ऐप पासवर्ड की गाइड](https://mailera.app/hi/blog/email-app-password-oauth) में संबंधित जानकारी है।
3. **कनेक्शन और पहचानकर्ता जाँचें।** `GET /mailboxes` की `data` सूची में अपना परीक्षण ईमेल पता खोजें और उसके `id`, `status` तथा `last_sync_at` देखें। सूची का पहला मेलबॉक्स अपने आप न चुनें।
4. **सीमित key बनाएँ।** **सेटिंग्स** के API key भाग में **API key बनाएँ** चुनें। **मेलबॉक्स का दायरा** केवल परीक्षण समूह तक रखें और `read` अनुमति चुनें। इस प्रक्रिया में `send`, `move` या `sync` की जरूरत नहीं है।

![परीक्षण मेलबॉक्स का प्रदाता, स्थिति और अंतिम सिंक दिखाती Mailera सूची](https://mailera.app/media/d99b10eacb71a625/verification-email-in-spam-find-it-and-recover-it-safely-vi-1200.jpg)
_OTP अनुरोध भेजने से पहले सही मेलबॉक्स और उसका कनेक्शन देखें।_

नई key केवल एक बार दिखाई जाती है। उसे CI के सुरक्षित चर `MAILERA_API_KEY` में रखें और मेलबॉक्स पहचानकर्ता `MAILBOX_ID` में। **समाप्ति** भी अपने परीक्षण काम के अनुसार चुनें। ऐप का URL अलग परीक्षण कॉन्फ़िगरेशन में रखें, Mailera API base में नहीं।

![परीक्षण समूह और पढ़ने की अनुमति तक सीमित API key की सेटिंग](https://mailera.app/media/c50716a197a937cc/playwright-otp-read-key-hi-1200.jpg)
_OTP पढ़ने के लिए संदेश भेजने या स्थानांतरित करने की अनुमति न दें।_

## Playwright से नया OTP कैसे मँगाएँ और पढ़ें?

अनुरोध से ठीक पहले टेस्ट का समय दर्ज करें। न्यूनतम सेटअप में इस मेलबॉक्स पर एक ही सक्रिय OTP अनुरोध रखें। यदि आपका परीक्षण ऐप अनुमति देता है, तो हर अनुरोध के ईमेल subject में अलग पहचान जोड़ें। यही पहचान पुराने ईमेल से इस अनुरोध को अलग करेगी।

Mailera में `GET /mailboxes/{id}/otp` नवीनतम OTP लेने के लिए है और इसे `read` अनुमति चाहिए। इसके फ़िल्टर हैं:

| पैरामीटर | किस काम के लिए है | क्या अलग से जाँचना है |
| --- | --- | --- |
| `from` | प्रेषक से खोज सीमित करना | सही परीक्षण ऐप का प्रेषक |
| `subject` | विषय से खोज सीमित करना | मौजूदा अनुरोध की पहचान |
| `since_minutes` | हाल की अवधि चुनना | कोड इसी अनुरोध का है या नहीं |

नीचे का उदाहरण `GET /messages/search` के साथ `extract=otp` इस्तेमाल करता है। इससे OTP के साथ उसी संदेश का `mailbox_id`, `from`, `subject` और `received_at` मिलते हैं। कोड और संदेश का संबंध एक ही परिणाम में जाँचा जा सकता है। [डेवलपर पेज](https://mailera.app/hi/developers) API का परिचय देता है और [API दस्तावेज़](https://mailera.app/hi/docs) में endpoint संदर्भ है।

### 1. API helper की तैयारी करें

इन तीन TypeScript खंडों को क्रम से `email-otp.ts` में रखें। key और मेलबॉक्स पहचानकर्ता वातावरण से आते हैं; किसी असली पते या OTP को कोड में लिखने की जरूरत नहीं है।

```ts
import { expect, type APIRequestContext, type Locator } from '@playwright/test';
type OtpMail = {
  mailbox_id: string; from: { address: string }; subject: string;
  received_at: string; otp?: { code?: string };
};
type OtpPage = { data: OtpMail[]; next_cursor?: string | null };
const base = 'https://mailera.app/api/public/v1';
const key = process.env.MAILERA_API_KEY;
const mailbox = process.env.MAILBOX_ID;
if (!key || !mailbox) throw new Error('Mailera configuration missing');
```

### 2. एक पेज पढ़ने वाला फ़ंक्शन जोड़ें

Playwright का `APIRequestContext` API अनुरोध भेजता है। header का रूप `Authorization: Bearer $MAILERA_API_KEY` है। यहाँ `timeout` हर अनुरोध को सीमित करता है। HTTP अनुरोध विफल होने पर कोड रुक जाता है; इसे खाली इनबॉक्स नहीं मानता।

```ts
async function readPage(
  request: APIRequestContext, sender: string, cursor: string, timeout: number
): Promise<OtpPage> {
  const response = await request.get(`${base}/messages/search`, {
    headers: { Authorization: `Bearer ${key}` }, timeout,
    params: { mailbox: mailbox!, from: sender, extract: 'otp', limit: 50,
      ...(cursor ? { cursor } : {}) }
  }).catch(() => { throw new Error('Mailera request failed'); });
  if (!response.ok()) throw new Error(`Mailera HTTP ${response.status()}`);
  try { return await response.json() as OtpPage; }
  catch { throw new Error('Mailera response could not be read'); }
}
```

### 3. संबंधित नया कोड मिलने तक जाँचें

यहाँ कुल प्रतीक्षा 60 सेकंड, प्रत्येक अनुरोध की सीमा अधिकतम 5 सेकंड और जाँचों के बीच अंतराल 2 सेकंड चुना गया है। ये उदाहरण की सेटिंग हैं, ईमेल पहुँचने का वादा नहीं। अपने ऐप की OTP अवधि और CI के अनुसार इन्हें तय करें।

```ts
async function waitForOtp(request: APIRequestContext, sender: string,
  subject: string, startedAt: number, waitMs = 60_000): Promise<string> {
  const deadline = startedAt + waitMs;
  let cursor = '';
  while (Date.now() < deadline) {
    const result = await readPage(request, sender, cursor,
      Math.max(1, Math.min(5_000, deadline - Date.now())));
    const match = result.data.find(m => m.mailbox_id === mailbox &&
      m.from.address === sender && m.subject === subject &&
      Date.parse(m.received_at) >= startedAt && typeof m.otp?.code === 'string' && m.otp.code.length > 0);
    if (match && Date.now() < deadline) return match.otp!.code!;
    cursor = result.next_cursor || '';
    await new Promise(resolve => setTimeout(resolve, Math.max(0, Math.min(2_000, deadline - Date.now()))));
  }
  throw new Error('OTP deadline exceeded');
}
```

Helper परिणामों के अगले पेज भी पढ़ता है। पेज समाप्त होने पर अगली जाँच फिर शुरुआत से होती है। वह केवल सबसे ऊपर दिखा कोड लौटाने के बजाय अपेक्षित subject और प्रेषक का मिलान करता है।

### 4. अपने ऐप के वास्तविक locators जोड़ें

उसी फ़ाइल में यह फ़ंक्शन जोड़ें। इसे बुलाने से पहले परीक्षण ऐप खोलें और परीक्षण ईमेल पता भरें। `ui` में अपने ऐप के वास्तविक locators दें: OTP मँगाने का बटन, कोड का फ़ील्ड, पुष्टि का बटन और लॉगिन के बाद दिखने वाला संकेत।

```ts
export async function loginWithEmailOtp(
  request: APIRequestContext,
  ui: { send: Locator; otp: Locator; verify: Locator; signedIn: Locator },
  sender: string, requestSubject: string
) {
  await expect(ui.signedIn).not.toBeVisible();
  const startedAt = Date.now();
  await ui.send.click();
  const code = await waitForOtp(request, sender, requestSubject, startedAt);
  await ui.otp.fill(code);
  await ui.verify.click();
  await expect(ui.signedIn).toBeVisible();
}
```

`requestSubject` वह पूरा, अलग subject होना चाहिए जिसे आपका परीक्षण ऐप इस अनुरोध के ईमेल में भेजता है। केवल helper को अलग string देने से ईमेल का subject नहीं बदलता। बाहरी Playwright टेस्ट की समय-सीमा तय करते समय API की प्रतीक्षा और UI चरणों, दोनों का समय जोड़ें।

![Playwright OTP अनुरोध से मेलबॉक्स और API जाँच होकर सफल लॉगिन या समय-सीमा विफलता का प्रवाह](https://mailera.app/media/c20d5be724a05ece/playwright-otp-otp-flow-hi-1200.jpg)
_सफलता का रास्ता सिर्फ कोड मिलने से नहीं, सही अनुरोध से मिलान होने पर खुलता है।_

## ईमेल आने तक कैसे रुकें, बिना पुराना OTP उठाए?

एक लंबा `sleep()` सही कोड की पहचान नहीं करता। ऊपर का लूप हर बार परिणाम जाँचता है और समय खत्म होने पर स्पष्ट विफलता देता है। UI के तैयार होने की प्रतीक्षा से अलग, ईमेल के लिए यह जाँच रखें।

`since_minutes` हाल की अवधि चुनने में मदद करता है, लेकिन एक ही अवधि में पुराने और नए अनुरोध के ईमेल हो सकते हैं। इसलिए उदाहरण में subject को इस अनुरोध की पहचान बनाया गया है और `received_at` की तुलना अनुरोध से पहले दर्ज समय से की गई है।

यदि ऐप अलग subject नहीं भेज सकता, तो इस helper को स्थिर subject देकर समान सुरक्षा मानकर न चलें। एक सक्रिय अनुरोध तक सीमित रहें और अपने ऐप में अनुरोध तथा संदेश के बीच स्पष्ट संबंध तय करें। अनुरोध से पहले मौजूद संदेशों के `id` याद रखना उपयोगी अतिरिक्त जाँच है, लेकिन देर से आया पुराने अनुरोध का संदेश फिर भी नया दिखाई दे सकता है।

संदेशों की जाँच के लिए `GET /mailboxes/{id}/messages` में `from` और `since` जैसे फ़िल्टर उपलब्ध हैं। सूची में `id`, `received_at` और `subject` देखें; जरूरत हो तो `GET /mailboxes/{id}/messages/{msgId}` से उसी संदेश की सामग्री पढ़ें। सबसे नया संदेश मिलना अकेले पर्याप्त नहीं है।

समय खत्म होने पर टेस्ट विफल करें। उसी लूप में बार-बार नया OTP मँगाकर समस्या न छिपाएँ। दोबारा मँगाने का व्यवहार जाँचना हो तो उसे अलग टेस्ट बनाएँ।

## आम गलतियाँ: OTP न मिले या लॉगिन विफल हो तो क्या जाँचें?

| समस्या | पहले क्या देखें | अगला कदम |
| --- | --- | --- |
| गलत मेलबॉक्स | `MAILBOX_ID` और चुना परीक्षण पता | मेलबॉक्स सूची से पहचानकर्ता मिलाएँ |
| फ़िल्टर नहीं मिल रहा | असली प्रेषक और पूरा subject | ऐप के भेजे ईमेल के अनुसार अपेक्षित मान ठीक करें |
| पुराना OTP मिला | अनुरोध की पहचान और `received_at` | केवल नवीनतम परिणाम चुनने वाला तर्क हटाएँ |
| कोड स्वीकार नहीं हुआ | ऐप की OTP अवधि और दोबारा मँगाने का व्यवहार | उसी अनुरोध की समयरेखा देखें |
| कनेक्शन टूटा | मेलबॉक्स स्थिति और अंतिम सिंक | प्रदाता का कनेक्शन ठीक करें |
| ईमेल Junk में है | संबंधित संदेश की जगह | placement जाँचें; अपने आप संदेश न खिसकाएँ |
| API पढ़ नहीं पा रहा | key का दायरा और `read` अनुमति | अनुमति ठीक करें; लगातार retry न करें |

`GET /mailboxes/{id}/placement` से Inbox या Spam में पहुँचने की जाँच कर सकते हैं। इसमें `from`, `subject` और `since_minutes` फ़िल्टर हैं। इसके परिणाम से यह न मान लें कि OTP खोज किन फ़ोल्डरों में होती है; संबंधित संदेश की जगह देखें।

`GET /mailboxes/{id}/status` Microsoft का sign-in सीधे जाँचता है। अन्य प्रदाताओं की स्थिति अंतिम सिंक पर आधारित होती है। मेलबॉक्स विवरण में `last_sync_at` और `sync.state` भी देखें। Gmail का Google Account पासवर्ड हाल में बदला हो तो [Google ऐप पासवर्ड रद्द कर देता है](https://support.google.com/accounts/answer/185833)।

निष्क्रिय मेलबॉक्स स्लीप मोड में जा सकते हैं। जरूरत हो तो अलग निदान के तौर पर `POST /mailboxes/{id}/sync` चलाएँ; यह सिंक शुरू करता है और सोए मेलबॉक्स को जगाता है। इसके लिए `sync` अनुमति चाहिए, इसलिए ऊपर की read-only key से इसे न चलाएँ।

उदाहरण HTTP विफलता पर रुकता है। अनुरोध सीमा या अस्थायी सेवा विफलता के लिए retry जोड़ें तो उसे कुल समय-सीमा के अंदर रखें। अनुमति की स्थायी समस्या को बार-बार अनुरोध भेजकर ठीक करने की कोशिश न करें। Mailera किसी प्रदाता से प्रेषक पर भरोसा नहीं करवा सकता और Inbox placement की गारंटी नहीं देता।

## CI में key, OTP और लॉगिन सत्र सुरक्षित कैसे रखें?

key केवल परीक्षण समूह तक सीमित रखें। उसे स्रोत कोड या ब्राउज़र पेज में न डालें। Mailera की [सुरक्षा संबंधी जानकारी](https://mailera.app/hi/security) देखें और अपने CI में secrets और बिल्ड आर्टिफ़ैक्ट तक पहुँच भी तय करें।

GitHub Actions इस्तेमाल करते हैं तो `MAILERA_API_KEY` को secret के रूप में सहेजें और `secrets` context से वातावरण के चर में दें; [GitHub की secrets इस्तेमाल करने की गाइड](https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets) में इसका तरीका है।

वास्तविक OTP, पूरी API प्रतिक्रिया या ईमेल सामग्री लॉग न करें। विफलता में इतना लिखना पर्याप्त है कि समय-सीमा खत्म हुई, API अनुरोध विफल हुआ या लॉगिन assertion नहीं मिला। निदान के नाम पर पूरा response छापना जरूरी नहीं है।

जाँचें कि स्क्रीनशॉट, वीडियो, trace, नेटवर्क रिकॉर्ड और रिपोर्ट में कोड, `Authorization` header या सत्र डेटा दिखाई तो नहीं दे रहा है। केवल CI लॉग masking पर निर्भर न रहें। संवेदनशील चरणों की रिकॉर्डिंग बंद रखें, या उन्हें सहेजने से पहले साफ़ करने की व्यवस्था करें। यह भी तय करें कि उन्हें कौन देख सकता है और कितने समय तक रखा जाएगा।

सहेजी हुई प्रमाणीकरण स्थिति को भी secret की तरह रखें और रिपॉज़िटरी में न जोड़ें। OTP प्रवाह जाँचने वाले टेस्ट में वास्तविक लॉगिन रखें; दूसरे टेस्टों के लिए सत्र का पुनः उपयोग चुनें तो उसका संग्रह अलग और सुरक्षित रखें। key उजागर हो जाए तो उसे रद्द करें; रद्द key के अनुरोध तुरंत अस्वीकार होते हैं।

**यह काम API से करें** — इस लेख की हर कार्रवाई REST API के ज़रिए उपलब्ध है, साथ में curl के उदाहरण, API key और webhook भी हैं। [API दस्तावेज़ देखें](https://mailera.app/hi/docs)
