mailradar 2026.9.2__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 (34) hide show
  1. mailradar-2026.9.2/.github/dependabot.yml +23 -0
  2. mailradar-2026.9.2/.github/workflows/codeql.yml +35 -0
  3. mailradar-2026.9.2/.github/workflows/codspeed.yml +29 -0
  4. mailradar-2026.9.2/.github/workflows/docker.yml +53 -0
  5. mailradar-2026.9.2/.github/workflows/publish.yml +29 -0
  6. mailradar-2026.9.2/.github/workflows/release.yml +49 -0
  7. mailradar-2026.9.2/.github/workflows/sonarcloud.yml +20 -0
  8. mailradar-2026.9.2/.github/workflows/test.yml +33 -0
  9. mailradar-2026.9.2/.github/workflows/trivy.yml +30 -0
  10. mailradar-2026.9.2/.gitignore +109 -0
  11. mailradar-2026.9.2/CHANGELOG.md +20 -0
  12. mailradar-2026.9.2/Dockerfile +45 -0
  13. mailradar-2026.9.2/LICENSE +21 -0
  14. mailradar-2026.9.2/PKG-INFO +252 -0
  15. mailradar-2026.9.2/README.md +193 -0
  16. mailradar-2026.9.2/mailradar/__init__.py +1 -0
  17. mailradar-2026.9.2/mailradar/checker.py +466 -0
  18. mailradar-2026.9.2/mailradar/cli.py +451 -0
  19. mailradar-2026.9.2/mailradar/discover.py +262 -0
  20. mailradar-2026.9.2/mailradar/gpg.py +116 -0
  21. mailradar-2026.9.2/mailradar/reporter.py +81 -0
  22. mailradar-2026.9.2/mailradar/sender.py +163 -0
  23. mailradar-2026.9.2/mailradar/templates/report_en.j2 +97 -0
  24. mailradar-2026.9.2/mailradar/templates/report_it.j2 +97 -0
  25. mailradar-2026.9.2/pyproject.toml +62 -0
  26. mailradar-2026.9.2/requirements-ci.txt +321 -0
  27. mailradar-2026.9.2/sonar-project.properties +20 -0
  28. mailradar-2026.9.2/tests/__init__.py +0 -0
  29. mailradar-2026.9.2/tests/benchmarks/__init__.py +0 -0
  30. mailradar-2026.9.2/tests/benchmarks/test_bench_checker.py +66 -0
  31. mailradar-2026.9.2/tests/test_checker.py +329 -0
  32. mailradar-2026.9.2/tests/test_gpg.py +57 -0
  33. mailradar-2026.9.2/tests/test_reporter.py +66 -0
  34. mailradar-2026.9.2/uv.lock +537 -0
