MailSlurp logo

UiPath integration

Documentation navigation
Search documentation

Integrate MailSlurp email and SMS APIs with UiPath Studio

UiPath and MailSlurp integration banner
MailSlurp email and SMS APIs integrate with UiPath to provide messaging and testing automation. Create and control real email accounts and phone numbers from your automations using low-code HTTP requests or the native [C# library](/docs/csharp/).

Please see our UiPath project on GitHub to get started.

How it works

You can integrate programmable email accounts and phone numbers in MailSlurp by invoking the REST API with UiPath's built-in HTTP Request activity.

Calling the MailSlurp API

To create inboxes, read emails, and more, use the HTTP App Integration within UiPath to call api.mailslurp.com endpoints.

Make HTTP requests

NOTE: You must pass a valid x-api-key header set to your MailSlurp API key.

Storing response variables

MailSlurp APIs return JSON data. Use the Assign activity to save variables for use in subsequent steps.

Parse API response

Use Deserialize JSON activity or Regular expressions to extract variables from responses like inbox id, emailAddress and more.

Example testing flow

Say you want to test the user sign-up and verification process in a web application in UiPath. With MailSlurp we can create a test email account, submit it to the web application, receive and extract an OTP code, and confirm a new account. This can form the basis of our automated UiPath test of an application sign-up flow. You can see it in action in the video below:

Open video on YouTube

And here is a diagram of how a test like this might work:

uipath studio test setup

Setup in UiPath Studio

To test email and SMS in UiPath Studio create a workflow with a series of steps. These steps are comprised of HTTP Request actions to the MailSlurp API and Browser automation steps that use the email accounts and phone numbers within automations and tests. An example main.xaml would look like this:

Use email in UiPath

You can combine MailSlurp API actions to create phone numbers and email accounts on demand then send and receive emails, attachments, and SMS within automations and RPA workflows. For more methods see the API endpoints

Important actions

Here are some common actions for creating inboxes, reading emails, and extracting codes. Use the UiPath Studio HTTP Request actions to invoke these MailSlurp endpoints. Make sure you set an x-api-key header with the value of your MailSlurp API Key.

Set header

Create inboxes

To create a new email address use the operation below:

POST /inboxes/withDefaults

Create an inbox with default options. Uses MailSlurp domain pool address and is private.

Request, parameters, and responses

Responses

StatusSchemaDescription
201InboxDtoCreated
HTTP examples

HTTP

HTTP
POST /inboxes/withDefaults HTTP/1.1
Host: api.mailslurp.com
x-api-key: YOUR_API_KEY
Accept: */*

cURL

Requires cURL 7.76+ and a POSIX shell. Tested with cURL 8.12.1.

cURL
(
set -eu
response_file=$(mktemp)
trap 'rm -f "$response_file"' EXIT
status=$(curl --silent --show-error \
  --request POST \
  --url 'https://api.mailslurp.com/inboxes/withDefaults' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Accept: */*' \
  --output "$response_file" \
  --write-out '%{http_code}')
case "$status" in
  2??) mv "$response_file" 'response.bin' ;;
  *) printf 'HTTP %s\n' "$status" >&2; cat "$response_file" >&2; exit 1 ;;
esac
)

JavaScript (HTTP)

Requires Node.js 22+. Tested with Node.js 22.14.0.

JavaScript (HTTP)
import { writeFile } from "node:fs/promises";

