Native Mac OS Mail Server/Client For Development alternative to Mailpit/Maildev
  • Swift 98%
  • Shell 2%
Find a file
2026-05-13 15:09:27 +04:00
.github/workflows feat: improve about and update docs 2026-05-13 15:09:27 +04:00
art docs: add image 2026-05-13 14:34:05 +04:00
Resources fix: will copy icons during build and document how to do it 2026-05-13 14:53:03 +04:00
Sources feat: improve about and update docs 2026-05-13 15:09:27 +04:00
.gitignore feat: initial commit 2026-05-13 14:21:04 +04:00
build.sh feat: improve about and update docs 2026-05-13 15:09:27 +04:00
Package.swift feat: initial commit 2026-05-13 14:21:04 +04:00
README.md feat: improve about and update docs 2026-05-13 15:09:27 +04:00

Inboxed

inboxed screenshot

Inboxed is a native macOS Mail catcher for local development. It runs a local SMTP server, captures outbound emails from your apps, and previews plain text, HTML, raw MIME content, and SMTP logs without forwarding anything outside your machine.

Features

Feature Details
Local SMTP server Listens on localhost:1025 by default
Native Only use Swift and Swift UI
Notifications Shows a macOS notification when an email is captured
Logs Includes a live SMTP traffic/log view

Requirements

  • macOS 14+
  • Xcode 26+ or the matching command line tools
  • Swift Package Manager

Run Locally

From the project directory:

swift build
swift run Inboxed

swift run Inboxed is useful for development. macOS notifications are only enabled when Inboxed is launched from an .app bundle.

For an app-bundle style local run:

sh build.sh

The app starts the SMTP server automatically. The current status and port are shown in the sidebar footer.

SMTP Configuration

Configure your app's mailer with:

Setting Value
Host localhost
Port 1025 by default
TLS Off
Auth None

To change the port, open Inboxed > Settings or press Cmd + ,. If the server is running, saving a new port restarts the listener automatically.

Send a Test Email

Plain text:

python3 - <<'PYEOF'
import smtplib
from email.mime.text import MIMEText

msg = MIMEText('Hello from Inboxed!', 'plain')
msg['Subject'] = 'Test Email'
msg['From'] = 'dev@local.test'
msg['To'] = 'you@local.test'

with smtplib.SMTP('localhost', 1025) as smtp:
    smtp.send_message(msg)

print('Sent!')
PYEOF

HTML + plain text multipart:

python3 - <<'PYEOF'
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

msg = MIMEMultipart('alternative')
msg['Subject'] = 'HTML Test Email'
msg['From'] = 'dev@local.test'
msg['To'] = 'you@local.test'

msg.attach(MIMEText('This is the plain text fallback.', 'plain'))
msg.attach(MIMEText('''
<!doctype html>
<html>
<body style="font-family:-apple-system;padding:32px;background:#f6f7fb;">
  <div style="max-width:560px;margin:auto;background:white;border-radius:16px;padding:28px;">
    <h1>Inboxed HTML Preview</h1>
    <p>This email is rendered inside Inboxed.</p>
    <a href="https://example.com">External link test</a>
  </div>
</body>
</html>
''', 'html'))

with smtplib.SMTP('localhost', 1025) as smtp:
    smtp.send_message(msg)

print('Sent!')
PYEOF

Release Builds

Release builds are currently unsigned. After downloading and unzipping a release, you can ad-hoc sign it locally:

codesign --force --deep --sign - "Inboxed.app"

If macOS still blocks the app because it was downloaded from the internet, remove the quarantine attribute and sign again:

xattr -dr com.apple.quarantine "Inboxed.app"
codesign --force --deep --sign - "Inboxed.app"
open "Inboxed.app"

Notes

  • Inboxed is meant for local development only.
  • Emails are kept in memory for the current app session.
  • Inboxed never forwards or delivers email to real recipients.

Credits