Preview: SendMock has no stable release yet. These docs follow develop.
SendMock
DeeperMail

Inbox in depth

Every control and text of Mail > Inbox, an open email and its dialogs.

Every control and text this screen shows, in screen order. The list is read from the demo by a crawl, and CI fails when the screen changes without its entry here.

Mail > Inbox lists every email SendMock caught, whatever the recipient, and shows the one you open beside the list.

The screen as a whole: Inbox.

Inbox, with a number on each control

The numbers match the entries below. The picture shows the first screenful; controls further down, and texts, have no marker.

On the screen

1. Mail

Heading.

  • What it does: Names the open screen in the header.

2. Read the Mail guide

Link.

  • What it does: Opens this screen's page in the user guide, in a new tab.
  • Links to: Inbox.

3. Search emails

Field.

  • What it does: Filters the list as you type. Free text is a full-text search of the emails; from:, to:, tag:, source:, is:unread, is:inbound, is:outbound and has:attachment narrow it further, and each one shows as a chip you can remove.
  • Where its text comes from: The filters are sent to the API, so the list, the count and Delete all emails all follow them.
  • Same action elsewhere: REST GET /api/v1/emails, CLI sendmock email list, MCP sendmock_email_list

4. Unread

Button.

5. Attachments

Button.

6. Inbound

Button.

7. SendGrid

Button.

  • What it does: Shows only the emails that arrived through the SendGrid API. A quick filter appears for each email provider and transport the stored mail came through. The same as source:sendgrid.
  • Where its text comes from: The sources of the emails stored now.
  • Same action elsewhere: REST GET /api/v1/emails, CLI sendmock email list, MCP sendmock_email_list

8. SMTP

Button.

9. Select all loaded emails

Checkbox.

  • What it does: Selects every email loaded in the list, or clears the selection. Selected emails can be marked read or deleted together.

10. Notify me about new emails

Button.

  • What it does: Asks the browser for permission, then shows a system notification for each new email that matches the current filter, while this tab is open.
  • Errors: If the browser blocks notifications, allow them for this site in the browser's settings and press the button again.

11. Import .eml

Button.

  • What it does: Opens the Import .eml dialog, to store a whole message from a file or pasted text.

12. Delete all emails

Button.

13. Select email from …

Checkbox, in each row.

  • What it does: Selects this email for Mark read or Delete.

14. Unread

Badge, in each row.

  • What it does: Marks an email you have not opened yet. Opening it marks it read.
  • Where its text comes from: The email's is_read field.

15. Has attachments

Badge, in each row.

  • What it does: Marks an email with at least one attachment.

16. …

Badge, in each row.

  • What it does: Other markers a row can show, such as Has a code when a one-time code was found in the email.

17. …

Link, in each row.

18. Select an email to read it. Use J and K to move through the list.

Text.

  • What it does: Shown in the reading pane until an email is open.

An email is open

19. Welcome to Acme: here is what is new this week

Heading.

  • What it does: The open email's subject (here the demo's newsletter).
  • Where its text comes from: The email's Subject header.

20. Reply

Button.

  • What it does: Opens the composer to answer as the recipient: the reply arrives in SendMock as an incoming email to your app, as a real customer's reply would. Reply all appears beside it when the email had several recipients.
  • Links to: Replies and forwards.

21. Forward

Button.

  • What it does: Opens the composer to forward the email as the recipient, to an address your app receives on.

22. Mark as unread

Button.

23. Delete email

Button.

24. Simulate an event

Button.

  • What it does: Opens a menu of outcomes to simulate for this email, as the provider would report them.

25. More actions

Button.

  • What it does: Opens a menu with Download .eml, Release to real SMTP and Send to webhook.

26. SendGrid

Link.

  • What it does: Says the email came through the SendGrid API, and opens Mail > Providers.
  • Where its text comes from: The email's source: the provider key, or SMTP, sendmail, the native API, Verify or a simulated reply.
  • Links to: Mail > Providers.

27. Edit tags

Button.

28. https://acme.test/blog

Link.

Button.

  • What it does: Copies the link beside it.

30. HTML