@@ -0,0 +1,23 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: pip
4
+ directory: "/"
5
+ schedule:
6
+ interval: weekly
7
+ day: monday
8
+ time: "06:00"
9
+ open-pull-requests-limit: 10
10
+ labels:
11
+ - dependencies
12
+ - python
13
+
14
+ - package-ecosystem: github-actions
15
+ directory: "/"
16
+ schedule:
17
+ interval: weekly
18
+ day: monday
19
+ time: "06:00"
20
+ open-pull-requests-limit: 5
21
+ labels:
22
+ - dependencies
23
+ - github-actions
@@ -0,0 +1,35 @@
1
+ name: CodeQL
2
+
3
+ on:
4
+ push:
5
+ branches: [main]
6
+ pull_request:
7
+ branches: [main]
8
+ schedule:
9
+ - cron: '0 6 * * 1'
10
+
11
+ jobs:
12
+ analyze:
13
+ name: Analyze
14
+ runs-on: ubuntu-latest
15
+ permissions:
16
+ actions: read
17
+ contents: read
18
+ security-events: write
19
+
20
+ steps:
21
+ - name: Checkout
22
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7
23
+
24
+ - name: Initialize CodeQL
25
+ uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4
26
+ with:
27
+ languages: python
28
+
29
+ - name: Autobuild
30
+ uses: github/codeql-action/autobuild@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4
31
+
32
+ - name: Perform CodeQL Analysis
33
+ uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4
34
+ with:
35
+ category: "/language:python"
@@ -0,0 +1,29 @@
1
+ name: CodSpeed
2
+ on:
3
+ push:
4
+ branches: [ main ]
5
+ pull_request:
6
+ branches: [ main ]
7
+ workflow_dispatch:
8
+ permissions:
9
+ contents: read
10
+ id-token: write
11
+ jobs:
12
+ benchmarks:
13
+ name: Run benchmarks
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
17
+ - name: Set up Python
18
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
19
+ with:
20
+ python-version: "3.12"
21
+ - name: Install dependencies
22
+ run: |
23
+ pip install -e . # NOSONAR - trusted internal project
24
+ pip install pytest-codspeed --only-binary :all:
25
+ - name: Run benchmarks
26
+ uses: CodSpeedHQ/action@373d6868929f444bc08d901fd0eb0ad52a8875ea # v5
27
+ with:
28
+ mode: simulation
29
+ run: pytest tests/benchmarks/ --codspeed
@@ -0,0 +1,53 @@
1
+ name: Build and Push Docker Image
2
+ on:
3
+ release:
4
+ types: [published]
5
+ permissions:
6
+ contents: read
7
+ security-events: write
8
+ jobs:
9
+ docker:
10
+ runs-on: ubuntu-latest
11
+ steps:
12
+ - name: Wait for PyPI propagation
13
+ run: sleep 60
14
+ - name: Checkout
15
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
16
+ - name: Set up QEMU
17
+ uses: docker/setup-qemu-action@96fe6ef7f33517b61c61be40b68a1882f3264fb8 # v4.2.0
18
+ - name: Set up Docker Buildx
19
+ uses: docker/setup-buildx-action@37fe631027851001ddb9b187196cc803df7f5f0e # v4.3.0
20
+ - name: Login to Docker Hub
21
+ uses: docker/login-action@371161bbe7024a29a25c5e19bfcbc0804fe9ad2c # v4.5.2
22
+ with:
23
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
24
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
25
+ - name: Extract version from tag
26
+ id: version
27
+ run: echo "VERSION=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
28
+ - name: Build and push
29
+ uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
30
+ with:
31
+ context: .
32
+ platforms: linux/amd64,linux/arm64
33
+ push: true
34
+ tags: |
35
+ maksimtech/mailradar:latest
36
+ maksimtech/mailradar:${{ steps.version.outputs.VERSION }}
37
+ build-args: |
38
+ MAILRADAR_VERSION=${{ steps.version.outputs.VERSION }}
39
+ cache-from: type=gha
40
+ cache-to: type=gha,mode=max
41
+ - name: Docker Scout CVE scan
42
+ uses: docker/scout-action@5dae9c7571dd0f3de81f5b501240c593c13c3eb6 # v1.9.3
43
+ with:
44
+ command: cves
45
+ image: maksimtech/mailradar:${{ steps.version.outputs.VERSION }}
46
+ only-severities: critical,high
47
+ exit-code: false
48
+ sarif-file: scout-results.sarif
49
+ - name: Upload Scout SARIF
50
+ uses: github/codeql-action/upload-sarif@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4.37.8
51
+ if: always()
52
+ with:
53
+ sarif_file: scout-results.sarif
@@ -0,0 +1,29 @@
1
+ name: Publish to PyPI
2
+ on:
3
+ release:
4
+ types: [published]
5
+ workflow_dispatch:
6
+ jobs:
7
+ build-and-publish:
8
+ name: Build and publish to PyPI
9
+ runs-on: ubuntu-latest
10
+ environment:
11
+ name: pypi
12
+ url: https://pypi.org/p/mailradar
13
+ permissions:
14
+ id-token: write
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
18
+ - name: Set up Python
19
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
20
+ with:
21
+ python-version: "3.12"
22
+ - name: Install build dependencies
23
+ run: pip install --upgrade build hatchling # NOSONAR - trusted packages
24
+ - name: Build package
25
+ run: python -m build
26
+ - name: Publish to PyPI
27
+ uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # release/v1
28
+ with:
29
+ verify-metadata: false
@@ -0,0 +1,49 @@
1
+ name: Release
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - 'v*'
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ release:
13
+ name: Create GitHub Release
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
18
+ with:
19
+ fetch-depth: 0
20
+
21
+ - name: Extract version from tag
22
+ id: version
23
+ run: |
24
+ VERSION=${GITHUB_REF#refs/tags/v}
25
+ echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
26
+ echo "TAG=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT
27
+
28
+ - name: Extract changelog for this version
29
+ id: changelog
30
+ run: |
31
+ VERSION=${{ steps.version.outputs.VERSION }}
32
+ # Estrai la sezione del CHANGELOG per questa versione
33
+ NOTES=$(awk "/## \[$VERSION\]/{flag=1; next} /## \[/{flag=0} flag" CHANGELOG.md)
34
+ if [ -z "$NOTES" ]; then
35
+ NOTES="Release $VERSION"
36
+ fi
37
+ # Multiline output
38
+ echo "NOTES<<EOF" >> $GITHUB_OUTPUT
39
+ echo "$NOTES" >> $GITHUB_OUTPUT
40
+ echo "EOF" >> $GITHUB_OUTPUT
41
+
42
+ - name: Create GitHub Release
43
+ uses: softprops/action-gh-release@d5382d3e6f2fa7bd53cb749d33091853d4985daf # v2.3.0
44
+ with:
45
+ tag_name: ${{ steps.version.outputs.TAG }}
46
+ name: MailRadar ${{ steps.version.outputs.VERSION }}
47
+ body: ${{ steps.changelog.outputs.NOTES }}
48
+ draft: false
49
+ prerelease: false
@@ -0,0 +1,20 @@
1
+ name: SonarCloud Analysis
2
+ on:
3
+ push:
4
+ branches: [ main ]
5
+ pull_request:
6
+ types: [opened, synchronize, reopened]
7
+ permissions:
8
+ contents: read
9
+ jobs:
10
+ sonarcloud:
11
+ name: SonarCloud
12
+ runs-on: ubuntu-latest
13
+ steps:
14
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
15
+ with:
16
+ fetch-depth: 0
17
+ - name: SonarQube Scan
18
+ uses: SonarSource/sonarqube-scan-action@7006c4492b2e0ee0f816d36501671557c97f5995 # v8.1.0
19
+ env:
20
+ SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
@@ -0,0 +1,33 @@
1
+ name: Tests
2
+ on:
3
+ push:
4
+ branches: [ main ]
5
+ pull_request:
6
+ branches: [ main ]
7
+ permissions:
8
+ contents: read
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ fail-fast: false
14
+ matrix:
15
+ python-version: ["3.11", "3.12", "3.13"]
16
+ experimental: [false]
17
+ include:
18
+ - python-version: "3.14-dev"
19
+ experimental: true
20
+ continue-on-error: ${{ matrix.experimental }}
21
+ steps:
22
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
23
+ - name: Set up Python ${{ matrix.python-version }}
24
+ uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
25
+ with:
26
+ python-version: ${{ matrix.python-version }}
27
+ - name: Install dependencies
28
+ run: pip install -e . # NOSONAR - trusted internal project, no external setup scripts
29
+ - name: Test CLI
30
+ run: |
31
+ mailradar --help
32
+ mailradar check maksimtech.com
33
+ mailradar discover maksimtech.com --no-gpg
@@ -0,0 +1,30 @@
1
+ name: Trivy Security Scan
2
+ on:
3
+ push:
4
+ branches: [ main ]
5
+ pull_request:
6
+ branches: [ main ]
7
+ schedule:
8
+ - cron: '0 6 * * 1'
9
+ permissions:
10
+ contents: read
11
+ security-events: write
12
+ jobs:
13
+ trivy:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
17
+ - name: Run Trivy on filesystem
18
+ uses: aquasecurity/trivy-action@a9c7b0f06e461e9d4b4d1711f154ee024b8d7ab8 # v0.36.0
19
+ with:
20
+ scan-type: 'fs'
21
+ scan-ref: '.'
22
+ severity: 'CRITICAL,HIGH'
23
+ format: 'sarif'
24
+ output: 'trivy-results.sarif'
25
+ exit-code: '0'
26
+ - name: Upload Trivy results to GitHub Security
27
+ uses: github/codeql-action/upload-sarif@db488ddef3bf6cb639b32c2e9a7c0a7ea8271d28 # v4.37.8
28
+ if: always()
29
+ with:
30
+ sarif_file: 'trivy-results.sarif'
@@ -0,0 +1,109 @@
1
+ # Python
2
+ __pycache__/
3
+ *.py[cod]
4
+ *$py.class
5
+ *.so
6
+ .Python
7
+ build/
8
+ develop-eggs/
9
+ dist/
10
+ downloads/
11
+ eggs/
12
+ .eggs/
13
+ lib/
14
+ lib64/
15
+ parts/
16
+ sdist/
17
+ var/
18
+ wheels/
19
+ share/python-wheels/
20
+ *.egg-info/
21
+ .installed.cfg
22
+ *.egg
23
+ MANIFEST
24
+
25
+ # Virtual environments
26
+ .env
27
+ .venv
28
+ env/
29
+ venv/
30
+ ENV/
31
+ env.bak/
32
+ venv.bak/
33
+
34
+ # Distribution / packaging
35
+ .Python
36
+ pip-wheel-metadata/
37
+ *.whl
38
+
39
+ # PyPI
40
+ .pypirc
41
+
42
+ # Testing
43
+ .tox/
44
+ .nox/
45
+ .coverage
46
+ .coverage.*
47
+ .cache
48
+ nosetests.xml
49
+ coverage.xml
50
+ *.cover
51
+ *.py,cover
52
+ .hypothesis/
53
+ .pytest_cache/
54
+ pytestdebug.log
55
+
56
+ # Type checking
57
+ .mypy_cache/
58
+ .dmypy.json
59
+ dmypy.json
60
+ .pyre/
61
+ .pytype/
62
+
63
+ # IDEs
64
+ .idea/
65
+ .vscode/
66
+ *.swp
67
+ *.swo
68
+ *~
69
+ .project
70
+ .pydevproject
71
+
72
+ # OS
73
+ .DS_Store
74
+ .DS_Store?
75
+ ._*
76
+ .Spotlight-V100
77
+ .Trashes
78
+ ehthumbs.db
79
+ Thumbs.db
80
+ desktop.ini
81
+
82
+ # Project specific
83
+ *.db
84
+ *.sqlite
85
+ *.sqlite3
86
+ mailradar.db
87
+ reports/
88
+ *.pdf
89
+ *.log
90
+ config.yaml
91
+ config.yml
92
+ .env.local
93
+ .env.*.local
94
+
95
+ # Docker
96
+ .dockerignore
97
+
98
+ # Secrets
99
+ *.pem
100
+ *.key
101
+ *.crt
102
+ *.p12
103
+ gpg_config.yaml
104
+
105
+ # Temporary
106
+ tmp/
107
+ temp/
108
+ .tmp/
109
+ mailradar_*.txt
@@ -0,0 +1,20 @@
1
+ # Changelog
2
+
3
+ All notable changes to MailRadar are documented here.
4
+
5
+ Format: [YYYY.MM.PATCH] — CalVer versioning
6
+
7
+ ---
8
+
9
+ ## [2026.09.1] — 2026-09-04
10
+
11
+ ### Added
12
+ - Core email security checker (DMARC, SPF, DKIM, BIMI, MTA-STS, TLS-RPT)
13
+ - Accurate DKIM key size detection via `cryptography` library
14
+ - Scoring system 0-100 with grade levels (EXCELLENT/GOOD/MODERATE/POOR/CRITICAL)
15
+ - CLI with `check` and `batch` commands
16
+ - Rich terminal output with color-coded results
17
+ - Issue reporting with actionable recommendations
18
+ - Multi-selector DKIM detection (common selectors)
19
+ - BIMI SVG validation via HTTP
20
+ - MTA-STS policy mode detection
@@ -0,0 +1,45 @@
1
+ FROM python:3.12-slim-bookworm
2
+
3
+ # Metadata OCI
4
+ LABEL maintainer="maksimtech <github@maksimtech.com>"
5
+ LABEL org.opencontainers.image.title="MailRadar"
6
+ LABEL org.opencontainers.image.description="Email security posture analyzer — DMARC, SPF, DKIM, BIMI, VMC & GPG audit tool"
7
+ LABEL org.opencontainers.image.source="https://github.com/maksimtech/mailradar"
8
+ LABEL org.opencontainers.image.license="MIT"
9
+
10
+ # Aggiorna pacchetti di sistema per fix vulnerabilità
11
+ RUN apt-get update && \
12
+ apt-get upgrade -y && \
13
+ apt-get install -y --no-install-recommends gnupg && \
14
+ apt-get clean && \
15
+ rm -rf /var/lib/apt/lists/*
16
+
17
+ # Ambiente Python
18
+ ENV PYTHONDONTWRITEBYTECODE=1 \
19
+ PYTHONUNBUFFERED=1
20
+
21
+ WORKDIR /app
22
+
23
+ # Versione MailRadar da installare
24
+ ARG MAILRADAR_VERSION=2026.9.2
25
+
26
+ # Installa mailradar da PyPI
27
+ RUN pip install --no-cache-dir --root-user-action=ignore --only-binary :all: \
28
+ "mailradar==${MAILRADAR_VERSION}" || \
29
+ pip install --no-cache-dir --root-user-action=ignore \
30
+ "mailradar==${MAILRADAR_VERSION}"
31
+
32
+ # Crea utente non-root per sicurezza
33
+ RUN useradd -m -u 1000 mailradar && \
34
+ mkdir -p /home/mailradar/.mailradar && \
35
+ chown -R mailradar:mailradar /home/mailradar
36
+
37
+ USER mailradar
38
+ WORKDIR /home/mailradar
39
+
40
+ # Volume per report generati
41
+ VOLUME ["/home/mailradar/.mailradar"]
42
+
43
+ # Entrypoint CLI
44
+ ENTRYPOINT ["mailradar"]
45
+ CMD ["--help"]
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Massimo Moretti (maksimtech)
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.