selfhost.directory

The index of self-hostable projects — ranked, categorized and served with live updates.
Own your data and stop giving it to big tech.

LanQin Email logo

Self-host LanQin Email

v1.2.4

Full-stack self-hosted webmail with multi-domain support

ReleaseOpen SourceGPL-3.0
Updated7 hours ago
LanguageGo
Setup difficultyAdvanced
Stars
161
Ports
80 (HTTP webmail), 443 (HTTPS webmail), 25 (SMTP inbound), 465 (SMTP submission (SSL)), 587 (SMTP submission (STARTTLS)), 993 (IMAP (SSL)), 995 (POP3 (SSL))
Docker
ghcr.io/lanqin996/lanqin-email
Install with Docker Compose
Webmail reading and list view with mailbox switching, folders, search, labels, stars, and message reading panelThird-party client configuration showing IMAP, POP3, SMTP servers, ports, security modes, and account information

What is LanQin Email?

This self-hosted mail system gives you a modern webmail interface with multi-mailbox support, rich-text editing, scheduled sending, contacts, signatures, and inbox rules. Administrators manage domains, DKIM keys, DNS records, mailboxes, aliases, users, and permission groups with quotas for attachment size, send rates, and mailbox counts. The integrated mail stack runs Postfix for SMTP, Dovecot for IMAP/POP3, and Rspamd for spam filtering and DKIM signing. Deployment is a single Docker container with SQLite (or MySQL/PostgreSQL), plus a multi-container option for debugging. Features include Linux.do OAuth2 SSO, TOTP 2FA, Cloudflare Turnstile, invitation codes, external IMAP aggregation with Gmail/Outlook OAuth2, and an Open API with webhooks. Licensed under GPL-3.0-only.

Should you self-host LanQin Email?

LanQin Email scores 46/100 on selfhost.directory (how scoring works) and ranks #77 of 106 in Email. It has 161 GitHub stars.

It shipped 12 stable releases in the past year. The latest, v1.2.4, came out on 28 October 2026. New versions land roughly every 5 days.

Setup is advanced: plan for several services and some ongoing maintenance. An official Docker image is available. It is GPL-3.0-licensed and written mostly in Go.

Its closest alternative on selfhost.directory is Listmonk (80/100, 24 019 stars). It scores higher overall, so compare the two before you pick. See LanQin Email vs Listmonk side by side.

Features

  • Admin Panel
  • Contacts and signatures
  • External IMAP aggregation
  • Inbox rules
  • Integrated mail stack
  • Invitation-based registration
  • Linux.do OAuth2 SSO
  • Mail statistics
  • Multi-domain Management
  • Open API with webhooks
  • Permission groups with quotas
  • Rich-text compose
  • Sender blacklist
  • TOTP two-factor authentication
  • Webmail Client

LanQin Email README

How to install LanQin Email

Install LanQin Email with Docker Compose

cd deploy cp .env.example .env

Edit .env: domain, public URL, admin email, admin password, etc.

docker compose pull docker compose up -d

Single all-in-one container with Nginx, API, Postfix, Dovecot, Rspamd