Tab.

  • What it does: Shows the HTML body in a sandboxed frame: scripts never run and remote images stay blocked until you load them.

31. Text

Tab.

  • What it does: Shows the plain text body as it was sent.

32. Source

Tab.

33. Headers

Tab.

  • What it does: Lists every header with its value, in the order received.

34. Attachments (#)

Tab.

  • What it does: Lists the attachments, with a preview for images, and the number of them in the tab's name.

35. MIME

Tab.

36. Checks

Tab.

  • What it does: Runs the quality checks: HTML and CSS support across email clients, the links (when you ask) and a spam score.

37. Timeline

Tab.

38. Template data

Tab.

  • What it does: For an email sent with a provider's dynamic template, shows the template id and the data your app sent with it.

39. Desktop width

Choice.

  • What it does: Shows the HTML at a desktop width.

40. Tablet width

Choice.

  • What it does: Shows the HTML at a tablet width.

41. Mobile width

Choice.

  • What it does: Shows the HTML at a phone width, to check the layout responds.

42. Load remote images

Button.

  • What it does: Loads the images the HTML fetches from the internet, which are blocked by default so opening an email sends no request to a tracker.

43. Screenshot

Button.

  • What it does: Saves the HTML preview, at the chosen width, as a PNG file.

An email with a code is open

44. Your verification code

Heading.

  • What it does: The open email's subject (here the demo's sign-up email).
  • Where its text comes from: The email's Subject header.

45. SMTP

Link.

  • What it does: Says the email came over SMTP, and opens the SMTP session that delivered it in Logs.
  • Links to: Logs.

46. Copy code

Button.

  • What it does: Copies the one-time code found in the email, here the sign-up code. Your tests read the same code with GET /api/v1/otp.
  • Where its text comes from: The built-in code patterns, plus your own in Settings > OTP patterns.
  • Links to: Recipe: read a code.

Attachments tab

47. hero.png

Badge.

48. Download hero.png

Link.

MIME tab

49. Download part …

Link, in each row.

Checks tab

50. HTML compatibility: #%

Heading.

