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.
Files changed (226) hide show
  1. maily_server-0.4.0/.biome.json +32 -0
  2. maily_server-0.4.0/.dockerignore +87 -0
  3. maily_server-0.4.0/.env.example +57 -0
  4. maily_server-0.4.0/.github/ISSUE_TEMPLATE/bug_report.md +32 -0
  5. maily_server-0.4.0/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  6. maily_server-0.4.0/.github/ISSUE_TEMPLATE/provider_outage.md +30 -0
  7. maily_server-0.4.0/.github/PULL_REQUEST_TEMPLATE.md +24 -0
  8. maily_server-0.4.0/.github/dependabot.yml +47 -0
  9. maily_server-0.4.0/.github/labeler.yml +39 -0
  10. maily_server-0.4.0/.github/provider_health_state.json +39 -0
  11. maily_server-0.4.0/.github/release-drafter.yml +46 -0
  12. maily_server-0.4.0/.github/workflows/benchmarks.yml +89 -0
  13. maily_server-0.4.0/.github/workflows/ci.yml +383 -0
  14. maily_server-0.4.0/.github/workflows/codeql.yml +53 -0
  15. maily_server-0.4.0/.github/workflows/commit-lint.yml +35 -0
  16. maily_server-0.4.0/.github/workflows/dependabot-autofix.yml +69 -0
  17. maily_server-0.4.0/.github/workflows/docker-publish.yml +163 -0
  18. maily_server-0.4.0/.github/workflows/gitleaks.yml +48 -0
  19. maily_server-0.4.0/.github/workflows/labeler.yml +22 -0
  20. maily_server-0.4.0/.github/workflows/links.yml +45 -0
  21. maily_server-0.4.0/.github/workflows/load-test.yml +78 -0
  22. maily_server-0.4.0/.github/workflows/mutation-test.yml +95 -0
  23. maily_server-0.4.0/.github/workflows/openapi-breaking.yml +68 -0
  24. maily_server-0.4.0/.github/workflows/pages.yml +84 -0
  25. maily_server-0.4.0/.github/workflows/pip-audit.yml +105 -0
  26. maily_server-0.4.0/.github/workflows/pr-benchmark.yml +89 -0
  27. maily_server-0.4.0/.github/workflows/pr-size.yml +40 -0
  28. maily_server-0.4.0/.github/workflows/provider-health.yml +76 -0
  29. maily_server-0.4.0/.github/workflows/provider-pr-check.yml +56 -0
  30. maily_server-0.4.0/.github/workflows/pypi-publish-client.yml +104 -0
  31. maily_server-0.4.0/.github/workflows/pypi-publish.yml +100 -0
  32. maily_server-0.4.0/.github/workflows/release-please.yml +41 -0
  33. maily_server-0.4.0/.github/workflows/semantic-pr.yml +37 -0
  34. maily_server-0.4.0/.github/workflows/stale.yml +29 -0
  35. maily_server-0.4.0/.github/workflows/trivy.yml +73 -0
  36. maily_server-0.4.0/.github/workflows/zizmor.yml +40 -0
  37. maily_server-0.4.0/.gitignore +74 -0
  38. maily_server-0.4.0/.gitleaks.toml +18 -0
  39. maily_server-0.4.0/.ignore +3 -0
  40. maily_server-0.4.0/.pre-commit-config.yaml +36 -0
  41. maily_server-0.4.0/.release-please-manifest.json +3 -0
  42. maily_server-0.4.0/.trivyignore +16 -0
  43. maily_server-0.4.0/.typos.toml +23 -0
  44. maily_server-0.4.0/CHANGELOG.md +124 -0
  45. maily_server-0.4.0/CODE_OF_CONDUCT.md +72 -0
  46. maily_server-0.4.0/CONTRIBUTING.md +91 -0
  47. maily_server-0.4.0/Dockerfile +84 -0
  48. maily_server-0.4.0/LICENSE +21 -0
  49. maily_server-0.4.0/PKG-INFO +414 -0
  50. maily_server-0.4.0/README.md +385 -0
  51. maily_server-0.4.0/SECURITY.md +35 -0
  52. maily_server-0.4.0/alembic/env.py +57 -0
  53. maily_server-0.4.0/alembic/script.py.mako +26 -0
  54. maily_server-0.4.0/alembic/versions/001_initial.py +90 -0
  55. maily_server-0.4.0/alembic/versions/002_retention.py +32 -0
  56. maily_server-0.4.0/alembic/versions/003_app_settings.py +31 -0
  57. maily_server-0.4.0/alembic/versions/004_domain_cache.py +32 -0
  58. maily_server-0.4.0/alembic/versions/005_provider_headers.py +32 -0
  59. maily_server-0.4.0/alembic/versions/006_stats_events.py +42 -0
  60. maily_server-0.4.0/alembic/versions/007_perf_indexes.py +76 -0
  61. maily_server-0.4.0/alembic/versions/008_mailbox_address_partial_unique.py +37 -0
  62. maily_server-0.4.0/alembic/versions/009_api_keys.py +79 -0
  63. maily_server-0.4.0/alembic/versions/010_stats_events_domain_and_owner.py +48 -0
  64. maily_server-0.4.0/alembic.ini +38 -0
  65. maily_server-0.4.0/benchmarks/locustfile.py +71 -0
  66. maily_server-0.4.0/client/MANIFEST.in +2 -0
  67. maily_server-0.4.0/client/README.md +388 -0
  68. maily_server-0.4.0/client/client.py +2434 -0
  69. maily_server-0.4.0/client/py.typed +0 -0
  70. maily_server-0.4.0/client/pyproject.toml +43 -0
  71. maily_server-0.4.0/docker-compose.yml +109 -0
  72. maily_server-0.4.0/docs/ADDING_PROVIDERS.md +548 -0
  73. maily_server-0.4.0/docs/CLIENT_GUIDE.md +493 -0
  74. maily_server-0.4.0/lychee.toml +26 -0
  75. maily_server-0.4.0/pyproject.toml +157 -0
  76. maily_server-0.4.0/release-please-config.json +32 -0
  77. maily_server-0.4.0/scripts/build_client.py +60 -0
  78. maily_server-0.4.0/scripts/build_pages_site.py +668 -0
  79. maily_server-0.4.0/scripts/check_diff_coverage.py +253 -0
  80. maily_server-0.4.0/scripts/check_openapi_breaking.py +230 -0
  81. maily_server-0.4.0/scripts/check_version_consistency.py +165 -0
  82. maily_server-0.4.0/scripts/compare_benchmarks.py +193 -0
  83. maily_server-0.4.0/scripts/generate_ci_dashboard.py +603 -0
  84. maily_server-0.4.0/scripts/label_pr_size.py +244 -0
  85. maily_server-0.4.0/scripts/lint_pr_commits.py +190 -0
  86. maily_server-0.4.0/scripts/pip_audit_to_sarif.py +96 -0
  87. maily_server-0.4.0/scripts/run_load_test.py +256 -0
  88. maily_server-0.4.0/scripts/run_mutation_gate.py +342 -0
  89. maily_server-0.4.0/scripts/test_mail_sender/README.md +129 -0
  90. maily_server-0.4.0/scripts/test_mail_sender/__init__.py +36 -0
  91. maily_server-0.4.0/scripts/test_mail_sender/__main__.py +182 -0
  92. maily_server-0.4.0/scripts/test_mail_sender/exceptions.py +89 -0
  93. maily_server-0.4.0/scripts/test_mail_sender/fallback.py +156 -0
  94. maily_server-0.4.0/scripts/test_mail_sender/models.py +37 -0
  95. maily_server-0.4.0/scripts/test_mail_sender/primary.py +249 -0
  96. maily_server-0.4.0/scripts/test_mail_sender/sender.py +211 -0
  97. maily_server-0.4.0/scripts/test_providers_live.py +697 -0
  98. maily_server-0.4.0/src/maily/__init__.py +9 -0
  99. maily_server-0.4.0/src/maily/app/__init__.py +0 -0
  100. maily_server-0.4.0/src/maily/app/authz.py +253 -0
  101. maily_server-0.4.0/src/maily/app/deps.py +63 -0
  102. maily_server-0.4.0/src/maily/app/errors.py +92 -0
  103. maily_server-0.4.0/src/maily/app/main.py +249 -0
  104. maily_server-0.4.0/src/maily/app/middleware/origin.py +69 -0
  105. maily_server-0.4.0/src/maily/app/routers/__init__.py +0 -0
  106. maily_server-0.4.0/src/maily/app/routers/admin.py +397 -0
  107. maily_server-0.4.0/src/maily/app/routers/gmail.py +252 -0
  108. maily_server-0.4.0/src/maily/app/routers/health.py +86 -0
  109. maily_server-0.4.0/src/maily/app/routers/keys.py +270 -0
  110. maily_server-0.4.0/src/maily/app/routers/mailboxes.py +243 -0
  111. maily_server-0.4.0/src/maily/app/routers/messages.py +232 -0
  112. maily_server-0.4.0/src/maily/app/routers/providers.py +73 -0
  113. maily_server-0.4.0/src/maily/app/schemas.py +162 -0
  114. maily_server-0.4.0/src/maily/app/services/__init__.py +0 -0
  115. maily_server-0.4.0/src/maily/app/services/domain_cache.py +308 -0
  116. maily_server-0.4.0/src/maily/app/services/gmail_config.py +82 -0
  117. maily_server-0.4.0/src/maily/app/services/keys.py +279 -0
  118. maily_server-0.4.0/src/maily/app/services/mailboxes.py +235 -0
  119. maily_server-0.4.0/src/maily/app/services/provider_headers.py +149 -0
  120. maily_server-0.4.0/src/maily/app/services/retention.py +372 -0
  121. maily_server-0.4.0/src/maily/app/services/retention_rules.py +95 -0
  122. maily_server-0.4.0/src/maily/app/services/scoped_history.py +254 -0
  123. maily_server-0.4.0/src/maily/app/services/scoped_stats.py +169 -0
  124. maily_server-0.4.0/src/maily/app/services/stats_history.py +225 -0
  125. maily_server-0.4.0/src/maily/client.py +147 -0
  126. maily_server-0.4.0/src/maily/crypto.py +43 -0
  127. maily_server-0.4.0/src/maily/db/__init__.py +18 -0
  128. maily_server-0.4.0/src/maily/db/engine.py +89 -0
  129. maily_server-0.4.0/src/maily/db/maintenance.py +254 -0
  130. maily_server-0.4.0/src/maily/db/models.py +229 -0
  131. maily_server-0.4.0/src/maily/exceptions.py +43 -0
  132. maily_server-0.4.0/src/maily/http.py +90 -0
  133. maily_server-0.4.0/src/maily/providers/__init__.py +41 -0
  134. maily_server-0.4.0/src/maily/providers/anonymmail_net/__init__.py +3 -0
  135. maily_server-0.4.0/src/maily/providers/anonymmail_net/service.py +506 -0
  136. maily_server-0.4.0/src/maily/providers/base.py +253 -0
  137. maily_server-0.4.0/src/maily/providers/dispoemail_org/__init__.py +3 -0
  138. maily_server-0.4.0/src/maily/providers/dispoemail_org/service.py +370 -0
  139. maily_server-0.4.0/src/maily/providers/gmail/__init__.py +13 -0
  140. maily_server-0.4.0/src/maily/providers/gmail/db_store.py +126 -0
  141. maily_server-0.4.0/src/maily/providers/gmail/oauth.py +128 -0
  142. maily_server-0.4.0/src/maily/providers/gmail/parse.py +189 -0
  143. maily_server-0.4.0/src/maily/providers/gmail/service.py +330 -0
  144. maily_server-0.4.0/src/maily/providers/gmail/store.py +69 -0
  145. maily_server-0.4.0/src/maily/providers/mailtm/__init__.py +3 -0
  146. maily_server-0.4.0/src/maily/providers/mailtm/service.py +262 -0
  147. maily_server-0.4.0/src/maily/providers/noopmail_org/__init__.py +3 -0
  148. maily_server-0.4.0/src/maily/providers/noopmail_org/service.py +215 -0
  149. maily_server-0.4.0/src/maily/providers/registry.py +121 -0
  150. maily_server-0.4.0/src/maily/providers/temp_tf/__init__.py +3 -0
  151. maily_server-0.4.0/src/maily/providers/temp_tf/service.py +490 -0
  152. maily_server-0.4.0/src/maily/providers/tempmail_io/__init__.py +3 -0
  153. maily_server-0.4.0/src/maily/providers/tempmail_io/headers.py +59 -0
  154. maily_server-0.4.0/src/maily/providers/tempmail_io/service.py +228 -0
  155. maily_server-0.4.0/src/maily/providers/tempmail_plus/__init__.py +3 -0
  156. maily_server-0.4.0/src/maily/providers/tempmail_plus/service.py +259 -0
  157. maily_server-0.4.0/src/maily/py.typed +0 -0
  158. maily_server-0.4.0/src/maily/schemas.py +166 -0
  159. maily_server-0.4.0/src/maily/sdk.py +71 -0
  160. maily_server-0.4.0/src/maily/settings.py +103 -0
  161. maily_server-0.4.0/src/maily/standalone_client.py +2431 -0
  162. maily_server-0.4.0/src/maily/static/css/main.css +1139 -0
  163. maily_server-0.4.0/src/maily/static/docs.html +789 -0
  164. maily_server-0.4.0/src/maily/static/index.html +148 -0
  165. maily_server-0.4.0/src/maily/static/js/api.js +224 -0
  166. maily_server-0.4.0/src/maily/static/js/app.js +370 -0
  167. maily_server-0.4.0/src/maily/static/js/pages/access.js +168 -0
  168. maily_server-0.4.0/src/maily/static/js/pages/detail.js +630 -0
  169. maily_server-0.4.0/src/maily/static/js/pages/domain-cache.js +160 -0
  170. maily_server-0.4.0/src/maily/static/js/pages/gmail.js +483 -0
  171. maily_server-0.4.0/src/maily/static/js/pages/keys.js +614 -0
  172. maily_server-0.4.0/src/maily/static/js/pages/mailboxes.js +520 -0
  173. maily_server-0.4.0/src/maily/static/js/pages/overview.js +687 -0
  174. maily_server-0.4.0/src/maily/static/js/pages/retention.js +163 -0
  175. maily_server-0.4.0/src/maily/static/js/ui.js +273 -0
  176. maily_server-0.4.0/src/maily/utils/__init__.py +4 -0
  177. maily_server-0.4.0/src/maily/utils/misc.py +15 -0
  178. maily_server-0.4.0/src/maily/utils/retry.py +68 -0
  179. maily_server-0.4.0/tests/__init__.py +0 -0
  180. maily_server-0.4.0/tests/api_keys_support.py +183 -0
  181. maily_server-0.4.0/tests/conftest.py +7 -0
  182. maily_server-0.4.0/tests/helpers.py +102 -0
  183. maily_server-0.4.0/tests/test_admin.py +429 -0
  184. maily_server-0.4.0/tests/test_anonymmail_net.py +583 -0
  185. maily_server-0.4.0/tests/test_api_key_models.py +84 -0
  186. maily_server-0.4.0/tests/test_api_keys.py +384 -0
  187. maily_server-0.4.0/tests/test_app.py +257 -0
  188. maily_server-0.4.0/tests/test_authz.py +557 -0
  189. maily_server-0.4.0/tests/test_authz_properties.py +456 -0
  190. maily_server-0.4.0/tests/test_benchmarks.py +250 -0
  191. maily_server-0.4.0/tests/test_client.py +2220 -0
  192. maily_server-0.4.0/tests/test_client_standalone.py +427 -0
  193. maily_server-0.4.0/tests/test_concurrency.py +173 -0
  194. maily_server-0.4.0/tests/test_crypto.py +72 -0
  195. maily_server-0.4.0/tests/test_db_maintenance.py +229 -0
  196. maily_server-0.4.0/tests/test_dispoemail_org.py +476 -0
  197. maily_server-0.4.0/tests/test_domain_cache.py +344 -0
  198. maily_server-0.4.0/tests/test_gmail.py +426 -0
  199. maily_server-0.4.0/tests/test_gmail_parents_scope.py +346 -0
  200. maily_server-0.4.0/tests/test_gmail_plus_alias.py +309 -0
  201. maily_server-0.4.0/tests/test_http.py +56 -0
  202. maily_server-0.4.0/tests/test_keys_router.py +170 -0
  203. maily_server-0.4.0/tests/test_keys_service.py +350 -0
  204. maily_server-0.4.0/tests/test_mail_sender.py +234 -0
  205. maily_server-0.4.0/tests/test_mailbox_ownership.py +280 -0
  206. maily_server-0.4.0/tests/test_mailboxes_service.py +310 -0
  207. maily_server-0.4.0/tests/test_mailtm.py +226 -0
  208. maily_server-0.4.0/tests/test_memory_leaks.py +107 -0
  209. maily_server-0.4.0/tests/test_messages_api.py +124 -0
  210. maily_server-0.4.0/tests/test_misc.py +66 -0
  211. maily_server-0.4.0/tests/test_noopmail_org.py +407 -0
  212. maily_server-0.4.0/tests/test_provider_architecture.py +110 -0
  213. maily_server-0.4.0/tests/test_provider_faults.py +76 -0
  214. maily_server-0.4.0/tests/test_retention_lifecycle.py +262 -0
  215. maily_server-0.4.0/tests/test_retention_scope.py +627 -0
  216. maily_server-0.4.0/tests/test_retry.py +211 -0
  217. maily_server-0.4.0/tests/test_scope_filters.py +299 -0
  218. maily_server-0.4.0/tests/test_sdk.py +112 -0
  219. maily_server-0.4.0/tests/test_security_routing.py +192 -0
  220. maily_server-0.4.0/tests/test_seen.py +86 -0
  221. maily_server-0.4.0/tests/test_stats_retention_history.py +422 -0
  222. maily_server-0.4.0/tests/test_temp_tf.py +610 -0
  223. maily_server-0.4.0/tests/test_tempmail.py +260 -0
  224. maily_server-0.4.0/tests/test_tempmail_io.py +331 -0
  225. maily_server-0.4.0/uv.lock +2372 -0
  226. 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