Add email delivery check command

This commit is contained in:
2026-05-20 15:29:19 +02:00
parent 6bdddc3d54
commit 86f7c0589c
8 changed files with 157 additions and 8 deletions
+15 -1
View File
@@ -24,7 +24,7 @@ from pve_backup_report.coverage import (
STATUS_PBS_PLANNED,
analyze_backup_coverage,
)
from pve_backup_report.email_report import EmailReportError, send_report_email
from pve_backup_report.email_report import EmailReportError, send_report_email, send_test_email
from pve_backup_report.logging_config import configure_logging
from pve_backup_report.pbs_client import PbsApiError, PbsClient
from pve_backup_report.pve_client import PveApiError, PveClient
@@ -50,6 +50,11 @@ def build_parser() -> argparse.ArgumentParser:
action="store_true",
help="teste les endpoints PVE /nodes, /storage et /cluster/backup puis quitte",
)
parser.add_argument(
"--check-email",
action="store_true",
help="envoie un email de test avec la configuration SMTP puis quitte",
)
parser.add_argument(
"--dump-inventory",
action="store_true",
@@ -156,6 +161,15 @@ def run(argv: Sequence[str] | None = None) -> int:
)
return 3 if has_error else 0
if args.check_email:
try:
send_test_email(config.email)
except EmailReportError as exc:
logger.error("Verification email echouee: %s", exc)
return 6
logger.info("Email de test envoye a %s", ", ".join(config.email.smtp_to))
return 0
if args.dump_inventory:
report_data = collect_data_or_log_error(config, "inventaire")
if report_data is None:
+30 -7
View File
@@ -20,7 +20,25 @@ def send_report_email(config: EmailConfig, pdf_path: Path) -> None:
raise EmailReportError("configuration email incomplete")
message = build_report_message(config, pdf_path)
send_email_message(config, message)
def send_test_email(config: EmailConfig) -> None:
if not config.enabled:
raise EmailReportError("REPORT_EMAIL_ENABLED=false")
if config.smtp_host is None or config.smtp_from is None or not config.smtp_to:
raise EmailReportError("configuration email incomplete")
message = build_base_message(config, f"[TEST] {config.subject}")
message.set_content(
"Bonjour,\n\n"
"Ceci est un email de test envoye par PVE Backup Report.\n\n"
"Cordialement.\n"
)
send_email_message(config, message)
def send_email_message(config: EmailConfig, message: EmailMessage) -> None:
try:
if config.smtp_ssl:
with smtplib.SMTP_SSL(
@@ -44,13 +62,7 @@ def send_report_email(config: EmailConfig, pdf_path: Path) -> None:
def build_report_message(config: EmailConfig, pdf_path: Path) -> EmailMessage:
message = EmailMessage()
message["Subject"] = config.subject
message["From"] = config.smtp_from or ""
message["To"] = ", ".join(config.smtp_to)
message["Date"] = formatdate(localtime=True)
message["Message-ID"] = make_msgid(domain=message_id_domain(config.smtp_from))
message["Auto-Submitted"] = "auto-generated"
message = build_base_message(config, config.subject)
message.set_content(
"Bonjour,\n\n"
"Veuillez trouver ci-joint le rapport de sauvegardes Proxmox VE.\n\n"
@@ -65,6 +77,17 @@ def build_report_message(config: EmailConfig, pdf_path: Path) -> EmailMessage:
return message
def build_base_message(config: EmailConfig, subject: str) -> EmailMessage:
message = EmailMessage()
message["Subject"] = subject
message["From"] = config.smtp_from or ""
message["To"] = ", ".join(config.smtp_to)
message["Date"] = formatdate(localtime=True)
message["Message-ID"] = make_msgid(domain=message_id_domain(config.smtp_from))
message["Auto-Submitted"] = "auto-generated"
return message
def message_id_domain(address: str | None) -> str | None:
if address is None:
return None