PageSourceSearch

https://docs-production-katalon.netlify.app/assets/js/dd2b0923.1ffe0310.js

js docs-production-katalon.netlify.app collected 2026-10-03 10:43:46 UTC 10,550 bytes, 1 lines download raw bytes

1"use strict";(self.webpackChunkKatalon_Docs=self.webpackChunkKatalon_Docs||[]).push([[14763],{18275:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>a,contentTitle:()=>l,default:()=>c,frontMatter:()=>o,metadata:()=>s,toc:()=>d});const s=JSON.parse('{"id":"resolve-email-otp-in-ai-runs","title":"Resolve email OTP in AI runs","description":"This document explains how to register a MailSlurp inbox in Katalon True Platform so Run with AI can retrieve a one-time passcode (OTP) during a login step.","source":"@site/docs/katalon-platform/resolve-email-otp-in-ai-runs.md","sourceDirName":".","slug":"/resolve-email-otp-in-ai-runs","permalink":"/katalon-platform/resolve-email-otp-in-ai-runs","draft":false,"unlisted":false,"tags":[],"version":"current","lastUpdatedAt":1789644020000,"frontMatter":{"title":"Resolve email OTP in AI runs"},"sidebar":"katalon-platform","previous":{"title":"AI knowledge base","permalink":"/katalon-platform/ai-knowledge-base"},"next":{"title":"Katalon True Platform MCP Server","permalink":"/katalon-platform/testops-mcp-server"}}');var r=t(74848),i=t(28453);const o={title:"Resolve email OTP in AI runs"},l=void 0,a={},d=[{value:"Overview",id:"overview",level:2},{value:"Set up email OTP handling",id:"set-up-email-otp-handling",level:2},{value:"Name the inbox in the test step",id:"name-the-inbox-in-the-test-step",level:2},{value:"Concurrency",id:"concurrency",level:2},{value:"What is not supported",id:"what-is-not-supported",level:2},{value:"Troubleshooting",id:"troubleshooting",level:2}];function h(e){const n={admonition:"admonition",code:"code",em:"em",h2:"h2",li:"li",ol:"ol",p:"p",strong:"strong",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["This document explains how to register a ",(0,r.jsx)(n.strong,{children:"MailSlurp inbox"})," in ",(0,r.jsx)(n.strong,{children:"Katalon True Platform"})," so ",(0,r.jsx)(n.strong,{children:"Run with AI"})," can retrieve a one-time passcode (OTP) during a login step."]}),"\n",(0,r.jsx)(n.h2,{id:"overview",children:"Overview"}),"\n",(0,r.jsxs)(n.p,{children:["When an application emails a verification code during login, the code is not available until the run requests it. Registering a MailSlurp inbox lets you write a step such as ",(0,r.jsx)(n.em,{children:'"Enter the OTP from payroll inbox."'})," and have the runner retrieve the latest code during the run."]}),"\n",(0,r.jsx)(n.p,{children:"The code is read at run time and typed into the application. It is redacted from test data, results, logs, run history, and API or MCP responses."}),"\n",(0,r.jsx)(n.p,{children:"The setup has two parts: register the inbox as a secret, then name it in the test step."}),"\n",(0,r.jsx)(n.admonition,{title:"Requirements",type:"info",children:(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:["A ",(0,r.jsx)(n.strong,{children:"MailSlurp"})," account, with an inbox and its API key. Katalon does not host or provision the mailbox."]}),"\n",(0,r.jsxs)(n.li,{children:["Permission to manage ",(0,r.jsx)(n.strong,{children:"Secrets & Variables"})," on the project."]}),"\n",(0,r.jsx)(n.li,{children:"A cloud-hosted execution environment. Secrets are not supported on self-hosted environments."}),"\n"]})}),"\n",(0,r.jsx)(n.h2,{id:"set-up-email-otp-handling",children:"Set up email OTP handling"}),"\n",(0,r.jsx)(n.p,{children:"The inbox is stored as a secret, alongside the project's other secrets and variables."}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["Go to ",(0,r.jsx)(n.strong,{children:"Settings > Configurations > SECRETS & VARIABLES"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Select ",(0,r.jsx)(n.strong,{children:"Add secret / variable"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:["Leave ",(0,r.jsx)(n.strong,{children:"Type"})," set to ",(0,r.jsx)(n.strong,{children:"Secret"}),", then select ",(0,r.jsx)(n.strong,{children:"MailSlurp Inbox"})," as the secret type."]}),"\n",(0,r.jsxs)(n.li,{children:["Enter the inbox details and select ",(0,r.jsx)(n.strong,{children:"Add MailSlurp inbox"}),".","\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Inbox name"}),": The name you will use in test steps, for example ",(0,r.jsx)(n.code,{children:"payroll"}),". Choose something you can write naturally in a sentence."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Inbox UUID"}),": The MailSlurp inbox identifier, in the form ",(0,r.jsx)(n.code,{children:"00000000-0000-0000-0000-000000000000"})]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"API key"}),": Your MailSlurp API key. It is write-only. Once saved it is never rendered back in the UI, an API response, or an MCP response."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.strong,{children:"Email address"}),": The inbox's address, for example ",(0,r.jsx)(n.code,{children:"[email protected]"})]}),"\n"]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Secrets are saved at the ",(0,r.jsx)(n.strong,{children:"project"})," level."]}),"\n",(0,r.jsx)(n.p,{children:"Refer to this interactive walkthrough to see the complete setup:"}),"\n",(0,r.jsx)("div",{style:{display:"flex",justifyContent:"center"},children:(0,r.jsx)("iframe",{src:"https://demo.arcade.software/VWzgeQZ4CcHbeS9cqVJO?embed&embed_mobile=tab&embed_desktop=inline&show_copy_link=true",title:"Register a MailSlurp inbox for email OTP",frameborder:"0",loading:"lazy",webkitallowfullscreen:!0,mozallowfullscreen:!0,allowfullscreen:"true",allow:"clipboard-write",style:{width:"100%",height:"500px",border:"none"}})}),"\n",(0,r.jsx)(n.h2,{id:"name-the-inbox-in-the-test-step",children:"Name the inbox in the test step"}),"\n",(0,r.jsxs)(n.ol,{children:["\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["In your test step, refer to the inbox by the exact ",(0,r.jsx)(n.strong,{children:"Inbox name"})," you registered. For example:"]}),"\n",(0,r.jsx)(n.p,{children:(0,r.jsx)(n.code,{children:"Enter the OTP from payroll inbox into the verification code field."})}),"\n"]}),"\n",(0,r.jsxs)(n.li,{children:["\n",(0,r.jsxs)(n.p,{children:["Run the test with ",(0,r.jsx)(n.strong,{children:"Run with AI"}),". The runner retrieves a new code when it reaches the step."]}),"\n"]}),"\n"]}),"\n",(0,r.jsxs)(n.p,{children:["Only messages that arrive ",(0,r.jsx)(n.strong,{children:"after the step begins"})," are eligible. A code left over from an earlier run cannot satisfy the step."]}),"\n",(0,r.jsx)(n.admonition,{title:"The step must name a configured inbox",type:"caution",children:(0,r.jsx)(n.p,{children:"If a step asks for a verification code without naming a registered inbox, it will not work. The runner may type a placeholder value, and the step may appear to pass. Always use the inbox name exactly as registered."})}),"\n",(0,r.jsx)(n.p,{children:"Renaming or replacing an inbox breaks steps that use its old name. Update those steps when you make the change."}),"\n",(0,r.jsxs)(n.p,{children:["In the run report, the OTP step's ",(0,r.jsx)(n.strong,{children:"actual result"})," is shown as ",(0,r.jsx)(n.code,{children:"--"}),". This is expected: the code is redacted."]}),"\n",(0,r.jsx)(n.h2,{id:"concurrency",children:"Concurrency"}),"\n",(0,r.jsxs)(n.p,{children:["Two runs sharing one inbox can consume each other's codes, because each run takes the newest matching message. Give concurrent runs ",(0,r.jsx)(n.strong,{children:"distinct inboxes and distinct test data"}),", or serialize them."]}),"\n",(0,r.jsx)(n.h2,{id:"what-is-not-supported",children:"What is not supported"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Not supported"}),(0,r.jsx)(n.th,{children:"Use instead"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"SMS or phone-delivered codes"}),(0,r.jsx)(n.td,{children:"No alternative"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"TOTP or authenticator-app codes"}),(0,r.jsx)(n.td,{children:"No alternative"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"A Katalon-hosted or Katalon-provisioned inbox"}),(0,r.jsx)(n.td,{children:"Bring your own MailSlurp inbox"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Account-level or cross-project inbox configuration"}),(0,r.jsx)(n.td,{children:"Register the inbox per project"})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"CAPTCHA and other human-verification challenges"}),(0,r.jsx)(n.td,{children:"No alternative"})]})]})]}),"\n",(0,r.jsx)(n.h2,{id:"troubleshooting",children:"Troubleshooting"}),"\n",(0,r.jsxs)(n.table,{children:[(0,r.jsx)(n.thead,{children:(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.th,{children:"Symptom"}),(0,r.jsx)(n.th,{children:"Cause and fix"})]})}),(0,r.jsxs)(n.tbody,{children:[(0,r.jsxs)(n.tr,{children:[(0,r.jsxs)(n.td,{children:["The runner types a placeholder such as ",(0,r.jsx)(n.code,{children:"00000"})," or ",(0,r.jsx)(n.code,{children:"123456"})]}),(0,r.jsxs)(n.td,{children:["The step did not resolve to a registered inbox. Check that the step names the inbox exactly as it appears in ",(0,r.jsx)(n.strong,{children:"Secrets & Variables"}),"."]})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"The step fails after waiting"}),(0,r.jsx)(n.td,{children:"No eligible message arrived while the step was running. Confirm the application actually sent to the registered address, and that the inbox is the one the application targets."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"The step worked yesterday and fails now"}),(0,r.jsx)(n.td,{children:"The inbox was renamed or replaced. Steps bind by name, so update every step that referenced the old name."})]}),(0,r.jsxs)(n.tr,{children:[(0,r.jsx)(n.td,{children:"Codes are intermittently wrong under load"}),(0,r.jsx)(n.td,{children:"Concurrent runs are sharing one inbox. Give each run its own inbox, or serialize the runs."})]})]})]})]})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},28453:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>l});var s=t(96540);const r={},i=s.createContext(r);function o(e){const n=s.useContext(i);return s.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),s.createElement(i.Provider,{value:n},e.children)}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.