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

> Source: <https://github.com/dtonon/outis>
> Published: 2026-10-01 15:54:02+00:00

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`.
