cd /news/ai-tools/outis-fight-ai-spam-by-generating-an… · home › topics › ai-tools › article
[ARTICLE · art-143303] src=github.com ↗ pub= topic=ai-tools verified=true sentiment=· neutral

outis: Fight AI spam by generating and sending a fake "user unknown" bounce emails

A new open-source Go tool called outis generates and sends fake RFC 3464 "user unknown" bounce emails to senders, aiming to remove recipients from AI-generated automated email lists. The bounce uses status code 5.1.1, is sent from MAILER-DAEMON@<your domain> to the original Return-Path with a null envelope sender, and is delivered after the message was already accepted so the sender's logs show a successful delivery. Outis requires an SMTP account on a domain the user controls, since consumer providers like Gmail and iCloud rewrite the From header, and it defaults to redirecting bounces to the From address for Return-Path domains in reply_to_from_domains, which defaults to ["amazonses.com"] to avoid Amazon SES's shared suppression list.

read3 min views2 publishedOct 1, 2026
outis: Fight AI spam by generating and sending a fake "user unknown" bounce emails
Image: Michielbdejong (auto-discovered)

Outis fights spam generating and sends a fake "user unknown" bounce for an email you received, so the sender believes your address does not exist. This should work well for the recent trend of AI-generated automated emails, where the sender may expect a reply; it helps to clean your email from their list.

Outis (Οὖτις) is Greek for "nobody". In the Odyssey, Odysseus gives it as his name to the Cyclops Polyphemus, so that when the blinded giant calls for help and shouts that "Nobody" is hurting him, the other Cyclopes leave. The tool does the same for your mailbox: it tells whoever is asking that there is nobody here.

The bounce is an RFC 3464 delivery status notification modelled on Postfix: multipart/report with a human-readable part, a message/delivery-status part with status 5.1.1, and the original message attached as message/rfc822. It is sent to the original Return-Path from MAILER-DAEMON@<your domain> with a null envelope sender when the SMTP server allows it.

Unlike a real 550 rejection during the SMTP conversation, this bounce is sent after the message was already accepted, so the sender's logs show a successful delivery, the mailbox keeps working for any retry, and the effect only reaches the one sender who receives and processes the notification.

The bounce is only credible if it comes from a domain you control. If possible use an SMTP account on that domain that lets you send as MAILER-DAEMON@.... Consumer providers (Gmail, iCloud, ...) rewrite the From header and will expose you.

go build -o outis cmd/outis/main.go
./outis init [domain]         # add or update an account; password goes to the OS keychain
./outis accounts              # list accounts
./outis message.eml           # preview, then confirm
./outis -c                    # read the email from the clipboard
./outis -n message.eml        # dry run, print only
./outis -y -r me@example.com message.eml
./outis -a example.com -c     # force an account instead of matching recipients
./outis inbox/                # every file in the directory, one confirmation for the batch
./outis -n -o out/ inbox/     # dry run, write each bounce to out/<name>.bounce.eml
./outis -d inbox/             # delete each file once its bounce is sent

Arguments can be any mix of files and directories. A directory expands to its visible regular files, any extension, not recursive. Each file is matched to an account on its own; files that cannot be parsed or matched are reported and skipped while the others proceed, and the exit code is non-zero if any failed. With more than one input a summary line per file is shown instead of the full preview, followed by a single confirmation.

Each account covers one domain. The bounce is built with the account whose domain matches a recipient (Delivered-To, To or Cc) of the original email, so the sender, mail host and SMTP server all belong to that domain. If no account matches, or more than one does, use --account.

[[accounts]]
domain = "example.com"
mta_host = "mail.example.com"
[accounts.smtp]
host = "smtp.example.com"
port = 587
username = "mailer-daemon@example.com"

[[accounts]]
domain = "other.org"
mta_host = "mx.other.org"
[accounts.smtp]
host = "smtp.other.org"
port = 465
username = "mailer-daemon@other.org"

Some providers, notably Amazon SES, keep a suppression list shared across all their customers: one hard bounce makes every SES sender unable to reach your address for a while. For Return-Path domains listed in reply_to_from_domains the bounce is sent to the From header address instead. The default is ["amazonses.com"] and subdomains match too. Set it to [] to disable.

reply_to_from_domains = ["amazonses.com"]

envelope_from on an account forces the SMTP envelope sender instead of trying the null sender, MAILER-DAEMON@domain and the username in turn.

Config lives in os.UserConfigDir()/outis/config.toml (~/Library/Application Support/outis on macOS, ~/.config/outis on Linux). Override with OUTIS_CONFIG.

── more in #ai-tools 4 stories · sorted by recency
── more on @outis 3 stories trending now
sponsored brought to you by zahid.host 4,200+ EU-deployed projects
reading about agents? ship yours in a single git push.

Run your AI side-project on zahid.host

EU-based hosting, git-push deploys, automatic HTTPS, no cold starts. Free tier with a custom domain — perfect for shipping the agent you just read about.

$git push zahid main
→ Live at https://your-agent.zahid.host ✓
Get free account → Pricing
from €0/mo · no card required
LIVE [news/outis-fight-ai-spam-…] indexed:0 read:3min 2026-10-01 · —