const response = await fetch("https://api.mailslurp.com/inboxes/withDefaults", {
  method: "POST",
  headers: {
    "x-api-key": "YOUR_API_KEY",
    "Accept": "*/*"
  },
  redirect: "manual",
  signal: AbortSignal.timeout(60000),
});
const responseBytes = Buffer.from(await response.arrayBuffer());
if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${responseBytes.toString("utf8")}`);
}
await writeFile("response.bin", responseBytes);

Python (HTTP)

Requires Python 3.9+. Tested with Python 3.9.21.

Python (HTTP)
import http.client
from pathlib import Path
from urllib.parse import urlsplit

url = urlsplit("https://api.mailslurp.com/inboxes/withDefaults")
headers = {
    "x-api-key": "YOUR_API_KEY",
    "Accept": "*/*"
}
connection_class = http.client.HTTPSConnection if url.scheme == "https" else http.client.HTTPConnection
connection = connection_class(url.hostname, url.port, timeout=60)
try:
    path = (url.path or "/") + ("?" + url.query if url.query else "")
    connection.request("POST", path, headers=headers)
    response = connection.getresponse()
    response_bytes = response.read()
    if not 200 <= response.status < 300:
        raise RuntimeError(f"HTTP {response.status}: {response_bytes.decode('utf-8', errors='replace')}")
    Path("response.bin").write_bytes(response_bytes)
finally:
    connection.close()

To save the inbox id and emailAddress for use in further steps use the UiPath Regex extract action to pluck these values from the JSON response.

Regex extract variables

Wait for email

To wait for emails in your tests, use the waitForLatestEmail MailSlurp endpoint.

GET /waitForLatestEmail

Fetch inbox's latest email or if empty wait for an email to arrive

Will return either the last received email or wait for an email to arrive and return that. If you need to wait for an email for a non-empty inbox set `unreadOnly=true` or see the other receive methods such as `waitForNthEmail` or `waitForEmailCount`.

Request, parameters, and responses

Query parameters

NameTypeRequiredDescription
inboxIdstring:uuidNoId of the inbox we are fetching emails from
timeoutinteger:int64NoMax milliseconds to wait
unreadOnlybooleanNoOptional filter for unread only.
beforestring:date-timeNoFilter for emails that were before after the given timestamp
sincestring:date-timeNoFilter for emails that were received after the given timestamp
sortenum: ASC | DESCNoSort directionValues: ASC, DESC
delayinteger:int64NoMax milliseconds delay between calls

Responses

StatusSchemaDescription
200EmailOK
HTTP examples

HTTP

HTTP
GET /waitForLatestEmail HTTP/1.1
Host: api.mailslurp.com
x-api-key: YOUR_API_KEY
Accept: */*

cURL

Requires cURL 7.76+ and a POSIX shell. Tested with cURL 8.12.1.

cURL
(
set -eu
response_file=$(mktemp)
trap 'rm -f "$response_file"' EXIT
status=$(curl --silent --show-error \
  --request GET \
  --url 'https://api.mailslurp.com/waitForLatestEmail' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Accept: */*' \
  --output "$response_file" \
  --write-out '%{http_code}')
case "$status" in
  2??) mv "$response_file" 'response.bin' ;;
  *) printf 'HTTP %s\n' "$status" >&2; cat "$response_file" >&2; exit 1 ;;
esac
)

JavaScript (HTTP)

Requires Node.js 22+. Tested with Node.js 22.14.0.

JavaScript (HTTP)
import { writeFile } from "node:fs/promises";

const response = await fetch("https://api.mailslurp.com/waitForLatestEmail", {
  method: "GET",
  headers: {
    "x-api-key": "YOUR_API_KEY",
    "Accept": "*/*"
  },
  redirect: "manual",
  signal: AbortSignal.timeout(60000),
});
const responseBytes = Buffer.from(await response.arrayBuffer());
if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${responseBytes.toString("utf8")}`);
}
await writeFile("response.bin", responseBytes);

Python (HTTP)

Requires Python 3.9+. Tested with Python 3.9.21.

Python (HTTP)
import http.client
from pathlib import Path
from urllib.parse import urlsplit

url = urlsplit("https://api.mailslurp.com/waitForLatestEmail")
headers = {
    "x-api-key": "YOUR_API_KEY",
    "Accept": "*/*"
}
connection_class = http.client.HTTPSConnection if url.scheme == "https" else http.client.HTTPConnection
connection = connection_class(url.hostname, url.port, timeout=60)
try:
    path = (url.path or "/") + ("?" + url.query if url.query else "")
    connection.request("GET", path, headers=headers)
    response = connection.getresponse()
    response_bytes = response.read()
    if not 200 <= response.status < 300:
        raise RuntimeError(f"HTTP {response.status}: {response_bytes.decode('utf-8', errors='replace')}")
    Path("response.bin").write_bytes(response_bytes)
finally:
    connection.close()

In UiPath Studio this request looks like this:

Http request

Extract content

You can extract content from emails and SMS using regular expression patterns by passing them to the MailSlurp API with HTTP.