51. CSS background (line #): Partly supported in Outlook for Windows (#%).

Text.

  • What it does: A finding: a feature the HTML uses, the line it is on, and the clients that do not fully support it.

52. Inline CID images (line #): Partly supported in Outlook for Windows (#%).

Text.

  • What it does: A finding about images embedded in the message by cid: references.

53. Remote images (line #): Partly supported in Outlook for Windows (#%).

Text.

  • What it does: A finding about images loaded from the internet.

Heading.

  • What it does: The link check: each link and image with the status it answered, and redirects followed.

Button.

Text.

  • What it does: Explains why the link check does not run by itself.

57. Spam score: #.# /

Heading.

Template data tab

58. Sent with provider template d-#f#c#b#a#e#d . The template content lives at the provider, so only the data is shown.

Text.

  • What it does: Names the provider's template id; the template itself lives at the provider, so only the data your app sent is shown.

Replying

59. Reply as recipient

Heading.

  • What it does: The reply composer: you answer as the person the email was sent to.

60. Close composer

Button.

  • What it does: Closes the composer without sending.

61. From

Drop-down.

  • What it does: Which recipient of the original email the reply or forward comes from.

62. Subject

Field.

  • What it does: The subject, prefilled with Re: or Fwd: and the original subject.

63. Message

Field.

  • What it does: The raw message to store, or (in a composer) the body of the reply or forward.

64. http://localhost:#/webhooks/mail/stored Route Keep everything else

Link.

65. Change

Button.

  • What it does: In the Webhooks row: the endpoints the reply or forward's email.inbound will reach through your rules (or No webhook), each name opening the endpoint in a new tab with Payload beside it, and Change. Payload opens the request the webhook will send (method, URL, headers with secrets masked, and the body in the code editor), rendered with the endpoint's template; editing the body marks it Edited, Reset puts back the rendered body, and Use this payload keeps the edit for this one action. Choose webhooks lists every enabled endpoint with a search box, the endpoints your rules would pick already checked, each checked one with Payload to see and edit its request, and says how many are chosen (or that no webhook will be sent). Use these keeps the checked endpoints for this send, marked "chosen for this action", and Use the rules goes back to what the rules pick. It checks again as you edit the Forward address, subject or message.
  • What it changes: The chosen deliveries show chosen as their Trigger in Webhooks > Deliveries, and an edited payload edited, sent exactly as written and signed over those bytes. Your rules stay as they are.
  • Links to: Webhook rules.
  • Same action elsewhere: REST POST /api/v1/webhooks/rules/match, CLI sendmock webhook rule match, MCP sendmock_webhook_rule_match
  • Same action elsewhere: REST GET /api/v1/webhooks/endpoints, CLI sendmock webhook endpoint list, MCP sendmock_webhook_endpoint_list

66. Send reply

Button.

67. Cancel

Button.

  • What it does: Closes the dialog or composer without doing anything.

68. Creates an incoming email ( email.inbound ). Inbound routes deliver it to your app.

Text.

Forwarding

69. Forward as recipient

Heading.

  • What it does: The forward composer: you forward the email as the person it was sent to.

70. Close composer

Button.

  • What it does: Closes the composer without sending.

71. From

Drop-down.

  • What it does: Which recipient of the original email the reply or forward comes from.

72. To

Drop-down.

  • What it does: Where the forward goes: an address your app receives mail on (an inbound domain or route).

73. Subject

Field.

  • What it does: The subject, prefilled with Re: or Fwd: and the original subject.

74. Message

Field.

  • What it does: The raw message to store, or (in a composer) the body of the reply or forward.

75. Include attachments (#)

Checkbox.

  • What it does: Forwards the original attachments too.

76. Change

Button.

  • What it does: In the Webhooks row: the endpoints the reply or forward's email.inbound will reach through your rules (or No webhook), each name opening the endpoint in a new tab with Payload beside it, and Change. Payload opens the request the webhook will send (method, URL, headers with secrets masked, and the body in the code editor), rendered with the endpoint's template; editing the body marks it Edited, Reset puts back the rendered body, and Use this payload keeps the edit for this one action. Choose webhooks lists every enabled endpoint with a search box, the endpoints your rules would pick already checked, each checked one with Payload to see and edit its request, and says how many are chosen (or that no webhook will be sent). Use these keeps the checked endpoints for this send, marked "chosen for this action", and Use the rules goes back to what the rules pick. It checks again as you edit the Forward address, subject or message.
  • What it changes: The chosen deliveries show chosen as their Trigger in Webhooks > Deliveries, and an edited payload edited, sent exactly as written and signed over those bytes. Your rules stay as they are.
  • Links to: Webhook rules.
  • Same action elsewhere: REST POST /api/v1/webhooks/rules/match, CLI sendmock webhook rule match, MCP sendmock_webhook_rule_match
  • Same action elsewhere: REST GET /api/v1/webhooks/endpoints, CLI sendmock webhook endpoint list, MCP sendmock_webhook_endpoint_list

77. Send forward

Button.

78. Cancel

Button.

  • What it does: Closes the dialog or composer without doing anything.

79. Creates an incoming email ( email.inbound ). Inbound routes deliver it to your app.

Text.

Emails are selected

80. Mark read

Button.

81. Delete

Button.

Simulate an event menu

82. Open (email.opened)

Menu item.

  • What it does: Records an open of the email, as a tracking pixel would. Under the label, and read out by screen readers as its description: the endpoints the event will reach through your webhook rules, or No webhook.
  • What it changes: Fires email.opened with first_open and the open count.
  • Same action elsewhere: REST POST /api/v1/emails/{emailId}/open, CLI sendmock email open, MCP sendmock_email_open

83. Choose webhooks for Simulate open

Menu item.

  • What it does: Opens Choose webhooks for this one action. Choose webhooks lists every enabled endpoint with a search box, the endpoints your rules would pick already checked, each checked one with Payload to see and edit its request, and says how many are chosen (or that no webhook will be sent). Its confirm button, named after the action, runs it once and sends the event to exactly the checked endpoints; Cancel runs nothing.
  • What it changes: The chosen deliveries show chosen as their Trigger in Webhooks > Deliveries, and an edited payload edited. Your rules stay as they are; the dialog's rules link opens them in a new tab.
  • Links to: Webhook rules.
  • Same action elsewhere: REST POST /api/v1/emails/{emailId}/open, CLI sendmock email open, MCP sendmock_email_open
  • Same action elsewhere: REST POST /api/v1/webhooks/rules/match, CLI sendmock webhook rule match, MCP sendmock_webhook_rule_match

Menu item.

  • What it does: Lists the email's links; choosing one records a click on it, as a provider's click tracking would. Shown when the email has links.
  • What it changes: Fires email.clicked with the link, first_click and the click count, and adds it to the Timeline. A link clicked in the HTML preview does the same with source: "ui".
  • Same action elsewhere: REST POST /api/v1/emails/{emailId}/clicks, CLI sendmock email click, MCP sendmock_email_click

85. Delivered

Menu item.

86. Choose webhooks for Simulate delivered

Menu item.

87. Hard bounce

Menu item.

88. Choose webhooks for Simulate hard bounce

Menu item.

89. Soft bounce

Menu item.

  • What it does: Defers the email, then bounces it as a temporary failure. Under the label, and read out by screen readers as its description: the endpoints the event will reach through your webhook rules, or No webhook.
  • What it changes: Fires email.deferred, then email.bounced with a transient bounce type.
  • Same action elsewhere: REST POST /api/v1/emails/{emailId}/simulate, CLI sendmock email simulate, MCP sendmock_email_simulate

90. Choose webhooks for Simulate soft bounce

Menu item.

91. Spam complaint

Menu item.

  • What it does: Delivers the email, then records a complaint, as when the recipient marks it as spam. Under the label, and read out by screen readers as its description: the endpoints the event will reach through your webhook rules, or No webhook.
  • What it changes: Fires email.delivered, then email.complained.
  • Same action elsewhere: REST POST /api/v1/emails/{emailId}/simulate, CLI sendmock email simulate, MCP sendmock_email_simulate

92. Choose webhooks for Simulate spam complaint

Menu item.

93. Unsubscribe

Menu item.

94. Choose webhooks for Simulate unsubscribe

Menu item.

More actions menu

95. Download .eml

Menu item.

96. Release to real SMTP

Menu item.

  • What it does: Opens the Release dialog, to send this email to a real inbox through your relay.

97. Send to webhook

Menu item.

  • What it does: Opens the Send to webhook dialog, to deliver this email's event to an endpoint now.

Release dialog

98. Release to real SMTP

Heading.

  • What it does: The Release dialog.

99. Sends this email through your relay server so you can check it in a real inbox. Only recipients on the relay allowlist are accepted.

Text.

  • What it does: Explains what Release does and its safety rule.

100. Recipients (comma separated)

Field.

  • What it does: Who to send it to, prefilled with the original recipients.

101. Cancel

Button.

  • What it does: Closes the dialog or composer without doing anything.

102. Release

Button.

103. Close

Button.

  • What it does: Closes the dialog without doing anything.

Send to webhook dialog

104. Send to webhook

Heading.

  • What it does: The Send to webhook dialog.

105. Sends "Welcome to Acme: here is what is new this week" to an endpoint now.

Text.

  • What it does: Names the email the webhook is about.

106. Endpoint

Drop-down.

  • What it does: The webhook endpoint to send to.
  • Links to: Endpoints.

107. Format

Drop-down.

  • What it does: The template the request is rendered with: the endpoint's own, or another for this send only.

108. A template here is used for this send only.

Text.

  • What it does: Explains that the endpoint keeps its template.

109. vars.reason

Field.

  • What it does: A variable the chosen template asks for on manual sends (here reason), filled in for this send.
  • Links to: Variables.

110. Asked for on manual sends.

Text.

  • What it does: Explains why the variable is asked for.

111. None. A value here wins over the endpoint and global value of that name, for this send only.

Text.

  • What it does: The variable overrides for this send; none yet.

112. Add override

Button.

  • What it does: Adds a variable value for this send only.

113. Edit body

Switch.

  • What it does: Lets you change the rendered body by hand before sending.

114. Copy rendered URL

Button.

  • What it does: Copies the URL the request goes to, after its template variables are filled in.

115. Rendered headers

Heading.

  • What it does: The headers the request will carry, signature included.

116. Rendered body

Heading.

  • What it does: The body the request will carry.

117. Copy rendered body

Button.

  • What it does: Copies the rendered body.

118. Cancel

Button.

  • What it does: Closes the dialog or composer without doing anything.

119. Send

Button.

120. Close

Button.

  • What it does: Closes the dialog without doing anything.

Import .eml dialog

121. Import .eml

Heading.

  • What it does: The Import .eml dialog: stores a whole message, headers and all.

122. Store a whole message, headers and all, from a file or pasted text.

Text.

  • What it does: Explains what the dialog does.

123. Sent by your app As if your app sent it, like the sendmail shim (POST /send/raw).

Choice.

124. Incoming to your app As a reply or new mail to your app; inbound routes deliver it.

Choice.

125. Message

Field.

  • What it does: The raw message to store, or (in a composer) the body of the reply or forward.

126. Upload a .eml file

Button.

  • What it does: Reads a .eml file from your computer into the Message field.

127. Import

Button.

  • What it does: Stores the message; a notice says it was imported, with Open to read it.
  • Errors: A message that cannot be parsed is refused with the reason; fix the headers and try again.

128. Close

Button.

  • What it does: Closes the dialog without doing anything.

Delete all emails dialog

129. Delete all emails?

Heading.

  • What it does: The confirmation before deleting every email (or every email the filter shows).

130. This removes all # captured emails. It cannot be undone.

Text.

  • What it does: Says how many emails will be deleted.

131. Cancel

Button.

  • What it does: Closes the dialog or composer without doing anything.

132. Delete all

Button.

With no data yet

133. No emails yet

Text.

  • What it does: Shown when there is no email at all, with how to connect your app.

134. Point your app's SMTP settings at SendMock and send something. No auth or TLS needed.

Text.

  • What it does: Explains the first step: SendMock accepts any SMTP login, so only the host and port matter.

135. This machine

Choice.

  • What it does: Shows the addresses for an app running on the same machine as SendMock (127.0.0.1).
  • What it changes: The choice is shared with Settings > Connection and remembered in the browser.
  • Where its text comes from: The ports come from GET /api/v1/info.
  • Same action elsewhere: REST GET /api/v1/info, CLI sendmock status, MCP sendmock_status

136. Docker host

Choice.

  • What it does: Shows the addresses for an app in a container reaching SendMock on the host (host.docker.internal).

137. Compose

Choice.

  • What it does: Shows the addresses for an app in the same Docker Compose project (the sendmock service name).

138. Copy SMTP host

Button.

  • What it does: Copies the SMTP host for the chosen location.

139. Copy SMTP port

Button.

  • What it does: Copies the SMTP port the running SendMock listens on.

140. More snippets

Link.

  • What it does: Opens Settings > Connection, with the settings for every language and framework.
  • Links to: Settings.

141. Send a sample email

Button.

142. Choose webhooks for Send a sample email

Button.

  • What it does: Opens Choose webhooks for this one action. Choose webhooks lists every enabled endpoint with a search box, the endpoints your rules would pick already checked, each checked one with Payload to see and edit its request, and says how many are chosen (or that no webhook will be sent). Its confirm button, named after the action, runs it once and sends the event to exactly the checked endpoints; Cancel runs nothing.
  • What it changes: The chosen deliveries show chosen as their Trigger in Webhooks > Deliveries, and an edited payload edited. Your rules stay as they are; the dialog's rules link opens them in a new tab.
  • Links to: Webhook rules.
  • Same action elsewhere: REST POST /api/v1/samples/{kind}, CLI sendmock sample, MCP sendmock_sample_send
  • Same action elsewhere: REST POST /api/v1/webhooks/rules/match, CLI sendmock webhook rule match, MCP sendmock_webhook_rule_match

When the data cannot load

143. Could not load emails. Try again

Message.

  • What it does: Shown when the list could not be loaded, for example because SendMock stopped.
  • Errors: Check SendMock is running (the status at the bottom of the sidebar), then press Try again.

144. Could not load emails.

Text.

  • What it does: The message inside the alert.

145. Try again

Button.

On this page

On the screen1. Mail2. Read the Mail guide3. Search emails4. Unread5. Attachments6. Inbound7. SendGrid8. SMTP9. Select all loaded emails10. Notify me about new emails11. Import .eml12. Delete all emails13. Select email from …14. Unread15. Has attachments16. …17. …18. Select an email to read it. Use J and K to move through the list.An email is open19. Welcome to Acme: here is what is new this week20. Reply21. Forward22. Mark as unread23. Delete email24. Simulate an event25. More actions26. SendGrid27. Edit tags28. https://acme.test/blog29. Copy link30. HTML31. Text32. Source33. Headers34. Attachments (#)35. MIME36. Checks37. Timeline38. Template data39. Desktop width40. Tablet width41. Mobile width42. Load remote images43. ScreenshotAn email with a code is open44. Your verification code45. SMTP46. Copy codeAttachments tab47. hero.png48. Download hero.pngMIME tab49. Download part …Checks tab50. HTML compatibility: #%51. CSS background (line #): Partly supported in Outlook for Windows (#%).52. Inline CID images (line #): Partly supported in Outlook for Windows (#%).53. Remote images (line #): Partly supported in Outlook for Windows (#%).54. Links and images55. Check links56. Runs only when you ask, because it makes real requests to every link.57. Spam score: #.# /Template data tab58. Sent with provider template d-#f#c#b#a#e#d . The template content lives at the provider, so only the data is shown.Replying59. Reply as recipient60. Close composer61. From62. Subject63. Message64. http://localhost:#/webhooks/mail/stored Route Keep everything else65. Change66. Send reply67. Cancel68. Creates an incoming email ( email.inbound ). Inbound routes deliver it to your app.Forwarding69. Forward as recipient70. Close composer71. From72. To73. Subject74. Message75. Include attachments (#)76. Change77. Send forward78. Cancel79. Creates an incoming email ( email.inbound ). Inbound routes deliver it to your app.Emails are selected80. Mark read81. DeleteSimulate an event menu82. Open (email.opened)83. Choose webhooks for Simulate open84. Click a link (email.clicked)85. Delivered86. Choose webhooks for Simulate delivered87. Hard bounce88. Choose webhooks for Simulate hard bounce89. Soft bounce90. Choose webhooks for Simulate soft bounce91. Spam complaint92. Choose webhooks for Simulate spam complaint93. Unsubscribe94. Choose webhooks for Simulate unsubscribeMore actions menu95. Download .eml96. Release to real SMTP97. Send to webhookRelease dialog98. Release to real SMTP99. Sends this email through your relay server so you can check it in a real inbox. Only recipients on the relay allowlist are accepted.100. Recipients (comma separated)101. Cancel102. Release103. CloseSend to webhook dialog104. Send to webhook105. Sends "Welcome to Acme: here is what is new this week" to an endpoint now.106. Endpoint107. Format108. A template here is used for this send only.109. vars.reason110. Asked for on manual sends.111. None. A value here wins over the endpoint and global value of that name, for this send only.112. Add override113. Edit body114. Copy rendered URL115. Rendered headers116. Rendered body117. Copy rendered body118. Cancel119. Send120. CloseImport .eml dialog121. Import .eml122. Store a whole message, headers and all, from a file or pasted text.123. Sent by your app As if your app sent it, like the sendmail shim (POST /send/raw).124. Incoming to your app As a reply or new mail to your app; inbound routes deliver it.125. Message126. Upload a .eml file127. Import128. CloseDelete all emails dialog129. Delete all emails?130. This removes all # captured emails. It cannot be undone.131. Cancel132. Delete allWith no data yet133. No emails yet134. Point your app's SMTP settings at SendMock and send something. No auth or TLS needed.135. This machine136. Docker host137. Compose138. Copy SMTP host139. Copy SMTP port140. More snippets141. Send a sample email142. Choose webhooks for Send a sample emailWhen the data cannot load143. Could not load emails. Try again144. Could not load emails.145. Try again