maily-server 0.4.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- maily_server-0.4.0/.biome.json +32 -0
- maily_server-0.4.0/.dockerignore +87 -0
- maily_server-0.4.0/.env.example +57 -0
- maily_server-0.4.0/.github/ISSUE_TEMPLATE/bug_report.md +32 -0
- maily_server-0.4.0/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- maily_server-0.4.0/.github/ISSUE_TEMPLATE/provider_outage.md +30 -0
- maily_server-0.4.0/.github/PULL_REQUEST_TEMPLATE.md +24 -0
- maily_server-0.4.0/.github/dependabot.yml +47 -0
- maily_server-0.4.0/.github/labeler.yml +39 -0
- maily_server-0.4.0/.github/provider_health_state.json +39 -0
- maily_server-0.4.0/.github/release-drafter.yml +46 -0
- maily_server-0.4.0/.github/workflows/benchmarks.yml +89 -0
- maily_server-0.4.0/.github/workflows/ci.yml +383 -0
- maily_server-0.4.0/.github/workflows/codeql.yml +53 -0
- maily_server-0.4.0/.github/workflows/commit-lint.yml +35 -0
- maily_server-0.4.0/.github/workflows/dependabot-autofix.yml +69 -0
- maily_server-0.4.0/.github/workflows/docker-publish.yml +163 -0
- maily_server-0.4.0/.github/workflows/gitleaks.yml +48 -0
- maily_server-0.4.0/.github/workflows/labeler.yml +22 -0
- maily_server-0.4.0/.github/workflows/links.yml +45 -0
- maily_server-0.4.0/.github/workflows/load-test.yml +78 -0
- maily_server-0.4.0/.github/workflows/mutation-test.yml +95 -0
- maily_server-0.4.0/.github/workflows/openapi-breaking.yml +68 -0
- maily_server-0.4.0/.github/workflows/pages.yml +84 -0
- maily_server-0.4.0/.github/workflows/pip-audit.yml +105 -0
- maily_server-0.4.0/.github/workflows/pr-benchmark.yml +89 -0
- maily_server-0.4.0/.github/workflows/pr-size.yml +40 -0
- maily_server-0.4.0/.github/workflows/provider-health.yml +76 -0
- maily_server-0.4.0/.github/workflows/provider-pr-check.yml +56 -0
- maily_server-0.4.0/.github/workflows/pypi-publish-client.yml +104 -0
- maily_server-0.4.0/.github/workflows/pypi-publish.yml +100 -0
- maily_server-0.4.0/.github/workflows/release-please.yml +41 -0
- maily_server-0.4.0/.github/workflows/semantic-pr.yml +37 -0
- maily_server-0.4.0/.github/workflows/stale.yml +29 -0
- maily_server-0.4.0/.github/workflows/trivy.yml +73 -0
- maily_server-0.4.0/.github/workflows/zizmor.yml +40 -0
- maily_server-0.4.0/.gitignore +74 -0
- maily_server-0.4.0/.gitleaks.toml +18 -0
- maily_server-0.4.0/.ignore +3 -0
- maily_server-0.4.0/.pre-commit-config.yaml +36 -0
- maily_server-0.4.0/.release-please-manifest.json +3 -0
- maily_server-0.4.0/.trivyignore +16 -0
- maily_server-0.4.0/.typos.toml +23 -0
- maily_server-0.4.0/CHANGELOG.md +124 -0
- maily_server-0.4.0/CODE_OF_CONDUCT.md +72 -0
- maily_server-0.4.0/CONTRIBUTING.md +91 -0
- maily_server-0.4.0/Dockerfile +84 -0
- maily_server-0.4.0/LICENSE +21 -0
- maily_server-0.4.0/PKG-INFO +414 -0
- maily_server-0.4.0/README.md +385 -0
- maily_server-0.4.0/SECURITY.md +35 -0
- maily_server-0.4.0/alembic/env.py +57 -0
- maily_server-0.4.0/alembic/script.py.mako +26 -0
- maily_server-0.4.0/alembic/versions/001_initial.py +90 -0
- maily_server-0.4.0/alembic/versions/002_retention.py +32 -0
- maily_server-0.4.0/alembic/versions/003_app_settings.py +31 -0
- maily_server-0.4.0/alembic/versions/004_domain_cache.py +32 -0
- maily_server-0.4.0/alembic/versions/005_provider_headers.py +32 -0
- maily_server-0.4.0/alembic/versions/006_stats_events.py +42 -0
- maily_server-0.4.0/alembic/versions/007_perf_indexes.py +76 -0
- maily_server-0.4.0/alembic/versions/008_mailbox_address_partial_unique.py +37 -0
- maily_server-0.4.0/alembic/versions/009_api_keys.py +79 -0
- maily_server-0.4.0/alembic/versions/010_stats_events_domain_and_owner.py +48 -0
- maily_server-0.4.0/alembic.ini +38 -0
- maily_server-0.4.0/benchmarks/locustfile.py +71 -0
- maily_server-0.4.0/client/MANIFEST.in +2 -0
- maily_server-0.4.0/client/README.md +388 -0
- maily_server-0.4.0/client/client.py +2434 -0
- maily_server-0.4.0/client/py.typed +0 -0
- maily_server-0.4.0/client/pyproject.toml +43 -0
- maily_server-0.4.0/docker-compose.yml +109 -0
- maily_server-0.4.0/docs/ADDING_PROVIDERS.md +548 -0
- maily_server-0.4.0/docs/CLIENT_GUIDE.md +493 -0
- maily_server-0.4.0/lychee.toml +26 -0
- maily_server-0.4.0/pyproject.toml +157 -0
- maily_server-0.4.0/release-please-config.json +32 -0
- maily_server-0.4.0/scripts/build_client.py +60 -0
- maily_server-0.4.0/scripts/build_pages_site.py +668 -0
- maily_server-0.4.0/scripts/check_diff_coverage.py +253 -0
- maily_server-0.4.0/scripts/check_openapi_breaking.py +230 -0
- maily_server-0.4.0/scripts/check_version_consistency.py +165 -0
- maily_server-0.4.0/scripts/compare_benchmarks.py +193 -0
- maily_server-0.4.0/scripts/generate_ci_dashboard.py +603 -0
- maily_server-0.4.0/scripts/label_pr_size.py +244 -0
- maily_server-0.4.0/scripts/lint_pr_commits.py +190 -0
- maily_server-0.4.0/scripts/pip_audit_to_sarif.py +96 -0
- maily_server-0.4.0/scripts/run_load_test.py +256 -0
- maily_server-0.4.0/scripts/run_mutation_gate.py +342 -0
- maily_server-0.4.0/scripts/test_mail_sender/README.md +129 -0
- maily_server-0.4.0/scripts/test_mail_sender/__init__.py +36 -0
- maily_server-0.4.0/scripts/test_mail_sender/__main__.py +182 -0
- maily_server-0.4.0/scripts/test_mail_sender/exceptions.py +89 -0
- maily_server-0.4.0/scripts/test_mail_sender/fallback.py +156 -0
- maily_server-0.4.0/scripts/test_mail_sender/models.py +37 -0
- maily_server-0.4.0/scripts/test_mail_sender/primary.py +249 -0
- maily_server-0.4.0/scripts/test_mail_sender/sender.py +211 -0
- maily_server-0.4.0/scripts/test_providers_live.py +697 -0
- maily_server-0.4.0/src/maily/__init__.py +9 -0
- maily_server-0.4.0/src/maily/app/__init__.py +0 -0
- maily_server-0.4.0/src/maily/app/authz.py +253 -0
- maily_server-0.4.0/src/maily/app/deps.py +63 -0
- maily_server-0.4.0/src/maily/app/errors.py +92 -0
- maily_server-0.4.0/src/maily/app/main.py +249 -0
- maily_server-0.4.0/src/maily/app/middleware/origin.py +69 -0
- maily_server-0.4.0/src/maily/app/routers/__init__.py +0 -0
- maily_server-0.4.0/src/maily/app/routers/admin.py +397 -0
- maily_server-0.4.0/src/maily/app/routers/gmail.py +252 -0
- maily_server-0.4.0/src/maily/app/routers/health.py +86 -0
- maily_server-0.4.0/src/maily/app/routers/keys.py +270 -0
- maily_server-0.4.0/src/maily/app/routers/mailboxes.py +243 -0
- maily_server-0.4.0/src/maily/app/routers/messages.py +232 -0
- maily_server-0.4.0/src/maily/app/routers/providers.py +73 -0
- maily_server-0.4.0/src/maily/app/schemas.py +162 -0
- maily_server-0.4.0/src/maily/app/services/__init__.py +0 -0
- maily_server-0.4.0/src/maily/app/services/domain_cache.py +308 -0
- maily_server-0.4.0/src/maily/app/services/gmail_config.py +82 -0
- maily_server-0.4.0/src/maily/app/services/keys.py +279 -0
- maily_server-0.4.0/src/maily/app/services/mailboxes.py +235 -0
- maily_server-0.4.0/src/maily/app/services/provider_headers.py +149 -0
- maily_server-0.4.0/src/maily/app/services/retention.py +372 -0
- maily_server-0.4.0/src/maily/app/services/retention_rules.py +95 -0
- maily_server-0.4.0/src/maily/app/services/scoped_history.py +254 -0
- maily_server-0.4.0/src/maily/app/services/scoped_stats.py +169 -0
- maily_server-0.4.0/src/maily/app/services/stats_history.py +225 -0
- maily_server-0.4.0/src/maily/client.py +147 -0
- maily_server-0.4.0/src/maily/crypto.py +43 -0
- maily_server-0.4.0/src/maily/db/__init__.py +18 -0
- maily_server-0.4.0/src/maily/db/engine.py +89 -0
- maily_server-0.4.0/src/maily/db/maintenance.py +254 -0
- maily_server-0.4.0/src/maily/db/models.py +229 -0
- maily_server-0.4.0/src/maily/exceptions.py +43 -0
- maily_server-0.4.0/src/maily/http.py +90 -0
- maily_server-0.4.0/src/maily/providers/__init__.py +41 -0
- maily_server-0.4.0/src/maily/providers/anonymmail_net/__init__.py +3 -0
- maily_server-0.4.0/src/maily/providers/anonymmail_net/service.py +506 -0
- maily_server-0.4.0/src/maily/providers/base.py +253 -0
- maily_server-0.4.0/src/maily/providers/dispoemail_org/__init__.py +3 -0
- maily_server-0.4.0/src/maily/providers/dispoemail_org/service.py +370 -0
- maily_server-0.4.0/src/maily/providers/gmail/__init__.py +13 -0
- maily_server-0.4.0/src/maily/providers/gmail/db_store.py +126 -0
- maily_server-0.4.0/src/maily/providers/gmail/oauth.py +128 -0
- maily_server-0.4.0/src/maily/providers/gmail/parse.py +189 -0
- maily_server-0.4.0/src/maily/providers/gmail/service.py +330 -0
- maily_server-0.4.0/src/maily/providers/gmail/store.py +69 -0
- maily_server-0.4.0/src/maily/providers/mailtm/__init__.py +3 -0
- maily_server-0.4.0/src/maily/providers/mailtm/service.py +262 -0
- maily_server-0.4.0/src/maily/providers/noopmail_org/__init__.py +3 -0
- maily_server-0.4.0/src/maily/providers/noopmail_org/service.py +215 -0
- maily_server-0.4.0/src/maily/providers/registry.py +121 -0
- maily_server-0.4.0/src/maily/providers/temp_tf/__init__.py +3 -0
- maily_server-0.4.0/src/maily/providers/temp_tf/service.py +490 -0
- maily_server-0.4.0/src/maily/providers/tempmail_io/__init__.py +3 -0
- maily_server-0.4.0/src/maily/providers/tempmail_io/headers.py +59 -0
- maily_server-0.4.0/src/maily/providers/tempmail_io/service.py +228 -0
- maily_server-0.4.0/src/maily/providers/tempmail_plus/__init__.py +3 -0
- maily_server-0.4.0/src/maily/providers/tempmail_plus/service.py +259 -0
- maily_server-0.4.0/src/maily/py.typed +0 -0
- maily_server-0.4.0/src/maily/schemas.py +166 -0
- maily_server-0.4.0/src/maily/sdk.py +71 -0
- maily_server-0.4.0/src/maily/settings.py +103 -0
- maily_server-0.4.0/src/maily/standalone_client.py +2431 -0
- maily_server-0.4.0/src/maily/static/css/main.css +1139 -0
- maily_server-0.4.0/src/maily/static/docs.html +789 -0
- maily_server-0.4.0/src/maily/static/index.html +148 -0
- maily_server-0.4.0/src/maily/static/js/api.js +224 -0
- maily_server-0.4.0/src/maily/static/js/app.js +370 -0
- maily_server-0.4.0/src/maily/static/js/pages/access.js +168 -0
- maily_server-0.4.0/src/maily/static/js/pages/detail.js +630 -0
- maily_server-0.4.0/src/maily/static/js/pages/domain-cache.js +160 -0
- maily_server-0.4.0/src/maily/static/js/pages/gmail.js +483 -0
- maily_server-0.4.0/src/maily/static/js/pages/keys.js +614 -0
- maily_server-0.4.0/src/maily/static/js/pages/mailboxes.js +520 -0
- maily_server-0.4.0/src/maily/static/js/pages/overview.js +687 -0
- maily_server-0.4.0/src/maily/static/js/pages/retention.js +163 -0
- maily_server-0.4.0/src/maily/static/js/ui.js +273 -0
- maily_server-0.4.0/src/maily/utils/__init__.py +4 -0
- maily_server-0.4.0/src/maily/utils/misc.py +15 -0
- maily_server-0.4.0/src/maily/utils/retry.py +68 -0
- maily_server-0.4.0/tests/__init__.py +0 -0
- maily_server-0.4.0/tests/api_keys_support.py +183 -0
- maily_server-0.4.0/tests/conftest.py +7 -0
- maily_server-0.4.0/tests/helpers.py +102 -0
- maily_server-0.4.0/tests/test_admin.py +429 -0
- maily_server-0.4.0/tests/test_anonymmail_net.py +583 -0
- maily_server-0.4.0/tests/test_api_key_models.py +84 -0
- maily_server-0.4.0/tests/test_api_keys.py +384 -0
- maily_server-0.4.0/tests/test_app.py +257 -0
- maily_server-0.4.0/tests/test_authz.py +557 -0
- maily_server-0.4.0/tests/test_authz_properties.py +456 -0
- maily_server-0.4.0/tests/test_benchmarks.py +250 -0
- maily_server-0.4.0/tests/test_client.py +2220 -0
- maily_server-0.4.0/tests/test_client_standalone.py +427 -0
- maily_server-0.4.0/tests/test_concurrency.py +173 -0
- maily_server-0.4.0/tests/test_crypto.py +72 -0
- maily_server-0.4.0/tests/test_db_maintenance.py +229 -0
- maily_server-0.4.0/tests/test_dispoemail_org.py +476 -0
- maily_server-0.4.0/tests/test_domain_cache.py +344 -0
- maily_server-0.4.0/tests/test_gmail.py +426 -0
- maily_server-0.4.0/tests/test_gmail_parents_scope.py +346 -0
- maily_server-0.4.0/tests/test_gmail_plus_alias.py +309 -0
- maily_server-0.4.0/tests/test_http.py +56 -0
- maily_server-0.4.0/tests/test_keys_router.py +170 -0
- maily_server-0.4.0/tests/test_keys_service.py +350 -0
- maily_server-0.4.0/tests/test_mail_sender.py +234 -0
- maily_server-0.4.0/tests/test_mailbox_ownership.py +280 -0
- maily_server-0.4.0/tests/test_mailboxes_service.py +310 -0
- maily_server-0.4.0/tests/test_mailtm.py +226 -0
- maily_server-0.4.0/tests/test_memory_leaks.py +107 -0
- maily_server-0.4.0/tests/test_messages_api.py +124 -0
- maily_server-0.4.0/tests/test_misc.py +66 -0
- maily_server-0.4.0/tests/test_noopmail_org.py +407 -0
- maily_server-0.4.0/tests/test_provider_architecture.py +110 -0
- maily_server-0.4.0/tests/test_provider_faults.py +76 -0
- maily_server-0.4.0/tests/test_retention_lifecycle.py +262 -0
- maily_server-0.4.0/tests/test_retention_scope.py +627 -0
- maily_server-0.4.0/tests/test_retry.py +211 -0
- maily_server-0.4.0/tests/test_scope_filters.py +299 -0
- maily_server-0.4.0/tests/test_sdk.py +112 -0
- maily_server-0.4.0/tests/test_security_routing.py +192 -0
- maily_server-0.4.0/tests/test_seen.py +86 -0
- maily_server-0.4.0/tests/test_stats_retention_history.py +422 -0
- maily_server-0.4.0/tests/test_temp_tf.py +610 -0
- maily_server-0.4.0/tests/test_tempmail.py +260 -0
- maily_server-0.4.0/tests/test_tempmail_io.py +331 -0
- maily_server-0.4.0/uv.lock +2372 -0
- maily_server-0.4.0/zizmor.yml +59 -0
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"formatter": {
|
|
3
|
+
"enabled": false
|
|
4
|
+
},
|
|
5
|
+
"linter": {
|
|
6
|
+
"enabled": true,
|
|
7
|
+
"rules": {
|
|
8
|
+
"preset": "recommended",
|
|
9
|
+
"style": {
|
|
10
|
+
"useConst": "warn",
|
|
11
|
+
"noNonNullAssertion": "off",
|
|
12
|
+
"useTemplate": "off"
|
|
13
|
+
},
|
|
14
|
+
"complexity": {
|
|
15
|
+
"useOptionalChain": "off"
|
|
16
|
+
},
|
|
17
|
+
"correctness": {
|
|
18
|
+
"noUnusedVariables": "warn",
|
|
19
|
+
"noUnusedFunctionParameters": "off"
|
|
20
|
+
},
|
|
21
|
+
"suspicious": {
|
|
22
|
+
"noExplicitAny": "off",
|
|
23
|
+
"useIterableCallbackReturn": "off"
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
"files": {
|
|
28
|
+
"includes": [
|
|
29
|
+
"src/maily/static/js/**"
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# ==============================================================================
|
|
2
|
+
# Docker Ignore Rules for maily
|
|
3
|
+
# ==============================================================================
|
|
4
|
+
|
|
5
|
+
# Git & VCS
|
|
6
|
+
.git/
|
|
7
|
+
.gitignore
|
|
8
|
+
.gitattributes
|
|
9
|
+
.github/
|
|
10
|
+
|
|
11
|
+
# Python cache & build artifacts
|
|
12
|
+
__pycache__/
|
|
13
|
+
*.py[cod]
|
|
14
|
+
*$py.class
|
|
15
|
+
*.so
|
|
16
|
+
.Python
|
|
17
|
+
build/
|
|
18
|
+
develop-eggs/
|
|
19
|
+
dist/
|
|
20
|
+
downloads/
|
|
21
|
+
eggs/
|
|
22
|
+
.eggs/
|
|
23
|
+
lib/
|
|
24
|
+
lib64/
|
|
25
|
+
parts/
|
|
26
|
+
sdist/
|
|
27
|
+
var/
|
|
28
|
+
wheels/
|
|
29
|
+
*.egg-info/
|
|
30
|
+
.installed.cfg
|
|
31
|
+
*.egg
|
|
32
|
+
|
|
33
|
+
# Virtual environments
|
|
34
|
+
.venv/
|
|
35
|
+
venv/
|
|
36
|
+
env/
|
|
37
|
+
ENV/
|
|
38
|
+
|
|
39
|
+
# Secrets and environment configurations
|
|
40
|
+
.env
|
|
41
|
+
.env.*
|
|
42
|
+
!.env.example
|
|
43
|
+
mailtm.key
|
|
44
|
+
|
|
45
|
+
# Local SQLite databases & data files
|
|
46
|
+
data/
|
|
47
|
+
*.db
|
|
48
|
+
*.db-shm
|
|
49
|
+
*.db-wal
|
|
50
|
+
*.sqlite
|
|
51
|
+
*.sqlite3
|
|
52
|
+
|
|
53
|
+
# Logs
|
|
54
|
+
*.log
|
|
55
|
+
logs/
|
|
56
|
+
|
|
57
|
+
# Testing, typing & linting caches
|
|
58
|
+
.pytest_cache/
|
|
59
|
+
.ruff_cache/
|
|
60
|
+
.mypy_cache/
|
|
61
|
+
.coverage
|
|
62
|
+
htmlcov/
|
|
63
|
+
tests/
|
|
64
|
+
.playwright-mcp/
|
|
65
|
+
|
|
66
|
+
# IDE, Editor & OS files
|
|
67
|
+
.idea/
|
|
68
|
+
.vscode/
|
|
69
|
+
*.swp
|
|
70
|
+
*.swo
|
|
71
|
+
*~
|
|
72
|
+
.DS_Store
|
|
73
|
+
Thumbs.db
|
|
74
|
+
|
|
75
|
+
# Documentation, scratch and tool caches
|
|
76
|
+
docs/
|
|
77
|
+
overview.png
|
|
78
|
+
ADDING_PROVIDERS.md
|
|
79
|
+
.codegraph/
|
|
80
|
+
.omo/
|
|
81
|
+
.ignore
|
|
82
|
+
CACHEDIR.TAG
|
|
83
|
+
run-continuation
|
|
84
|
+
3.10/
|
|
85
|
+
0.16.8/
|
|
86
|
+
0.17.2/
|
|
87
|
+
v/
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# ============ maily โ environment example ============
|
|
2
|
+
# Copy to .env and fill in your values.
|
|
3
|
+
# Without .env the service runs with defaults (empty API key, sqlite in CWD).
|
|
4
|
+
|
|
5
|
+
# --- General ---
|
|
6
|
+
# HTTP server host/port. Inside a Docker container the host must be 0.0.0.0.
|
|
7
|
+
MAILY_HOST=0.0.0.0
|
|
8
|
+
MAILY_PORT=8477
|
|
9
|
+
|
|
10
|
+
# API key. When set, all requests require the X-API-Key header.
|
|
11
|
+
# Leave empty for unauthenticated access (local/trusted network).
|
|
12
|
+
MAILY_API_KEY=
|
|
13
|
+
# MAILY_API_KEY=sk-your-secret-key
|
|
14
|
+
|
|
15
|
+
# Path to SQLite database (defaults to maily.db in current working directory).
|
|
16
|
+
# In Docker, volume /data is already mounted via docker-compose.
|
|
17
|
+
# MAILY_DATABASE_URL=sqlite+aiosqlite:///maily.db
|
|
18
|
+
# MAILY_DATABASE_URL=sqlite+aiosqlite:////data/maily.db
|
|
19
|
+
|
|
20
|
+
# Encryption key (Fernet). If empty, auto-generated and saved to maily.key.
|
|
21
|
+
# MAILY_SECRET_KEY=
|
|
22
|
+
|
|
23
|
+
# Proxy for outbound requests to email providers (optional).
|
|
24
|
+
# MAILY_PROXY=http://user:pass@127.0.0.1:8080
|
|
25
|
+
|
|
26
|
+
# Retention auto-cleanup interval in seconds.
|
|
27
|
+
MAILY_RETENTION_INTERVAL_SECONDS=60
|
|
28
|
+
|
|
29
|
+
# Database maintenance (VACUUM, REINDEX, ANALYZE, PRAGMA checkpoint/optimize):
|
|
30
|
+
# Whether DB maintenance is enabled during retention runs.
|
|
31
|
+
# MAILY_DB_MAINTENANCE_ENABLED=true
|
|
32
|
+
# Minimum maintenance interval in minutes (run at most once per X minutes; skipped on more frequent retention runs).
|
|
33
|
+
# MAILY_DB_MAINTENANCE_INTERVAL_MINUTES=60
|
|
34
|
+
# SQLite busy timeout in milliseconds (app waits for DB locks to release without crashing).
|
|
35
|
+
# MAILY_SQLITE_BUSY_TIMEOUT_MS=60000
|
|
36
|
+
|
|
37
|
+
# --- Gmail OAuth (optional; alternative: configure creds via admin UI) ---
|
|
38
|
+
# MAILY_GMAIL_CLIENT_ID=1234567890-abc.apps.googleusercontent.com
|
|
39
|
+
# MAILY_GMAIL_CLIENT_SECRET=GOCSPX-your-secret
|
|
40
|
+
# MAILY_GMAIL_REDIRECT_URI=http://127.0.0.1:8477/v1/gmail/oauth/callback
|
|
41
|
+
|
|
42
|
+
# --- Dynamic X-CORS-Header for temp-mail.io provider ---
|
|
43
|
+
# Origin from which the X-CORS-Header secret is parsed (service homepage).
|
|
44
|
+
# MAILY_TEMPMAIL_IO_ORIGIN=https://temp-mail.io
|
|
45
|
+
# Manual secret override (takes precedence over cache/fetch). Usually not needed.
|
|
46
|
+
# MAILY_TEMPMAIL_IO_CORS_HEADER=
|
|
47
|
+
# TTL for cached header values in DB, seconds.
|
|
48
|
+
MAILY_PROVIDER_HEADERS_TTL_SECONDS=21600
|
|
49
|
+
|
|
50
|
+
# --- temp.tf provider ---
|
|
51
|
+
# Allow dot-aliases for Gmail addresses (user.name@gmail.com)
|
|
52
|
+
# MAILY_TEMP_TF_GMAIL_DOT=true
|
|
53
|
+
# Allow plus-aliases for Gmail addresses (user+tag@gmail.com)
|
|
54
|
+
# MAILY_TEMP_TF_GMAIL_PLUS=true
|
|
55
|
+
|
|
56
|
+
# --- docker-compose: port exposure ---
|
|
57
|
+
# MAILY_PORT=8477 # same port published by compose (8477:8477)
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Bug Report
|
|
3
|
+
about: Create a report to help us improve maily
|
|
4
|
+
title: "fix: "
|
|
5
|
+
labels: ["bug"]
|
|
6
|
+
assignees: []
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Describe the Bug
|
|
10
|
+
|
|
11
|
+
A clear and concise description of what the bug is.
|
|
12
|
+
|
|
13
|
+
## Steps to Reproduce
|
|
14
|
+
|
|
15
|
+
1. Start server with `...`
|
|
16
|
+
2. Run client method `...`
|
|
17
|
+
3. See error
|
|
18
|
+
|
|
19
|
+
## Expected Behavior
|
|
20
|
+
|
|
21
|
+
A clear and concise description of what you expected to happen.
|
|
22
|
+
|
|
23
|
+
## Environment & Versions
|
|
24
|
+
|
|
25
|
+
- OS: [e.g. Ubuntu 24.04, macOS Sonoma, Windows 11]
|
|
26
|
+
- Python Version: [e.g. 3.13.2]
|
|
27
|
+
- `maily` Version: [e.g. 0.3.0]
|
|
28
|
+
- Mode: [e.g. Docker, standalone client, local python]
|
|
29
|
+
|
|
30
|
+
## Additional Context
|
|
31
|
+
|
|
32
|
+
Add any other context, logs, or screenshots here.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Feature Request
|
|
3
|
+
about: Suggest an idea or enhancement for maily
|
|
4
|
+
title: "feat: "
|
|
5
|
+
labels: ["enhancement"]
|
|
6
|
+
assignees: []
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Is your feature request related to a problem? Please describe.
|
|
10
|
+
|
|
11
|
+
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
|
12
|
+
|
|
13
|
+
## Describe the Solution You'd Like
|
|
14
|
+
|
|
15
|
+
A clear and concise description of what you want to happen.
|
|
16
|
+
|
|
17
|
+
## Describe Alternatives You've Considered
|
|
18
|
+
|
|
19
|
+
A clear and concise description of any alternative solutions or features you've considered.
|
|
20
|
+
|
|
21
|
+
## Additional Context
|
|
22
|
+
|
|
23
|
+
Add any other context, API design sketches, or screenshots about the feature request here.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Provider Outage Report
|
|
3
|
+
about: Automated or manual alert for external mail provider degradation
|
|
4
|
+
title: '[Provider Outage] <Provider Name> (<slug>) health checks failing'
|
|
5
|
+
labels: ['bug', 'provider-outage', 'automated-health']
|
|
6
|
+
assignees: ''
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ๐จ Provider Outage Alert
|
|
10
|
+
|
|
11
|
+
### ๐ Outage Summary
|
|
12
|
+
* **Provider:** `<Provider Name>` (`<provider.slug>`)
|
|
13
|
+
* **Consecutive Failures:** 3+
|
|
14
|
+
* **Detected At:** `YYYY-MM-DD HH:MM UTC`
|
|
15
|
+
* **Trigger:** Scheduled Health Suite / PR Verification
|
|
16
|
+
|
|
17
|
+
### โ Failure Diagnostic
|
|
18
|
+
* **Failed Stage:** `list_targets` / `create_mailbox` / `list_messages` / `email_delivery`
|
|
19
|
+
* **Error Message:** `<error message>`
|
|
20
|
+
* **Mailbox Tested:** `<address>`
|
|
21
|
+
|
|
22
|
+
### ๐ Diagnostic Logs & Trace
|
|
23
|
+
```
|
|
24
|
+
<paste error logs or stack trace here>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### ๐ ๏ธ Recommended Actions
|
|
28
|
+
1. Check if the upstream provider website is currently online or undergoing DDoS/maintenance.
|
|
29
|
+
2. Verify if upstream HTML structure, CSRF tokens, or API signatures changed.
|
|
30
|
+
3. Check if IP ranges from GitHub Actions / CI runners are being blocked.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
|
|
3
|
+
<!-- Provide a brief description of the changes introduced by this pull request. -->
|
|
4
|
+
|
|
5
|
+
## Type of Change
|
|
6
|
+
|
|
7
|
+
- [ ] ๐ Bug fix (non-breaking change fixing an issue)
|
|
8
|
+
- [ ] โจ New feature (non-breaking change adding functionality)
|
|
9
|
+
- [ ] ๐ฅ Breaking change (fix or feature causing existing functionality to change)
|
|
10
|
+
- [ ] ๐ Documentation update
|
|
11
|
+
- [ ] โก Performance improvement
|
|
12
|
+
- [ ] โป๏ธ Code refactoring
|
|
13
|
+
- [ ] ๐ท CI / Build changes
|
|
14
|
+
- [ ] ๐งช Tests
|
|
15
|
+
|
|
16
|
+
## Checklist
|
|
17
|
+
|
|
18
|
+
- [ ] My commit messages and PR title follow [Conventional Commits](https://www.conventionalcommits.org/)
|
|
19
|
+
- [ ] I have run `uv run pytest` and all tests pass
|
|
20
|
+
- [ ] I have run `uv run ruff check .` and `uv run ruff format --check .`
|
|
21
|
+
- [ ] I have run `uv run mypy src client scripts` without typing errors
|
|
22
|
+
- [ ] If changing `src/maily/standalone_client.py`, I have run `uv run python scripts/build_client.py`
|
|
23
|
+
- [ ] Documentation has been updated accordingly
|
|
24
|
+
- [ ] No sensitive credentials, private keys, or tokens are committed
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
updates:
|
|
3
|
+
- package-ecosystem: "github-actions"
|
|
4
|
+
directory: "/"
|
|
5
|
+
schedule:
|
|
6
|
+
interval: "weekly"
|
|
7
|
+
open-pull-requests-limit: 10
|
|
8
|
+
commit-message:
|
|
9
|
+
prefix: "ci(actions)"
|
|
10
|
+
groups:
|
|
11
|
+
github-actions:
|
|
12
|
+
patterns: ["*"]
|
|
13
|
+
|
|
14
|
+
- package-ecosystem: "pip"
|
|
15
|
+
directory: "/"
|
|
16
|
+
schedule:
|
|
17
|
+
interval: "weekly"
|
|
18
|
+
open-pull-requests-limit: 10
|
|
19
|
+
commit-message:
|
|
20
|
+
prefix: "deps"
|
|
21
|
+
groups:
|
|
22
|
+
dev-dependencies:
|
|
23
|
+
patterns:
|
|
24
|
+
- "ruff*"
|
|
25
|
+
- "mypy*"
|
|
26
|
+
- "pytest*"
|
|
27
|
+
- "coverage*"
|
|
28
|
+
- "deptry*"
|
|
29
|
+
- "vulture*"
|
|
30
|
+
- "mutmut*"
|
|
31
|
+
fastapi-stack:
|
|
32
|
+
patterns:
|
|
33
|
+
- "fastapi*"
|
|
34
|
+
- "uvicorn*"
|
|
35
|
+
- "starlette*"
|
|
36
|
+
- "pydantic*"
|
|
37
|
+
- "sqlalchemy*"
|
|
38
|
+
- "alembic*"
|
|
39
|
+
- "aiosqlite*"
|
|
40
|
+
|
|
41
|
+
- package-ecosystem: "docker"
|
|
42
|
+
directory: "/"
|
|
43
|
+
schedule:
|
|
44
|
+
interval: "weekly"
|
|
45
|
+
open-pull-requests-limit: 5
|
|
46
|
+
commit-message:
|
|
47
|
+
prefix: "docker"
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
area:core:
|
|
2
|
+
- changed-files:
|
|
3
|
+
- any-glob-to-any-file: ['src/maily/app/**', 'src/maily/settings.py', 'src/maily/crypto.py']
|
|
4
|
+
|
|
5
|
+
area:db:
|
|
6
|
+
- changed-files:
|
|
7
|
+
- any-glob-to-any-file: ['src/maily/db/**', 'alembic/**']
|
|
8
|
+
|
|
9
|
+
area:providers:
|
|
10
|
+
- changed-files:
|
|
11
|
+
- any-glob-to-any-file: ['src/maily/providers/**']
|
|
12
|
+
|
|
13
|
+
area:frontend:
|
|
14
|
+
- changed-files:
|
|
15
|
+
- any-glob-to-any-file: ['src/maily/static/**']
|
|
16
|
+
|
|
17
|
+
area:tests:
|
|
18
|
+
- changed-files:
|
|
19
|
+
- any-glob-to-any-file: ['tests/**']
|
|
20
|
+
|
|
21
|
+
area:client:
|
|
22
|
+
- changed-files:
|
|
23
|
+
- any-glob-to-any-file: ['client/**', 'src/maily/standalone_client.py', 'scripts/build_client.py']
|
|
24
|
+
|
|
25
|
+
area:docs:
|
|
26
|
+
- changed-files:
|
|
27
|
+
- any-glob-to-any-file: ['docs/**', '*.md', '.github/workflows/pages.yml']
|
|
28
|
+
|
|
29
|
+
area:ci:
|
|
30
|
+
- changed-files:
|
|
31
|
+
- any-glob-to-any-file: ['.github/**', 'Dockerfile', 'docker-compose.yml', 'pyproject.toml']
|
|
32
|
+
|
|
33
|
+
security:
|
|
34
|
+
- changed-files:
|
|
35
|
+
- any-glob-to-any-file: ['src/maily/crypto.py', '.github/workflows/*audit*.yml', '.github/workflows/*gitleaks*.yml', '.github/workflows/*trivy*.yml', '.github/workflows/*codeql*.yml']
|
|
36
|
+
|
|
37
|
+
dependencies:
|
|
38
|
+
- changed-files:
|
|
39
|
+
- any-glob-to-any-file: ['uv.lock', 'pyproject.toml']
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"providers": {
|
|
3
|
+
"anonymmail.net": {
|
|
4
|
+
"consecutive_failures": 0,
|
|
5
|
+
"issue_number": null,
|
|
6
|
+
"last_status": "operational"
|
|
7
|
+
},
|
|
8
|
+
"dispoemail.org": {
|
|
9
|
+
"consecutive_failures": 0,
|
|
10
|
+
"issue_number": null,
|
|
11
|
+
"last_status": "operational"
|
|
12
|
+
},
|
|
13
|
+
"mail.tm": {
|
|
14
|
+
"consecutive_failures": 0,
|
|
15
|
+
"issue_number": null,
|
|
16
|
+
"last_status": "operational"
|
|
17
|
+
},
|
|
18
|
+
"noopmail.org": {
|
|
19
|
+
"consecutive_failures": 1,
|
|
20
|
+
"issue_number": null,
|
|
21
|
+
"last_status": "degraded"
|
|
22
|
+
},
|
|
23
|
+
"temp-mail.io": {
|
|
24
|
+
"consecutive_failures": 0,
|
|
25
|
+
"issue_number": null,
|
|
26
|
+
"last_status": "operational"
|
|
27
|
+
},
|
|
28
|
+
"temp.tf": {
|
|
29
|
+
"consecutive_failures": 0,
|
|
30
|
+
"issue_number": null,
|
|
31
|
+
"last_status": "operational"
|
|
32
|
+
},
|
|
33
|
+
"tempmail.plus": {
|
|
34
|
+
"consecutive_failures": 0,
|
|
35
|
+
"issue_number": null,
|
|
36
|
+
"last_status": "operational"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
name-template: 'v$RESOLVED_VERSION'
|
|
2
|
+
tag-template: 'v$RESOLVED_VERSION'
|
|
3
|
+
|
|
4
|
+
categories:
|
|
5
|
+
- title: '๐ Features & Enhancements'
|
|
6
|
+
semver-increment: minor
|
|
7
|
+
when:
|
|
8
|
+
labels:
|
|
9
|
+
- 'feature'
|
|
10
|
+
- 'enhancement'
|
|
11
|
+
- 'area:core'
|
|
12
|
+
- 'area:providers'
|
|
13
|
+
- title: '๐ Bug Fixes'
|
|
14
|
+
semver-increment: patch
|
|
15
|
+
when:
|
|
16
|
+
labels:
|
|
17
|
+
- 'bug'
|
|
18
|
+
- 'fix'
|
|
19
|
+
- title: '๐ Security Updates'
|
|
20
|
+
semver-increment: patch
|
|
21
|
+
when:
|
|
22
|
+
labels:
|
|
23
|
+
- 'security'
|
|
24
|
+
- title: '๐งน Maintenance & Dependencies'
|
|
25
|
+
semver-increment: patch
|
|
26
|
+
when:
|
|
27
|
+
labels:
|
|
28
|
+
- 'dependencies'
|
|
29
|
+
- 'area:ci'
|
|
30
|
+
- 'chore'
|
|
31
|
+
- type: 'version-resolver'
|
|
32
|
+
semver-increment: 'major'
|
|
33
|
+
when:
|
|
34
|
+
labels:
|
|
35
|
+
- 'major'
|
|
36
|
+
- 'breaking-change'
|
|
37
|
+
|
|
38
|
+
version-resolver:
|
|
39
|
+
default: patch
|
|
40
|
+
|
|
41
|
+
template: |
|
|
42
|
+
## What's Changed
|
|
43
|
+
|
|
44
|
+
$CHANGES
|
|
45
|
+
|
|
46
|
+
**Full Changelog**: https://github.com/$OWNER/$REPOSITORY/compare/$PREVIOUS_TAG...$RESOLVED_TAG
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
name: Performance Benchmarks Tracking
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
schedule:
|
|
7
|
+
- cron: '0 2 * * *' # Daily at 02:00 UTC
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
concurrency:
|
|
11
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
12
|
+
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: write
|
|
16
|
+
deployments: write
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
benchmark:
|
|
20
|
+
name: API & Database Benchmarks
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
timeout-minutes: 15
|
|
23
|
+
steps:
|
|
24
|
+
- name: Checkout repository
|
|
25
|
+
uses: actions/checkout@v7
|
|
26
|
+
|
|
27
|
+
- name: Install uv
|
|
28
|
+
uses: astral-sh/setup-uv@v7
|
|
29
|
+
with:
|
|
30
|
+
enable-cache: true
|
|
31
|
+
|
|
32
|
+
- name: Set up Python
|
|
33
|
+
uses: actions/setup-python@v7
|
|
34
|
+
with:
|
|
35
|
+
python-version: "3.15"
|
|
36
|
+
|
|
37
|
+
- name: Install dependencies
|
|
38
|
+
run: uv sync --frozen --all-extras
|
|
39
|
+
|
|
40
|
+
- name: Run Pytest Benchmarks
|
|
41
|
+
run: |
|
|
42
|
+
uv run pytest tests/test_benchmarks.py -n 0 --benchmark-only --benchmark-json=output.json
|
|
43
|
+
|
|
44
|
+
- name: Render Benchmark Summary Table
|
|
45
|
+
if: always() && hashFiles('output.json') != ''
|
|
46
|
+
run: |
|
|
47
|
+
python3 -c "
|
|
48
|
+
import json, os
|
|
49
|
+
with open('output.json') as f:
|
|
50
|
+
data = json.load(f)
|
|
51
|
+
summary = os.environ.get('GITHUB_STEP_SUMMARY')
|
|
52
|
+
if summary and 'benchmarks' in data:
|
|
53
|
+
with open(summary, 'a', encoding='utf-8') as sf:
|
|
54
|
+
sf.write('### โก Benchmark Results\n\n')
|
|
55
|
+
sf.write('| Benchmark | Group | Mean (ms) | Ops/sec | Rounds |\n')
|
|
56
|
+
sf.write('| :--- | :--- | :---: | :---: | :---: |\n')
|
|
57
|
+
for b in data['benchmarks']:
|
|
58
|
+
name = b.get('name', 'unknown')
|
|
59
|
+
group = b.get('group', 'default') or 'default'
|
|
60
|
+
stats = b.get('stats', {})
|
|
61
|
+
mean_ms = f\"{stats.get('mean', 0) * 1000:.3f}\"
|
|
62
|
+
ops = f\"{stats.get('ops', 0):,.1f}\"
|
|
63
|
+
rounds = stats.get('rounds', 0)
|
|
64
|
+
sf.write(f'| `{name}` | {group} | {mean_ms} | {ops} | {rounds} |\n')
|
|
65
|
+
"
|
|
66
|
+
|
|
67
|
+
- name: Upload Benchmark JSON Artifact
|
|
68
|
+
uses: actions/upload-artifact@v7
|
|
69
|
+
if: always() && hashFiles('output.json') != ''
|
|
70
|
+
with:
|
|
71
|
+
name: benchmark-results
|
|
72
|
+
path: output.json
|
|
73
|
+
retention-days: 14
|
|
74
|
+
|
|
75
|
+
- name: Store benchmark results
|
|
76
|
+
uses: benchmark-action/github-action-benchmark@v1
|
|
77
|
+
if: always() && hashFiles('output.json') != ''
|
|
78
|
+
continue-on-error: true
|
|
79
|
+
with:
|
|
80
|
+
tool: 'pytest'
|
|
81
|
+
output-file-path: output.json
|
|
82
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
83
|
+
auto-push: true
|
|
84
|
+
gh-pages-branch: 'gh-pages'
|
|
85
|
+
benchmark-data-dir-path: 'dev/bench'
|
|
86
|
+
summary-always: true
|
|
87
|
+
alert-threshold: '150%'
|
|
88
|
+
fail-on-alert: false
|
|
89
|
+
comment-on-alert: false
|