74 lines
3.4 KiB
Python
74 lines
3.4 KiB
Python
"""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"))
|