"""Python port of the provided Java MultiMailerSettings example. This is intentionally safe: credentials and real recipients are placeholders. Run from server/ with: python -m app.mailer.examples.rechnungslegung_2026_05 """ from pathlib import Path from app.mailer.domain.campaign import MailAttachmentConfig, MailCampaign, MailServerSettings from app.mailer.domain.fields import FieldType from app.mailer.domain.recipients import Recipient from app.mailer.services.campaign_executor import build_mail_queue def build_campaign() -> MailCampaign: mail_settings = MailServerSettings( server="smtp.example.org", username="user@example.org", password="change-me", ).use_starttls() campaign = MailCampaign.with_server_settings(mail_settings) campaign.set_from(Recipient(address="d5-rechnungslegung@example.org", name="Rechnungslegung D5")) campaign.allow_individual_to() campaign.allow_individual_attachments() campaign.dont_send_without_attachments() campaign.base_attachment_path = Path("/mnt/FLASH/rele/202606") campaign.add_field("monthyear", FieldType.STRING) campaign.add_field("number", FieldType.STRING) campaign.add_field("password", FieldType.PASSWORD) campaign.add_field("anrede", FieldType.STRING) campaign.set_field_content_for_name("monthyear", "05 / 2026") campaign.subject_template.set_template_string( "Rechnungslegungslisten für ${global::monthyear} und Dienststelle ${local::number}" ) campaign.mail_template.set_template_string( "${local::anrede},\r\n\r\n" "in der Anlage erhalten Sie die Rechnungslegungslisten für die Dienststelle " "${local::number} für den Abrechnungsmonat ${global::monthyear} im Excel-Format. " "Bitte verwenden Sie zum öffnen das dauerhafte Passwort, das Ihnen bereits in der Vergangenheit zugeschickt wurde.\r\n" "Die Rechnungslegungslisten liefern den Nachweis (inkl. Brutto-/Netto-Darstellung) " "der auf Ihren dezentral bewirtschafteten Fonds gebuchten Personalkosten. Sie dienen der " "Überwachung und Kontrolle und ggf. als Nachweis gegenüber Drittmittelgebern.\r\n" "Die Listen erhalten vertrauliche personenbezogene Daten, daher sind diese nur berechtigten " "Personen zugänglich zu machen und nur für einen unbedingt notwendigen Zeitraum aufzubewahren.\r\n" "Falls Sie Rechnungslegungslisten erhalten haben sollten, die nicht zu Ihrer Einrichtung gehören, " "bitten wir Sie um entsprechende Rückmeldung.\r\n\r\n" "Mit freundlichen Grüßen\r\n\r\n" "Rechnungslegungsteam Dezernat 5" ) campaign.add_new_mail_entry() \ .add_to(Recipient(address="mail@example.com", name="mail@example.com")) \ .no_combine_to() \ .combine_attachments_with_global() \ .add_mail_attachment_config(MailAttachmentConfig(Path("xls/"), "ab????-123456-*.XLSX", False)) \ .set_field_content_for_name("number", "ab0000") \ .set_field_content_for_name("password", b"..........") \ .set_field_content_for_name("anrede", "Sehr geehrte Damen und Herren") return campaign if __name__ == "__main__": mc = build_campaign() queue = build_mail_queue(mc, zip_attachments=False) print(f"Built {queue.mail_count} message(s).") for message in queue: print("---") print("To:", message.get("To")) print("Subject:", message.get("Subject"))