How to configure LanQin Email

  • LANQIN_ADDR:8080API / 数据存储 API 监听地址。单容器里由 Nginx 反代到 127.0.0.1:8080。

    API / 数据存储 API 监听地址。单容器里由 Nginx 反代到 127.0.0.1:8080。

  • LANQIN_ADMIN_EMAIL初始管理员 第一次启动时会创建这个管理员账号。

    初始管理员 第一次启动时会创建这个管理员账号。

  • LANQIN_ADMIN_PASSWORD生产环境必须改掉默认密码。

    生产环境必须改掉默认密码。

  • LANQIN_ALLOW_INSECURE_HTTPfalseCookie Secure 按 LANQIN_PUBLIC_BASE_URL 的协议决定:http 不设置,https 始终设置。 此开关仍控制非 HTTPS OAuth 回调等兼容行为;通常保持 false。

    Cookie Secure 按 LANQIN_PUBLIC_BASE_URL 的协议决定:http 不设置,https 始终设置。 此开关仍控制非 HTTPS OAuth 回调等兼容行为;通常保持 false。

  • LANQIN_API_IMAGEghcr.io/lanqin996/lanqin-email-api:latest多容器调试版镜像。只在 docker-compose.stack.yml 中使用。

    多容器调试版镜像。只在 docker-compose.stack.yml 中使用。

  • LANQIN_AUTH_POLICY_SECRET/auth-policy 的共享密钥。该端点不经 Nginx 反代、默认不可从公网访问; 若你直接暴露 8080,请设置此值,Dovecot 侧需在 URL 后追加 ?key=<该值>。

    /auth-policy 的共享密钥。该端点不经 Nginx 反代、默认不可从公网访问; 若你直接暴露 8080,请设置此值,Dovecot 侧需在 URL 后追加 ?key=<该值>。

  • LANQIN_AUTH_POLICY_URLhttp://127.0.0.1:8080/auth-policyDovecot 查询 IMAP/POP3 频率限制的地址。单容器部署 API 与 Dovecot 同容器, 保持默认即可;多容器 stack 已在 compose 中设为 http://api:8080/auth-policy。

    Dovecot 查询 IMAP/POP3 频率限制的地址。单容器部署 API 与 Dovecot 同容器, 保持默认即可;多容器 stack 已在 compose 中设为 http://api:8080/auth-policy。

  • LANQIN_CATCH_ALL_ENABLEDfalse无人收件开关。false:未注册邮箱默认拒收;true:未注册收件地址进入全部邮件。

    无人收件开关。false:未注册邮箱默认拒收;true:未注册收件地址进入全部邮件。

  • LANQIN_COOKIE_NAMElanqin_sessionSession Cookie 名称,一般不用改。

    Session Cookie 名称,一般不用改。

  • LANQIN_DATABASE_URL
  • LANQIN_DATA_DIR/data容器内数据目录。docker-compose.yml 已把 lanqin-data 挂到 /data。

    容器内数据目录。docker-compose.yml 已把 lanqin-data 挂到 /data。

  • LANQIN_DB_CONNECT_TIMEOUT_SECONDS10
  • LANQIN_DB_CONN_MAX_IDLE_TIME_SECONDS300
  • LANQIN_DB_CONN_MAX_LIFETIME_SECONDS1800
  • LANQIN_DB_DRIVERsqliteAPI database backend: sqlite (default), mysql, or postgres. For mysql/postgres, configure LANQIN_DATABASE_URL and start with a new empty database. Existing SQLite data is never copied automatically.

    API database backend: sqlite (default), mysql, or postgres. For mysql/postgres, configure LANQIN_DATABASE_URL and start with a new empty database. Existing SQLite data is never copied automatically.

  • LANQIN_DB_MAX_IDLE_CONNS10
  • LANQIN_DB_MAX_OPEN_CONNS20
  • LANQIN_DB_PATH/data/lanqin.dbSQLite 数据库路径。

    SQLite 数据库路径。

  • LANQIN_DELIVERY_WEBHOOK_SECRET开放 API 最终投递事件回调的 HMAC-SHA256 密钥。生产环境请使用高强度随机值。 未配置时 /api/open/v1/delivery-events 返回 503。

    开放 API 最终投递事件回调的 HMAC-SHA256 密钥。生产环境请使用高强度随机值。 未配置时 /api/open/v1/delivery-events 返回 503。

  • LANQIN_DOVECOT_IMAGEghcr.io/lanqin996/lanqin-email-dovecot:latest
  • LANQIN_EXTERNAL_IMAP_ALLOW_PRIVATE_HOSTSfalse是否允许用户配置 localhost / 内网 / link-local IMAP 主机。默认 false,避免 SSRF 风险;也可在后台配置。

    是否允许用户配置 localhost / 内网 / link-local IMAP 主机。默认 false,避免 SSRF 风险;也可在后台配置。

  • LANQIN_EXTERNAL_IMAP_ENABLEDfalse是否启用外部 IMAP 接入。也可在后台“系统设置 > 外部 IMAP”里开启,默认关闭。

    是否启用外部 IMAP 接入。也可在后台“系统设置 > 外部 IMAP”里开启,默认关闭。

  • LANQIN_EXTERNAL_IMAP_GMAIL_CLIENT_IDGmail 外部 IMAP OAuth2。也可在后台配置。回调地址:${LANQIN_PUBLIC_BASE_URL}/api/external-imap-oauth/gmail/callback

    Gmail 外部 IMAP OAuth2。也可在后台配置。回调地址:${LANQIN_PUBLIC_BASE_URL}/api/external-imap-oauth/gmail/callback

  • LANQIN_EXTERNAL_IMAP_GMAIL_CLIENT_SECRET
  • LANQIN_EXTERNAL_IMAP_OUTLOOK_CLIENT_IDMicrosoft 365 / Outlook 外部 IMAP OAuth2。也可在后台配置。回调地址:${LANQIN_PUBLIC_BASE_URL}/api/external-imap-oauth/outlook/callback

    Microsoft 365 / Outlook 外部 IMAP OAuth2。也可在后台配置。回调地址:${LANQIN_PUBLIC_BASE_URL}/api/external-imap-oauth/outlook/callback

  • LANQIN_EXTERNAL_IMAP_OUTLOOK_CLIENT_SECRET
  • LANQIN_EXTERNAL_IMAP_SECRET_KEY外部 IMAP 密码加密密钥。启用外部 IMAP 接入前必须设置为足够长的随机字符串;也可在后台“系统设置 > 外部 IMAP”里配置。

    外部 IMAP 密码加密密钥。启用外部 IMAP 接入前必须设置为足够长的随机字符串;也可在后台“系统设置 > 外部 IMAP”里配置。

  • LANQIN_EXTERNAL_IMAP_SYNC_SECONDS300外部 IMAP 本地存储模式的后台同步间隔,单位:秒;也可在后台配置。

    外部 IMAP 本地存储模式的后台同步间隔,单位:秒;也可在后台配置。

  • LANQIN_IMAGEghcr.io/lanqin996/lanqin-email:latestDocker 镜像 单容器部署镜像。默认使用你的 GHCR 镜像。 本地源码构建请用:docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build

    Docker 镜像 单容器部署镜像。默认使用你的 GHCR 镜像。 本地源码构建请用:docker compose -f docker-compose.yml -f docker-compose.build.yml up -d --build

  • LANQIN_LINUXDO_REGISTRATION_GROUP_IDSLinux.do 注册用户自动加入的权限组 ID,多个用英文逗号分隔。留空则仅普通用户组。 建议在后台“系统设置 > 安全”里配置。超级管理员组不可指定。

    Linux.do 注册用户自动加入的权限组 ID,多个用英文逗号分隔。留空则仅普通用户组。 建议在后台“系统设置 > 安全”里配置。超级管理员组不可指定。

  • LANQIN_MAIL_AUTO_REFRESHtrueWebmail 是否自动轮询刷新邮件。

    Webmail 是否自动轮询刷新邮件。

  • LANQIN_MAILDIR_ROOT/var/mail/vhosts收件 / Maildir 同步 Dovecot Maildir 根目录。docker-compose.yml 已把 maildata 挂到这里。

    收件 / Maildir 同步 Dovecot Maildir 根目录。docker-compose.yml 已把 maildata 挂到这里。

  • LANQIN_MAILDIR_SCAN_SECONDS5扫描 Maildir 的间隔,单位:秒。

    扫描 Maildir 的间隔,单位:秒。

  • LANQIN_MAIL_REFRESH_SECONDS30自动刷新间隔,单位:秒。

    自动刷新间隔,单位:秒。

  • LANQIN_MYSQL_DATABASElanqinOptional all-in-one MySQL variant (docker-compose.mysql.yml).

    Optional all-in-one MySQL variant (docker-compose.mysql.yml).

  • LANQIN_MYSQL_PASSWORD
  • LANQIN_MYSQL_ROOT_PASSWORD
  • LANQIN_MYSQL_USERlanqin
  • LANQIN_NOTIFICATION_SECRET_KEY用户级 Telegram 收件通知的加密主密钥。配置后,用户可在个人中心保存自己的 Bot Token 和 Chat ID。 该密钥同时用于加密 TOTP 两步验证种子(配置后新写入的种子才加密,已有明文种子照常可用)。 生产环境请使用高强度随机值;更换此值会导致已保存的 Bot Token 无法解密, 已加密的 TOTP 种子也会失效 —— 此时管理员可在后台“用户 > 重置双因素认证”帮用户重新绑定。

    用户级 Telegram 收件通知的加密主密钥。配置后,用户可在个人中心保存自己的 Bot Token 和 Chat ID。 该密钥同时用于加密 TOTP 两步验证种子(配置后新写入的种子才加密,已有明文种子照常可用)。 生产环境请使用高强度随机值;更换此值会导致已保存的 Bot Token 无法解密, 已加密的 TOTP 种子也会失效 —— 此时管理员可在后台“用户 > 重置双因素认证”帮用户重新绑定。

  • LANQIN_OPEN_REGISTRATIONfalse注册与安全 是否开放用户自行注册。

    注册与安全 是否开放用户自行注册。

  • LANQIN_POSTFIX_IMAGEghcr.io/lanqin996/lanqin-email-postfix:latest
  • LANQIN_POSTGRES_ADMIN_PASSWORD
  • LANQIN_POSTGRES_DATABASEOptional all-in-one PostgreSQL variant (docker-compose.postgres.yml). LANQIN_POSTGRES_PASSWORD must use only letters, digits, dot, underscore, tilde, and hyphen.

    Optional all-in-one PostgreSQL variant (docker-compose.postgres.yml). LANQIN_POSTGRES_PASSWORD must use only letters, digits, dot, underscore, tilde, and hyphen.

  • LANQIN_POSTGRES_PASSWORD
  • LANQIN_POSTGRES_USERlanqin
  • LANQIN_PUBLIC_BASE_URLWebmail 对外访问地址。生产环境建议使用 https。

    Webmail 对外访问地址。生产环境建议使用 https。

  • LANQIN_PUBLIC_HOSTNAME对外访问地址 邮件服务器主机名,一般填你的邮件域名,例如 mail.example.com。 会影响 Postfix myhostname、DNS 展示、邮件链接等。

    对外访问地址 邮件服务器主机名,一般填你的邮件域名,例如 mail.example.com。 会影响 Postfix myhostname、DNS 展示、邮件链接等。

  • LANQIN_RESERVED_MAILBOX_PREFIXESadmin,postmaster,abuse,hostmaster,webmaster,root,security,noreply,no-reply,mailer-daemon禁止自助申请的邮箱前缀,多个用英文逗号分隔。

    禁止自助申请的邮箱前缀,多个用英文逗号分隔。

  • LANQIN_RSPAMD_DKIM_SYNC_SECONDS60Rspamd 从 SQLite 导出 DKIM 私钥到签名目录的间隔,单位:秒。

    Rspamd 从 SQLite 导出 DKIM 私钥到签名目录的间隔,单位:秒。

  • LANQIN_RSPAMD_IMAGEghcr.io/lanqin996/lanqin-email-rspamd:latest
  • LANQIN_SESSION_TTL_HOURS168登录会话有效期,单位:小时。默认 168 小时,即 7 天。

    登录会话有效期,单位:小时。默认 168 小时,即 7 天。

  • LANQIN_SMTP_HOSTSMTP 发信 单容器部署默认提交给容器内 Postfix。 Split stack 会由 docker-compose.stack.yml 默认覆盖为 postfix:25。 如需在 split stack 使用外部 SMTP,可设置 LANQIN_STACK_SMTP_HOST / LANQIN_STACK_SMTP_PORT。 如果要走外部 SMTP,把 Host/Port/Username/Password 改成外部服务配置。

    SMTP 发信 单容器部署默认提交给容器内 Postfix。 Split stack 会由 docker-compose.stack.yml 默认覆盖为 postfix:25。 如需在 split stack 使用外部 SMTP,可设置 LANQIN_STACK_SMTP_HOST / LANQIN_STACK_SMTP_PORT。 如果要走外部 SMTP,把 Host/Port/Username/Password 改成外部服务配置。

  • LANQIN_SMTP_PASSWORD
  • LANQIN_SMTP_PORT25
  • LANQIN_SMTP_REQUIRE_TLSfalse外部 SMTP 要求 STARTTLS / TLS 时改 true;本机 Postfix 默认 false。

    外部 SMTP 要求 STARTTLS / TLS 时改 true;本机 Postfix 默认 false。

  • LANQIN_SMTP_USERNAME
  • LANQIN_STACK_SMTP_HOST
  • LANQIN_STACK_SMTP_PORT
  • LANQIN_STATUS_WEBHOOK_ALLOW_PRIVATE_HOSTSfalse仅可信内网或本地测试可开启;开启后也允许 HTTP 与私网目标。

    仅可信内网或本地测试可开启;开启后也允许 HTTP 与私网目标。

  • LANQIN_STATUS_WEBHOOK_SECRET
  • LANQIN_STATUS_WEBHOOK_URL可选:把发送队列与最终投递状态主动推送给外部系统。URL 默认必须为公网 HTTPS。

    可选:把发送队列与最终投递状态主动推送给外部系统。URL 默认必须为公网 HTTPS。

  • LANQIN_SUBMISSION_ADDR第三方客户端 SMTP 提交,由 LanQin API 监听 587/465;启用前必须配置可读 TLS 证书。

    第三方客户端 SMTP 提交,由 LanQin API 监听 587/465;启用前必须配置可读 TLS 证书。

  • LANQIN_SUBMISSION_MAX_MESSAGE_MB35
  • LANQIN_SUBMISSION_TLS_ADDR
  • LANQIN_TLS_CERT_FILE邮件客户端 TLS 证书。用于 SMTP 465/587、IMAP 993、POP3 995。 生产环境请挂载真实证书,并确保域名包含 LANQIN_PUBLIC_HOSTNAME。 留空时 Dovecot/Postfix 会使用容器自带 localhost 自签证书;LanQin API 的 SMTP submission 不会启用。

    邮件客户端 TLS 证书。用于 SMTP 465/587、IMAP 993、POP3 995。 生产环境请挂载真实证书,并确保域名包含 LANQIN_PUBLIC_HOSTNAME。 留空时 Dovecot/Postfix 会使用容器自带 localhost 自签证书;LanQin API 的 SMTP submission 不会启用。

  • LANQIN_TLS_KEY_FILE
  • LANQIN_TRUSTED_PROXY_COUNT1本服务前面有多少层可信反向代理。0 表示直接暴露,只信任 TCP 对端地址。 本仓库的 compose 部署由 Nginx 反代 API,因此为 1;限流与审计的客户端 IP 取 X-Forwarded-For 中由最近一层代理追加的那一项,客户端自己塞的值无法伪造。 直接暴露 API 而不经反代时必须设为 0,否则客户端可自行指定 IP。

    本服务前面有多少层可信反向代理。0 表示直接暴露,只信任 TCP 对端地址。 本仓库的 compose 部署由 Nginx 反代 API,因此为 1;限流与审计的客户端 IP 取 X-Forwarded-For 中由最近一层代理追加的那一项,客户端自己塞的值无法伪造。 直接暴露 API 而不经反代时必须设为 0,否则客户端可自行指定 IP。

  • LANQIN_TURNSTILE_ENABLEDfalse是否启用 Cloudflare Turnstile 人机验证。

    是否启用 Cloudflare Turnstile 人机验证。

  • LANQIN_TURNSTILE_SECRET_KEYTurnstile Secret Key,服务端校验使用。未启用时可以留空。

    Turnstile Secret Key,服务端校验使用。未启用时可以留空。

  • LANQIN_TURNSTILE_SITE_KEYTurnstile Site Key,前端公开使用。未启用时可以留空。

    Turnstile Site Key,前端公开使用。未启用时可以留空。

  • LANQIN_TWO_FACTOR_ENABLEDfalse是否启用 2FA 功能总开关。

    是否启用 2FA 功能总开关。

  • LANQIN_USER_MAILBOX_APPLY_ENABLEDfalse用户是否可以在个人中心自助申请邮箱。

    用户是否可以在个人中心自助申请邮箱。

  • LANQIN_USER_MAILBOX_DOMAIN_IDS允许自助申请的域名 ID,多个用英文逗号分隔。建议在后台“系统设置 > 邮件”里配置。

    允许自助申请的域名 ID,多个用英文逗号分隔。建议在后台“系统设置 > 邮件”里配置。

  • LANQIN_WEB_IMAGEghcr.io/lanqin996/lanqin-email-web:latest

LanQin Email releases & version history

More in Self-hosting

Rate this project

Click to rate — no account needed.

0 comments

Posting as guest
Loading comments…