* feat: support attachment push for Telegram and Webhook (#894) - Parse email attachments via postal-mime in commonParseMail - Send attachments via Telegram Bot API sendDocument after text message - Include base64-encoded attachments in webhook payload - Add e2e tests for webhook attachment push - Add i18n messages for attachment-related notifications Closes #894 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: remove user-facing error message for failed attachment send Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: remove unused i18n attachment messages Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: use sendMediaGroup for batch attachment sending Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: remove redundant commonParseMail call, use cached result Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: remove webhook attachment support, raw already contains attachments Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: use sendDocument for single attachment, sendMediaGroup for 2+ Telegram sendMediaGroup requires 2-10 items minimum. Use sendDocument for single attachment case. Update CHANGELOG with 50MB limit info. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix: batch sendMediaGroup in groups of 9, add attachments to wasm parser Telegram sendMediaGroup supports 2-10 items. Batch large attachment lists into groups of 9. Also add attachments field to commented-out wasm parser for future compatibility. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add caption to attachment messages, update wasm patch Add email sender and subject as caption on Telegram attachment messages. Caption is shown on the first attachment only for sendMediaGroup. Update wasm parser patch to include attachments field mapping, and fix wasm comment to use correct field names (content_type, content as Uint8Array directly). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * refactor: unify attachment sending with sendMediaGroup for all cases sendMediaGroup works with 1+ files (tested). Remove sendDocument special case and always use sendMediaGroup with batching. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: reduce sendMediaGroup batch size to 6 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: change WASM parse email comment from TODO to NOTE Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * chore: regenerate wasm parser patch with attachments support Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * feat: add ENABLE_TG_PUSH_ATTACHMENT env var to control attachment push Add environment variable to enable/disable Telegram attachment push (default disabled). Update type definitions, wrangler template, worker-vars docs (zh/en), telegram feature docs (zh/en), and changelogs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
17 KiB
Worker Variables
[!NOTE] Note For CLI deployment syntax, please refer to
worker/wrangler.toml.template
Required Variables
| Variable Name | Type | Description | Example |
|---|---|---|---|
DOMAINS |
JSON | All domains for temporary email, supports multiple domains | ["awsl.uk", "dreamhunter2333.xyz"] |
JWT_SECRET |
Text/Secret | Secret key for generating JWT, used for login and authentication | xxx |
ADMIN_PASSWORDS |
JSON | Admin console passwords, console access disabled if not configured | ["123", "456"] |
ENABLE_USER_CREATE_EMAIL |
Text/JSON | Whether to allow users to create mailboxes, disabled if not configured | true |
ENABLE_USER_DELETE_EMAIL |
Text/JSON | Whether to allow users to delete emails, disabled if not configured | true |
Console Related Variables
| Variable Name | Type | Description | Example |
|---|---|---|---|
PASSWORDS |
JSON | Website private passwords, required after configuration | ["123", "456"] |
DISABLE_ADMIN_PASSWORD_CHECK |
Text/JSON | Warning: Admin console without password or user check | false |
Email Related Variables
| Variable Name | Type | Description | Example |
|---|---|---|---|
PREFIX |
Text | Default prefix for new email address names, can be left unconfigured if no prefix needed |
tmp |
MIN_ADDRESS_LEN |
Number | Minimum length of email address name |
1 |
MAX_ADDRESS_LEN |
Number | Maximum length of email address name |
30 |
DISABLE_CUSTOM_ADDRESS_NAME |
Text/JSON | Disable custom email address names, if set to true, users cannot enter custom names and they will be auto-generated | true |
ADDRESS_CHECK_REGEX |
Text | Regular expression for email address name, used for validation only |
^(?!.*admin).* |
ADDRESS_REGEX |
Text | Regular expression to replace illegal symbols in email address name, symbols not in the regex will be replaced. Default is [^a-z0-9] if not set. Use with caution as some symbols may prevent email reception |
[^a-z0-9] |
DEFAULT_DOMAINS |
JSON | Default domains available to users (not logged in or users without assigned roles) | ["awsl.uk", "dreamhunter2333.xyz"] |
CREATE_ADDRESS_DEFAULT_DOMAIN_FIRST |
Text/JSON | Whether to prioritize default domain when creating new addresses, if set to true, will use the first domain when no domain is specified, mainly for telegram bot scenarios | false |
DOMAIN_LABELS |
JSON | For Chinese domains, you can use DOMAIN_LABELS to display Chinese names | ["中文.awsl.uk", "dreamhunter2333.xyz"] |
ENABLE_AUTO_REPLY |
Text/JSON | Allow automatic email replies. Sender filter (source_prefix) supports three modes: empty to match all senders, prefix for startsWith matching, or /regex/ syntax for regex matching (e.g. /@example\.com$/) |
true |
DEFAULT_SEND_BALANCE |
Text/JSON | Default email sending balance, will be 0 if not set | 1 |
ENABLE_ADDRESS_PASSWORD |
Text/JSON | Enable address password feature, when enabled, passwords will be auto-generated for new addresses, supports password login and modification | true |
Email Reception Related Variables
| Variable Name | Type | Description | Example |
|---|---|---|---|
BLACK_LIST |
Text | Blacklist for filtering senders, comma separated | gov.cn,edu.cn |
ENABLE_CHECK_JUNK_MAIL |
Text/JSON | Whether to enable junk mail checking, used with the following two lists | false |
JUNK_MAIL_CHECK_LIST |
JSON | Junk mail check configuration, marked as junk if any item exists and fails |
["spf", "dkim", "dmarc"] |
JUNK_MAIL_FORCE_PASS_LIST |
JSON | Junk mail check configuration, marked as junk if any item does not exist or fails |
["spf", "dkim", "dmarc"] |
FORWARD_ADDRESS_LIST |
JSON | Global forward address list, disabled if not configured, all emails will be forwarded to listed addresses when enabled | ["xxx@xxx.com"] |
REMOVE_EXCEED_SIZE_ATTACHMENT |
Text/JSON | If attachment exceeds 2MB, remove it, email may lose some information due to parsing | true |
REMOVE_ALL_ATTACHMENT |
Text/JSON | Remove all attachments, email may lose some information due to parsing | true |
Note
Junk mail checkingandattachment removalrequire email parsing, free tier CPU is limited, may cause large email parsing timeoutIf you want stronger email parsing capabilities
Webhook Related Variables
| Variable Name | Type | Description | Example |
|---|---|---|---|
ENABLE_WEBHOOK |
Text/JSON | Whether to enable webhook | true |
FRONTEND_URL |
Text | Frontend URL, used for sending webhook email URLs | https://xxxx.xxx |
Note
Webhook functionality requires email parsing, free tier CPU is limited, may cause large email parsing timeout
If you want stronger email parsing capabilities
User Related Variables
| Variable Name | Type | Description | Example |
|---|---|---|---|
USER_DEFAULT_ROLE |
Text | Default role for new users, only effective when email verification is enabled | vip |
ADMIN_USER_ROLE |
Text | Admin role configuration, if user role equals ADMIN_USER_ROLE, user can access admin console | admin |
USER_ROLES |
JSON | - | See below |
DISABLE_ANONYMOUS_USER_CREATE_EMAIL |
Text/JSON | Disable anonymous user mailbox creation, if set to true, users can only create addresses after login | true |
NO_LIMIT_SEND_ROLE |
Text | Roles that can send unlimited emails, multiple roles separated by comma vip,admin |
vip |
[!NOTE] USER_ROLES User Role Configuration
- If
domainsis empty,DEFAULT_DOMAINSwill be used- If prefix is null, the default prefix will be used, if prefix is an empty string, no prefix will be used
When deploying through UI, configure
USER_ROLESin this format:[{"domains":["awsl.uk","dreamhunter2333.xyz"],"role":"vip","prefix":"vip"},{"domains":["awsl.uk","dreamhunter2333.xyz"],"role":"admin","prefix":""}]When deploying via CLI, refer to
worker/wrangler.toml.templateand configureUSER_ROLESin this format:[{ domains = ["awsl.uk", "dreamhunter2333.xyz"], role = "vip", prefix = "vip" }, { domains = ["awsl.uk", "dreamhunter2333.xyz"], role = "admin", prefix = "" }]
Web Related Variables
| Variable Name | Type | Description | Example |
|---|---|---|---|
DEFAULT_LANG |
Text | Worker error message default language, zh/en | zh |
TITLE |
Text | Custom frontend page website title, supports html | Custom Title |
ANNOUNCEMENT |
Text | Custom frontend page announcement, supports html | Custom Announcement |
ALWAYS_SHOW_ANNOUNCEMENT |
Text/JSON | Whether to always show announcement (even if unchanged), default false |
true |
COPYRIGHT |
Text | Custom frontend footer text, supports html | Dream Hunter |
ADMIN_CONTACT |
Text | Admin contact information, can be any string, hidden if not configured | xxx@gmail.com |
DISABLE_SHOW_GITHUB |
Text/JSON | Whether to show GitHub link | true |
STATUS_URL |
Text | Status monitoring page URL, shows Status menu button when configured | https://status.example.com |
CF_TURNSTILE_SITE_KEY |
Text/Secret | Turnstile CAPTCHA configuration (for new address creation, registration code, etc.) | xxx |
CF_TURNSTILE_SECRET_KEY |
Text/Secret | Turnstile CAPTCHA configuration (for new address creation, registration code, etc.) | xxx |
ENABLE_GLOBAL_TURNSTILE_CHECK |
Text/JSON | Enable global Turnstile CAPTCHA for all login forms (admin login, user login, address password login), requires Turnstile keys above | true |
Telegram Bot Related Variables
| Variable Name | Type | Description | Example |
|---|---|---|---|
TG_MAX_ADDRESS |
Number | Maximum number of mailboxes that can be bound to telegram bot | 5 |
TG_BOT_INFO |
Text | Optional, telegram BOT_INFO, predefined BOT_INFO can reduce webhook latency | {} |
TG_ALLOW_USER_LANG |
Text/JSON | Allow users to switch language via /lang command, default false |
true |
ENABLE_TG_PUSH_ATTACHMENT |
Boolean | Enable sending email attachments via Telegram push, default false, 50MB per file limit |
true |
Note
Telegram functionality requires email parsing, free tier CPU is limited, may cause large email parsing timeout
If you want stronger email parsing capabilities
Email Forwarding Related Variables
| Variable Name | Type | Description | Example |
|---|---|---|---|
SUBDOMAIN_FORWARD_ADDRESS_LIST |
JSON | Subdomain/rule forwarding configuration, supports filtering by domain and source regex | See below |
[!NOTE] SUBDOMAIN_FORWARD_ADDRESS_LIST Configuration
v1.2.0 added
sourcePatternsandsourceMatchModefields for filtering by sender address regex:
domains: Target domain list, matches all domains if emptyforward: Forward destination addresssourcePatterns: Source address regex list (optional)sourceMatchMode: Match mode,any(match any, default) orall(match all)Regex pattern max length is 200 characters to prevent ReDoS attacks
SUBDOMAIN_FORWARD_ADDRESS_LIST = """ [ {"domains":[""],"forward":"xxx1@xxx.com"}, {"domains":["subdomain-1.domain.com","subdomain-2.domain.com"],"forward":"xxx2@xxx.com"}, {"domains":["example.com"],"forward":"admin@xxx.com","sourcePatterns":[".*@github.com",".*@gitlab.com"],"sourceMatchMode":"any"} ] """
Other Variables
| Variable Name | Type | Description | Example |
|---|---|---|---|
ENABLE_ANOTHER_WORKER |
Text/JSON | Whether to enable other workers to process emails | false |
ANOTHER_WORKER_LIST |
JSON | - Configuration for other workers to process emails, multiple workers can be configured - Filter by keywords, call the bound worker's method (default method name is rpcEmail) - keywords are required, otherwise the worker will not be triggered |
See below |
Note
ANOTHER_WORKER_LISTconfiguration example#ANOTHER_WORKER_LIST =""" #[ # { # "binding":"AUTH_INBOX", # "method":"rpcEmail", # "keywords":[ # "验证码","激活码","激活链接","确认链接","验证邮箱","确认邮件","账号激活","邮件验证","账户确认","安全码","认证码","安全验证","登陆码","确认码","启用账户","激活账户","账号验证","注册确认", # "account","activation","verify","verification","activate","confirmation","email","code","validate","registration","login","code","expire","confirm" # ] # } #] #