{"id":21508854,"url":"https://github.com/oddlama/idmail","last_synced_at":"2025-04-09T16:44:37.908Z","repository":{"id":250307643,"uuid":"788437435","full_name":"oddlama/idmail","owner":"oddlama","description":"An email alias and account management interface for self-hosted mailservers","archived":false,"fork":false,"pushed_at":"2025-02-24T08:44:59.000Z","size":5085,"stargazers_count":18,"open_issues_count":1,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-04-02T13:59:33.398Z","etag":null,"topics":["alias","aliases","catch-all","email","leptos"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oddlama.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-04-18T12:17:30.000Z","updated_at":"2025-03-29T11:42:38.000Z","dependencies_parsed_at":"2025-02-24T09:26:35.583Z","dependency_job_id":"2faf8253-c7a7-44e4-9c6b-2b5647e20cc6","html_url":"https://github.com/oddlama/idmail","commit_stats":null,"previous_names":["oddlama/idmail"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddlama%2Fidmail","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddlama%2Fidmail/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddlama%2Fidmail/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oddlama%2Fidmail/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oddlama","download_url":"https://codeload.github.com/oddlama/idmail/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248069833,"owners_count":21042712,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alias","aliases","catch-all","email","leptos"],"created_at":"2024-11-23T21:13:08.935Z","updated_at":"2025-04-09T16:44:37.901Z","avatar_url":"https://github.com/oddlama.png","language":"Rust","readme":"[Installation](#-installation) \\| [Building](#-building) \\| [API Endpoints](#%EF%B8%8F-api-endpoints) \\| [Stalwart configuration](#%EF%B8%8F-stalwart-configuration) \\| [Provisioning](#-provisioning)\n\n\u003cp float=\"left\"\u003e\n    \u003cimg src=\"https://github.com/user-attachments/assets/d48ed681-950d-41f3-bce9-dac1acf09bae\" height=\"250\" /\u003e\n    \u003cimg src=\"https://github.com/user-attachments/assets/58e01aab-2eb0-4dd4-bf44-4d53296731a4\" height=\"250\" /\u003e\n\u003c/p\u003e\n\n\u003e [!IMPORTANT]\n\u003e Sent and recv counts require MTA-specific hook setups that are currently not documented!\n\n## 📧 idmail\n\nIdmail is an email alias and account management interface for self-hosted mailservers,\nwhich you can use to hide your true email address from online services.\nThis is NOT an email forwarding service like [addy.io](https://addy.io/)! Idmail is a frontend\nto a sqlite database which contains a table of mailboxes and aliases to be consumed by\na mailsever like [Stalwart](https://stalw.art/), [maddy](https://maddy.email/), [Postfix](https://www.postfix.org/) or others.\nThe following features are available:\n\n- 🧑,🌐 Manage user accounts and domains (as an admin)\n- 📫,🕵️ Manage mailboxes and aliases (per user)\n- 🔄 Generate random aliases\n- 🔑 API endpoint allows integration with password managers (Bitwarden, ...)\n- 📈 Track sent/received statistics per alias\n- 🌌 Per-domain catch-all\n- 🌟 Provisioning support\n\nIf you login with a mailbox account, you can change the mailbox password and manage its aliases.\nMailbox accounts can use the API to create new aliases with the API token from their settings page.\nLogging in with a user account (these have no `@domain.tld` suffix), you can additionally create new mailboxes\nand manage any domains assigned to you by an admin.\n\nYou will have to integrate this with a mailserver that supports querying an sqlite database\nfor mailbox accounts and aliases. We recommend using [Stalwart](https://stalw.art/) and provide the necessary queries\nfor it, but any other server will work fine if you adjust the queries accordingly.\n\n## 🚀 Installation\n\n#### ❓ Other distributions\n\nRefer to the second part of the [Building](#-building) section for details\non how to build and deploy this application.\n\n#### ❄️ NixOS\n\nInstallation under NixOS is straightforward. This repository provides an overlay and NixOS module for\nsimple deployment. First, add this repository flake input and import the module on your NixOS system(s):\n\n```nix\n{\n  inputs = {\n    nixpkgs.url = \"github:NixOS/nixpkgs/nixos-unstable\";\n    idmail.url = \"github:oddlama/idmail\";\n    idmail.inputs.nixpkgs.follows = \"nixpkgs\";\n  };\n\n  outputs = { self, nixpkgs, idmail }: {\n    # Add the module to your system(s)\n    nixosConfigurations.yourhostname = nixpkgs.lib.nixosSystem {\n      system = \"x86_64-linux\";\n      modules = [\n        ./configuration.nix\n        idmail.nixosModules.default\n      ];\n    };\n  };\n}\n```\n\nAfterwards, simply enable the service in your configuration and proxy the web interface:\n\n```nix\n{\n  services.idmail.enable = true;\n\n  services.nginx.virtualHosts.\"alias.example.com\" = {\n    forceSSL = true;\n    locations.\"/\" = {\n      proxyPass = \"http://localhost:3000\";\n      proxyWebsockets = true;\n    };\n  };\n}\n```\n\nThe database will be available under `/var/lib/idmail/idmail.db` for consumption by other services,\nthe service listens on `127.0.0.1:3000` by default. The example above uses nginx to reverse proxy the application.\nIf the admin user was not provisioned, it will be recovered on start and a generated password will be printed to the journal.\n\nYou can provision anything by using the `services.idmail.provision` configuration. See [Provisioning](#-provisioning)\nor view the module source for more information.\n\n```nix\n{\n  services.idmail.provision = {\n    enable = true;\n    users.admin = {\n      admin = true;\n      # Generate hash with `echo -n \"password\" | nix run nixpkgs#libargon2 -- somerandomsalt -id`\n      password_hash = \"$argon2id$v=19$m=4096,t=3,p=1$YXJnbGluYXJsZ2luMjRvaQ$DXdfVNRSFS1QSvJo7OmXIhAYYtT/D92Ku16DiJwxn8U\";\n      #password_hash = \"%{file:/path/to/secret}%\"; # Or read a file at runtime\n    };\n    domains.\"example.com\" = {\n      owner = \"admin\";\n      public = true;\n    };\n    mailboxes.\"me@example.com\" = {\n      password_hash = \"$argon2id$v=19$m=4096,t=3,p=1$YXJnbGluYXJsZ2luMjRvaQ$fiD9Bp3KidVI/E+mGudu6+h9XmF9TU9Bx4VGX0PniDE\";\n      owner = \"admin\";\n      #api_token = \"VC0lZ6O49nfxU4oK0KbahlSMsqBFiHyYFGUQvzzki6ky5mSM\"; # Please don't hardcode api tokens\n      api_token = \"%{file:/path/to/secret}%\";\n    };\n    aliases.\"somealias@example.com\" = {\n      target = \"me@example.com\";\n      owner = \"me@example.com\";\n      comment = \"Used for xyz\";\n    };\n  };\n}\n```\n\nFor a working in-the-field configuration, feel free to have a look at my personal repository.\nSpecifically [stalwart-mail.nix](https://github.com/oddlama/nix-config/blob/main/hosts/envoy/stalwart-mail.nix)\nand [idmail.nix](https://github.com/oddlama/nix-config/blob/main/hosts/envoy/idmail.nix).\n\n## 🧰 Building\n\nThis project is made to be build via nix. If you have nix installed,\nthe project can be built simply by running:\n\n```bash\nnix build github:oddlama/idmail\n```\n\nIf you want to build it yourself instead, you can do so by executing:\n\n```bash\nexport RUSTFLAGS=\"--cfg=web_sys_unstable_apis\"\nexport LEPTOS_ENV=\"PROD\"\ncargo leptos build --release -vvv\n```\n\nYou can then run the server like this:\n\n```\nexport LEPTOS_SITE_ADDR=\"0.0.0.0:3000\" # only if you want to change listen address or port\n./target/release/idmail\n```\n\nYou can host binary in any way you prefer (Docker, systemd services, ...).\nAfterwards, configure your mailserver to utilize the database for lookups ([see Stalwart configuration](#%EF%B8%8F-stalwart-configuration))\nand optionally configure your password manager to use one of the provided [API Endpoints](#%EF%B8%8F-api-endpoints).\nIf the admin user doesn't exist on start, it will be recovered and a generated password will be printed to stdout.\n\n## ☁️ API Endpoints\n\nAPI endpoints are provided which allow you to generate random aliases,\ncompatible with those provided by [addy.io (AnonAddy)](https://addy.io/) or [SimpleLogin](https://simplelogin.io/).\nThis means you can use it with a password manager to automatically create aliases for your logins.\nAliases will be generated via the [`faker_rand` Username](https://docs.rs/faker_rand/latest/faker_rand/en_us/internet/struct.Username.html) generator,\nand may produce the following results:\n\n\u003cdetails\u003e\n\u003csummary\u003eExample of generated email addresses\u003c/summary\u003e\n\n```\nycrona62@example.com\neunicecole@example.com\nhschulist@example.com\nrwalter25@example.com\nydach15@example.com\npansywisozk@example.com\nuroob30@example.com\nearlinebayer@example.com\nzhoppe26@example.com\nlauramayert@example.com\nquinnnitzsche@example.com\nwhauck98@example.com\niglover5@example.com\nstancollins@example.com\nfchamplin08@example.com\nbmurphy2@example.com\nywelch4@example.com\nerolfson@example.com\nldicki2@example.com\nmargarettlueilwitz@example.com\neusebioernser@example.com\nclynch@example.com\nseanoberbrunner@example.com\narielstiedemann@example.com\nzhamill3@example.com\nclueilwitz76@example.com\nbonitajenkins@example.com\nleannsanford@example.com\nvkirlin50@example.com\nbobernier@example.com\njazminbeatty@example.com\n```\n\n\u003c/details\u003e\n\nThere are two different API endpoints available:\n\n- addy.io compatible: Allows you to select a domain. A random avaliable domain is selected by the server if left empty or filled with the special value `random`.\n- SimpleLogin compatible: Does not allow selecting a domain, so a random available domain is always selected\n\nBoth endpoints always generate the same random usernames and ignore any format options in case the original API provides those.\nThe required API token can be generated on the settings page when logging into the Web interface as a mailbox account.\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\n#### addy.io compatible endpoint\n\n\u003c/summary\u003e\n\n- Url: `https://idmail.example.com/api/v1/aliases`\n- Method: `POST`\n- Token: Via header `Authorization: Bearer {token}`\n- Success: `201`\n\n- In Bitwarden, just use `idmail.example.com` as the endpoint.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample request and response (curl)\u003c/summary\u003e\n\nRequest:\n\n```\ncurl -X POST \\\n    -H \"Content-Type: application/json\" \\\n    -H \"Accept: application/json\" \\\n    -H \"Authorization: Bearer {token}\" \\\n    --data '{\"domain\":\"example.com\",\"description\":\"An optional comment added to the entry\"}' \\\n    localhost:3000/api/v1/aliases\n```\n\nResponse:\n\n```json\n{\n    \"data\": {\n        \"active\": true,\n        \"aliasable_id\": null,\n        \"aliasable_type\": null,\n        \"created_at\": \"2000-01-01 00:00:00\",\n        \"deleted_at\": null,\n        \"description\": \"An optional comment added to the entry\",\n        \"domain\": \"example.com\",\n        \"email\": \"zhoppe26@example.com\",\n        \"emails_blocked\": 0,\n        \"emails_forwarded\": 0,\n        \"emails_replied\": 0,\n        \"emails_sent\": 0,\n        \"extension\": null,\n        \"from_name\": null,\n        \"id\": \"00000000-0000-0000-0000-000000000000\",\n        \"last_blocked\": null,\n        \"last_forwarded\": \"2000-01-01 00:00:00\",\n        \"last_replied\": null,\n        \"last_sent\": null,\n        \"local_part\": \"00000000-0000-0000-0000-000000000000\",\n        \"recipients\": [],\n        \"updated_at\": \"2000-01-01 00:00:00\",\n        \"user_id\": \"00000000-0000-0000-0000-000000000000\"\n    }\n}\n```\n\n\u003c/details\u003e\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\n\n#### SimpleLogin compatible endpoint\n\n\u003c/summary\u003e\n\n- Url: `https://idmail.example.com/api/alias/random/new`\n- Method: `POST`\n- Token: Via header `Authorization: {token}`\n- Success: `201`\n\n- In Bitwarden, just use `idmail.example.com` as the endpoint.\n\n\u003cdetails\u003e\n\u003csummary\u003eExample request and response (curl)\u003c/summary\u003e\n\nRequest:\n\n```\ncurl -X POST \\\n    -H \"Content-Type: application/json\" \\\n    -H \"Accept: application/json\" \\\n    -H \"Authorization: {token}\" \\\n    --data '{\"note\":\"A comment added to the entry\"}' \\\n    localhost:3000/api/alias/random/new\n```\n\nResponse:\n\n```json\n{\n    \"alias\": \"zhoppe26@example.com\"\n}\n```\n\n\u003c/details\u003e\n\u003c/details\u003e\n\n## ⛔ Reserved addresses\n\nFor security purposes, we always reserve a list of special mailbox/alias names which only the domain owner (or admin) may create.\nThe list currently contains:\n\n```\nabuse\nadmin\nhostmaster\ninfo\nno-reply\npostmaster\nroot\nsecurity\nsupport\nwebmaster\n```\n\n\u003e [!WARNING]\n\u003e Never use an admin account to create mailboxes for other people, as it allows\n\u003e them to use these reserved addresses! (if the mailbox is owner is the domain owner)\n\n## ⚙️ Stalwart configuration\n\nTo integrate the idmail sqlite database with your stalwart server, you will need to provide\nthe necessary SQL queries to stalwart. This is done by configuring and external directory\nin stalwart. This requires some complex queries to honor the `active` flag correctly and\noutput everything in the format stalwart expects.\n\nYou have to make sure that stalwart has read-write access to the `idmail.db` database file and the related files for sqlite WAL mode.\nHere's the configuration that you will need (don't forget to adjust the path to the `idmail.db` database):\n\n\u003cdetails\u003e\n\u003csummary\u003eExample stalwart configuration\u003c/summary\u003e\n\n```toml\n[storage]\ndirectory = \"idmail\"\n\n[directory.idmail]\ntype = \"sql\"\nstore = \"idmail\"\n\n[directory.idmail.columns]\nname = \"name\"\ndescription = \"description\"\nsecret = \"secret\"\nemail = \"email\"\n# quotas are currently not implemented in idmail\n#quota = \"quota\"\nclass = \"type\"\n\n[store.idmail]\n# TODO: adjust the path below!\npath = \"/path/to/idmail.db\"\ntype = \"sqlite\"\n\n[store.idmail.query]\ndomains = \"\"\"\\\nSELECT domain FROM domains \\\n    WHERE domain = ?1 \\\n\"\"\"\nemails = \"\"\"\\\nSELECT address FROM ( \\\n    SELECT m.address AS address, 1 AS rowOrder \\\n        FROM mailboxes AS m \\\n        JOIN domains AS d ON m.domain = d.domain \\\n        JOIN users AS u ON m.owner = u.username \\\n        WHERE m.address = ?1 AND m.active = true AND d.active = true AND u.active = true \\\n    UNION SELECT a.address AS address, 2 AS rowOrder \\\n        FROM aliases AS a \\\n        JOIN domains AS d ON a.domain = d.domain \\\n        JOIN ( \\\n            SELECT username FROM users \\\n            WHERE active = true \\\n            UNION SELECT m.address AS username FROM mailboxes AS m \\\n            JOIN users AS u ON m.owner = u.username \\\n            WHERE m.active = true AND u.active = true \\\n        ) AS u ON a.owner = u.username \\\n        WHERE a.target = ?1 AND a.active = true AND d.active = true \\\n    UNION SELECT ('@' || d.domain) AS address, 2 AS rowOrder FROM domains AS d \\\n        JOIN mailboxes AS m ON d.catch_all = m.address \\\n        JOIN users AS u ON m.owner = u.username \\\n        WHERE d.catch_all = ?1 AND d.active = true AND m.active = true AND u.active = true \\\n    ORDER BY rowOrder, address ASC \\\n) \\\n\"\"\"\nexpand = \"\"\"\\\nSELECT m.address AS address FROM mailboxes AS m \\\n    JOIN domains AS d ON m.domain = d.domain \\\n    JOIN users AS u ON m.owner = u.username \\\n    WHERE m.address = ?1 AND m.active = true AND d.active = true AND u.active = true \\\nUNION SELECT a.address AS address FROM aliases AS a \\\n    JOIN domains AS d ON a.domain = d.domain \\\n    JOIN ( \\\n        SELECT username FROM users \\\n            WHERE active = true \\\n        UNION SELECT m.address AS username FROM mailboxes AS m \\\n            JOIN users AS u ON m.owner = u.username \\\n            WHERE m.active = true AND u.active = true \\\n    ) AS u ON a.owner = u.username \\\n    WHERE a.address = ?1 AND a.active = true AND d.active = true \\\nORDER BY address \\\nLIMIT 50 \\\n\"\"\"\nmembers = \"\"\nname = \"\"\"\\\nSELECT m.address AS name, 'individual' AS type, m.password_hash AS secret, m.address AS description, 0 AS quota FROM mailboxes AS m \\\n    JOIN domains AS d ON m.domain = d.domain \\\n    JOIN users AS u ON m.owner = u.username \\\n    WHERE m.address = ?1 AND m.active = true AND d.active = true AND u.active = true \\\n\"\"\"\n# the ordering allows aliases to override existing mailboxes.\n# The web interface never allows you to create such an alias,\n# but by provisioning you can create send-only mailboxes that\n# have their incoming mail redirected somewhere else\nrecipients = \"\"\"\\\nSELECT name FROM ( \\\n    SELECT a.target AS name, 1 AS rowOrder AS name FROM aliases AS a \\\n        JOIN domains AS d ON a.domain = d.domain \\\n        JOIN ( \\\n            SELECT username FROM users \\\n                WHERE active = true \\\n            UNION SELECT m.address AS username FROM mailboxes AS m \\\n                JOIN users AS u ON m.owner = u.username \\\n                WHERE m.active = true AND u.active = true \\\n        ) AS u ON a.owner = u.username \\\n        WHERE a.address = ?1 AND a.active = true AND d.active = true \\\n    UNION SELECT m.address AS name, 2 AS rowOrder AS name FROM mailboxes AS m \\\n        JOIN domains AS d ON m.domain = d.domain \\\n        JOIN users AS u ON m.owner = u.username \\\n        WHERE m.address = ?1 AND m.active = true AND d.active = true AND u.active = true \\\n    UNION SELECT d.catch_all AS name, 3 AS rowOrder AS name FROM domains AS d \\\n        JOIN mailboxes AS m ON d.catch_all = m.address \\\n        JOIN users AS u ON m.owner = u.username \\\n        WHERE ?1 = ('@' || d.domain) AND d.active = true AND m.active = true AND u.active = true \\\n    ORDER BY rowOrder, name ASC \\\n    LIMIT 1 \\\n) \\\n\"\"\"\nverify = \"\"\"\\\nSELECT m.address AS address FROM mailboxes AS m \\\n    JOIN domains AS d ON m.domain = d.domain \\\n    JOIN users AS u ON m.owner = u.username \\\n    WHERE m.address LIKE '%' || ?1 || '%' AND m.active = true AND d.active = true AND u.active = true \\\nUNION SELECT a.address AS address FROM aliases AS a \\\n    JOIN domains AS d ON a.domain = d.domain \\\n    JOIN ( \\\n        SELECT username FROM users \\\n            WHERE active = true \\\n        UNION SELECT m.address AS username FROM mailboxes AS m \\\n            JOIN users AS u ON m.owner = u.username \\\n            WHERE m.active = true AND u.active = true \\\n    ) AS u ON a.owner = u.username \\\n    WHERE a.address LIKE '%' || ?1 || '%' AND a.active = true AND d.active = true \\\nORDER BY address \\\nLIMIT 5 \\\n\"\"\"\n```\n\u003c/details\u003e\n\n## 🌟 Provisioning\n\nTo support declarative deployment you can provision users, domains, mailboxes and aliases out of the box.\nThis works by pointing the environment variable `IDMAIL_PROVISION` to a toml file containing the desired state.\nThe application automatically tracks provisioned entities and ensures that they will automatically be removed\nagain if you remove them from the state file, without touching entities that were created dynamically by you our your users.\nThis will *not* cascade deletion, so removing a domain will not touch any dependent aliases or mailboxes. The mailserver queries\nshould always validate combinations by joining the appropriate tables.\n\nThe state file has the format shown below:\n\n```toml\n[users.\"username\"]\n# Password hash, should be a argon2id hash.\n# Can be generated with: `echo -n \"whatever\" | argon2 somerandomsalt -id`\n# Also accepts \"%{file:/path/to/secret}%\" to refer to the contents of a file.\npassword_hash = \"$argon2id$v=19$m=4096,t=3,p=1$YXJnbGluYXJsZ2luMjRvaQ$DXdfVNRSFS1QSvJo7OmXIhAYYtT/D92Ku16DiJwxn8U\"\n# Whether the user should be an admin.\n# Optional, default: false\nadmin = false\n# Whether the user should be active\n# Optional, default: true\nactive = true\n\n[domains.\"example.com\"]\n# The user which owns this domain. Allows that user to modify\n# the catch all address and the domain's active state.\n# Creation and deletion of any domain is always restricted to admins only.\nowner = \"username\"\n# A catch-all address for this domain.\n# Optional. Default: None\ncatch_all = \"postmaster@example.com\"\n# Whether the domain should be available for use by any registered\n# user instead of just the owner. Admins can always use any domain,\n# regardless of this setting.\n# Optional, default: false\npublic = false\n# Whether the domain should be active\n# Optional, default: true\nactive = true\n\n[mailboxes.\"me@example.com\"]\n# Password hash, should be a argon2id hash.\n# Can be generated with: `echo -n \"whatever\" | argon2 somerandomsalt -id`\n# Also accepts \"%{file:/path/to/secret}%\" to refer to the contents of a file.\npassword_hash = \"$argon2id$v=19$m=4096,t=3,p=1$YXJnbGluYXJsZ2luMjRvaQ$fiD9Bp3KidVI/E+mGudu6+h9XmF9TU9Bx4VGX0PniDE\"\n# The user which owns this mailbox. That user has full control over the mailbox and its aliases.\nowner = \"username\"\n# An API token for this mailbox to allow alias creation via the API endpoints.\n# Optional. Default: None (API access disabled)\n# Minimum length 16. Must be unique!\n# Also accepts \"%{file:/path/to/secret}%\" to refer to the contents of a file.\napi_token = \"VC0lZ6O49nfxU4oK0KbahlSMsqBFiHyYFGUQvzzki6ky5mSM\"\n#api_token = \"%{file:/path/to/secret}%\"\n# Whether the mailbox should be active\n# Optional, default: true\nactive = true\n\n[aliases.\"somealias@example.com\"]\n# The target address for this alias. The WebUI restricts users to only\n# target mailboxes they own. Admins and this provisioning file\n# have no such restrictions.\ntarget = \"me@example.com\"\n# The user/mailbox which owns this alias. If owned by a mailbox,\n# the user owning the mailbox transitively owns this.\nowner = \"me@example.com\"\n# A comment to store alongside this alias.\n# Optional, default: None\ncomment = \"Used for xyz\"\n# Whether the user should be active\n# Optional, default: true\nactive = true\n```\n\nSmall example which creates an admin user and one domain:\n\n```toml\n[users.admin]\npassword_hash = \"$argon2id$v=19$m=4096,t=3,p=1$YXJnbGluYXJsZ2luMjRvaQ$DXdfVNRSFS1QSvJo7OmXIhAYYtT/D92Ku16DiJwxn8U\"\nadmin = true\n\n[domains.\"example.com\"]\nowner = \"admin\"\npublic = true\n```\n\n## 📜 License\n\nLicensed under the MIT license ([LICENSE](LICENSE) or \u003chttps://opensource.org/licenses/MIT\u003e).\nUnless you explicitly state otherwise, any contribution intentionally\nsubmitted for inclusion in this project by you, shall be licensed as above, without any additional terms or conditions.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foddlama%2Fidmail","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foddlama%2Fidmail","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foddlama%2Fidmail/lists"}