POST /emails/{emailId}/contentMatch

Run regex against hydrated email body and return matches

Executes a Java regex pattern over hydrated email body text and returns the full match plus capture groups. Pattern syntax follows Java `Pattern` rules.

Request, parameters, and responses

Path parameters

NameTypeRequiredDescription
emailIdstring:uuidYesID of email to match against

Request body (required)

ContentMatchOptions application/json
FieldTypeRequiredDescription
patternstringYesJava style regex pattern. Do not include the typical `/` at start or end of regex in some languages. Given an example `your code is: 12345` the pattern to extract match looks like `code is: (\d{6})`. This will return an array of matches with the first matching the entire pattern and the subsequent matching the groups: `['code is: 123456', '123456']` See https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html for more information of available patterns.
Request example
{
  "pattern": "value"
}

Responses

StatusSchemaDescription
200EmailContentMatchResultOK
HTTP examples

HTTP

HTTP
POST /emails/00000000-0000-4000-8000-000000000000/contentMatch HTTP/1.1
Host: api.mailslurp.com
x-api-key: YOUR_API_KEY
Content-Type: application/json
Accept: */*

{
  "pattern": "value"
}

cURL

Requires cURL 7.76+ and a POSIX shell. Tested with cURL 8.12.1.

cURL
(
set -eu
response_file=$(mktemp)
request_body=$(mktemp)
trap 'rm -f "$response_file" "$request_body"' EXIT
{
  printf '%b' '{\0012  "pattern": "value"\0012}'
} > "$request_body"
status=$(curl --silent --show-error \
  --request POST \
  --url 'https://api.mailslurp.com/emails/00000000-0000-4000-8000-000000000000/contentMatch' \
  --header 'x-api-key: YOUR_API_KEY' \
  --header 'Content-Type: application/json' \
  --header 'Accept: */*' \
  --output "$response_file" \
  --write-out '%{http_code}' \
  --data-binary "@$request_body")
case "$status" in
  2??) mv "$response_file" 'response.bin' ;;
  *) printf 'HTTP %s\n' "$status" >&2; cat "$response_file" >&2; exit 1 ;;
esac
)

JavaScript (HTTP)

Requires Node.js 22+. Tested with Node.js 22.14.0.

JavaScript (HTTP)
import { writeFile } from "node:fs/promises";

const body = Buffer.concat([
  Buffer.from("{\n  \"pattern\": \"value\"\n}", "utf8")
]);

const response = await fetch("https://api.mailslurp.com/emails/00000000-0000-4000-8000-000000000000/contentMatch", {
  method: "POST",
  headers: {
    "x-api-key": "YOUR_API_KEY",
    "Content-Type": "application/json",
    "Accept": "*/*"
  },
  body,
  redirect: "manual",
  signal: AbortSignal.timeout(60000),
});
const responseBytes = Buffer.from(await response.arrayBuffer());
if (!response.ok) {
  throw new Error(`HTTP ${response.status}: ${responseBytes.toString("utf8")}`);
}
await writeFile("response.bin", responseBytes);

Python (HTTP)

Requires Python 3.9+. Tested with Python 3.9.21.

Python (HTTP)
import http.client
from pathlib import Path
from urllib.parse import urlsplit

url = urlsplit("https://api.mailslurp.com/emails/00000000-0000-4000-8000-000000000000/contentMatch")
headers = {
    "x-api-key": "YOUR_API_KEY",
    "Content-Type": "application/json",
    "Accept": "*/*"
}
body = b"".join([
    "{\n  \"pattern\": \"value\"\n}".encode("utf-8")
])
connection_class = http.client.HTTPSConnection if url.scheme == "https" else http.client.HTTPConnection
connection = connection_class(url.hostname, url.port, timeout=60)
try:
    path = (url.path or "/") + ("?" + url.query if url.query else "")
    connection.request("POST", path, body=body, headers=headers)
    response = connection.getresponse()
    response_bytes = response.read()
    if not 200 <= response.status < 300:
        raise RuntimeError(f"HTTP {response.status}: {response_bytes.decode('utf-8', errors='replace')}")
    Path("response.bin").write_bytes(response_bytes)
finally:
    connection.close()