E-Mail-Versand
Übersicht
Während der verschiedenen Geschäftsprozessen verschickt vhs.Connect Konnektor diverse E-Mails:
-
Bestätigungs-E-Mail an Teilnehmer
-
Mandatsanforderung an Kontoinhaber
-
Anmelde-Protokoll an vhs
-
Benutzerprofile bestätigen
-
Passwort vergessen
Der Aufbau dieser E-Mails wird über Template-Dateien vorgegeben, die sich um Unterordner „MailTemplates“ des vhs.Connect Konnektor-Programmverzeichnisses befinden:
Abbildung: Mail-Template-Ordner im Programmverzeichnis
Die Vorlagendateien für die verschiedenen E-Mails sind in einzelnen „.tmpl“-Dateien enthalten, wobei die vom Programmstandard verwendetes Templates - ähnlich wie bei den SQL-Templates - mit der zusätzlichen Endung „.original“ abgelegt werden, s. auch Kapitel Anpassung der Kursübertragung.
Die Template-Dateien können mit einem beliebigen Texteditor, z.B. Notepad++, geöffnet und bearbeitet werden:
Abbildung: Mail-Template für Bestätigungsemail in Texteditor
Die Mail-Template-Dateien enthalten ein XML-Dokument, dessen Inhalt über
- die Template-Engine NVelocity sowie
- ein Variablen-System, mehr hierzu s. Kapitel Kursexport / Anpassung der Kursübertragung
dynamisch generiert werden kann.
Aufbau Template-Datei
Das XML-Dokument mit der Wurzel „EmailTemplate“ enthält folgende Elemente:
-
From: E-Mail-Adresse von Absender, z.B. anmeldung\@vhs-demohausen.de
-
ReplyTo: Antwort-Adresse, z.B. info\@vhs-demohausen.de
-
To: Empfänger-Adresse, i.d.R. Datenbindung auf Adresse des Teilnehmer über \$!Model.MailTo
-
Cc: In Kopie an
-
Bcc: Versteckte Kopie an
-
Subject: Betreff-Zeile, z.B. „vhs Demohausen: Ihre Kursbuchung“
-
Body: Inhalt der E-Mail. Es kann einfacherText oder HTML verwendet werden.
Im Falle von HTML muss Element „IsHtml“ auf „true“ gesetzt werden.
Der Body sollte unter Verwendung von NVelocity gestaltet werden, um die Teilnehmer- und Kursdaten dynamisch ausgegeben zu können. -
AttachmentsTemplates: Liste mit Datei-Anhängen
-
Filename: Wie soll der Dateiname aussehen, falls die E-Mail im Dateisystem gespeichert werden soll? Verwendung von NVelocity-Ausdrücken möglich.
-
IsHtml: Kennzeichen, ob E-Mail-Body in HTML vorliegt.
-
BodyTemplate: Rahmen für Body
Bei HTML-E-Mails können beispielweise Rahmen und Dokumenten-Header in eine zusätzliche Variable ausgelagert werden. In diesem Feld kann der Name einer Variablen eingetragen werden, die diese grundliegenden Formatierungen enthält.
Variablen
Analog zu den SQL-Variablen können in den E-Mail-Templates mehrfache genutzte Textpassagen als Variable ausgelagert werden:
Abbildung: Variable für Absenderkennung für Verwendung in E-Mail-Templates
Die Variablen müssen nach der vorgegebenen Namenskonvention „VAR_\<Name>“ gespeichert werden. Anschließend kann aus anderen Templates über „\@\@\<Name>“ auf den Inhalt der Variable zugegriffen werden.
Abbildung: Verwendung der Variablen „VAR_SENDER“ zum Einfügen einer
Signaturzeile in ein E-Mail-Template
Templating mit NVelocity
NVelocity ist eine Template-Engine, die zur dynamischen Generierung von Webseiten oder anderen HTML-Inhalten verwendet werden kann. Vhs.Connect Konnektor nutzt die Engine zur Generierung der E-Mail-Nachrichten. Ähnlich wie in einem Word-Serienbrief werden die NVelocity-Variablen mit den Daten der Internetanmeldung ersetzt. NVelocity ermöglicht zusätzlich die Nutzung von C#-Code, wodurch verschiedene bedingte Formatierungen eingebaut werden können, mehr hierzu siehe: wikipedia.org/wiki/C-Sharp
Datenbindung
Der Inhalt eines vhs.Connect Konnektor-Feldes kann wie folgt in einer Vorlage eingebunden werden:
$!Model.Order.UserAccountPerson.Salutation
Alle Objekte aus dem Datenkontext können mit dem Ausdruck „\$!Model.\<Objekt>.\<Feld>“ angesprochen werden. In diesem Bespiel wird das Feld „Ansprache“ (=Salutation) des Benutzerprofils(=UserAccountPerson) einer Internetanmeldung (=Order) ausgegeben.
Formatierung
Innerhalb der NVelocity-Ausdrücke kann auf die Standartfunktionalität der .Net-Sprache C# zurückgegriffen werden, z.B. auf die Substring-Funktion. Dadurch kann u.a. auf einfache Weg eine gezielte Datumsformatierung realisiert werden:
<td>\$!reg.Course.StartDate.ToLocalTime().ToString("dddd, dd.MM.yyyy, HH:mm")
Uhr</td>*
Im obigen Ausdruck wird zuerst die Methode DateTime.ToLocalTime() aufgerufen, um die in UTC-gespeicherte Beginn-Uhrzeit eines Kurses in die lokale Zeitzone umzuwandeln. Anschließend wird die Ausgabe über die Funktion DateTime.ToString() im Format „Wochentag, Datum, Uhrzeit“ ausgegeben.
If-Abfrage
An vielen Stellen kann es erforderlich sein, abzufragen, ob ein Feld gefüllt ist, um alternativ einen Fallbackwert einzutragen:
#if ($Model.Order.UserAccountPerson.Salutation)
<p>$!Model.Order.UserAccountPerson.Salutation,</p>
#else
<p>Sehr geehrter Teilnehmer,</p>*
\#end
In dem obigen Ausdruck wird über das „#if“-Konstrukt abgefragt, ob das Feld „Ansprache“ (=Salutation) gefüllt ist. Falls nicht, wird der feste Text „Sehr geehrter Teilnehmer“ ausgegeben.
Foreach-Schleife
Eine Auflistung (z.B. von Kursen, Kursterminen oder Kommunikationsdatensätzen) kann mit dem „#foreach“-Konstrukt ausgegeben werden:
#foreach (\$reg in \$Model.Order.OrderDetails)
<div>…</div>
#end
In dem genannten Ausdruck werden alle einzelnen Positionen (=Kurse, Gutschein) einer Bestellung in Form eines DIV-Elements aufgelistet.
Beispiel: Protokoll-Meldung anpassen
Mit folgendem Code-Schnippsel kann die Ausgabe der benutzer-spezifischen Meldungen in der Mail-Variable VAR_ORDERDETAILS_LIST
angepasst werden:
#if($od.HasUserProtocols)
#foreach ($s in $od.UserProtocols)
#if($s.routingKey == 'warn.booking.validation.changed.registrationlevel')
<b>$!s.Header:</b> Anmelde-Status für $!reg.Course.CourseNumber wurde geändert!<br>
#else
<b>$!s.Header:</b> $!s.Description<br>
#end
#end
#end
Der obige Abschnitt ermöglicht, dass im Falle einer automatisch herabgestuften Anmeldung (z.B. aufgrund einer TN-Sperre) ein individueller Text anstatt der Standard-Meldung ausgegeben wird.
Liste der Mail-Templates
In der folgenden Tabelle werden alle von vhs.Connect Konnektor verwendeten Mail-Templates sowie die als Datenkontext zu Verfügung stehenden Objekte aufgelistet.
Name | Datenkontext | Beschreibung |
---|---|---|
booking_confirmation | MailTo, Order, Institution | Buchungsbestätigung für Teilnehmer |
booking_log | MailTo, Order, Institution | Buchungsprotokoll für vhs |
booking_mandate | MailTo, Order, Institution | Mandatsanforderung für Kontoinhaber |
booking_protocol | MailTo, Order, Institution | Buchungsprotokoll für Dateiarchiv. |
Achtung: Kein Mailversand | ||
coupon_confirmation | MailTo, Order, OrderDetail, Attendant, Institution | Auslieferung von Gutschein-Code |
reservation_request | MailTo, Order, Institution | Bestätigung Kursanfrage für TN in Befürwortungsmodus |
reservation_request_vhs | MailTo, Order, Institution | Anfrage zur Kursbefürwortung an vhs |
reservation_request_log | MailTo, Order, Institution | Protokoll Kursanfrage in Befürwortungsmodus |
reservation_confirmation | MailTo, Order, Institution | Bestätigung nach Befürwortung durch vhs für TN in Befürwortungsmodus |
reservation_confirmation_vhs | MailTo, Order, Institution | Bestätigung nach Befürwortung |
reservation_confirmation_log | MailTo, Order, Institution | Protokoll nach Befürwortung durch vhs in Befürwortungsmodus |
reset_password | MailTo, UserAccount, Institution, Link, UserAccountPerson | Passwort zurücksetzen |
verify_mail | MailTo, UserAccount, Institution, Link, UserAccountPerson | E-Mail bestätigen |
Tabelle: Liste aller Mail-Templates
Datenbindung
In den Mail-Templates kann mit \$Model auf die in Tabelle 5 aufgelisteten Objekte im MailContext-zugegriffen werden. Im Folgende eine explizite Auflistung aller Objekte und Felder, die im den Mail-Vorlagen verwendet werden können.
MailTo
Das Feld „MailTo“ enthält die E-Mail-Adresse des Empfängers und kann über „\$Model.MailTo“ eingebunden werden und Adresse der E-Mail. Das Feld wird je nach Kontext automatisch mit dem passenden Empfänger aufgefüllt.
In folgenden Situation wird die E-Mail-Adresse des Teilnehmers in das Feld „MailTo“ eingetragen:
-
Buchungsbestätigung (booking_confirmation), falls die Einstellung NotificationOptions.ConfirmationMailRecipient = User (Standard)
-
Gutschein ausliefern (coupon_confirmation)
-
Benutzerkonto:
-
Verifizieren (verify_mail)
-
Passwort zurücksetzen (reset_password)
-
-
Befürwortungsmodus:
-
Anfrage (reservation_request)
-
Bestätigung (reservation_confirmation)
-
In folgenden Situation wird die E-Mail-Adresse des Kontoinhabers (Abbuchung) bzw. Rechnungsempfängers (Überweisung) verwendet:
-
Mandatsversand (booking_mandate)
-
Buchungsbestätigung (booking_confirmation), falls die Einstellung NotificationOptions.ConfirmationMailRecipient = Debtor
In den übrigen Situationen wird die E-Mail an alle in der Liste der Notification-Recipients aufgeführten Empfänger adressiert:
-
Buchungsprotokoll (booking_log)
-
Befürwortungs-Modus:
-
Anfrage (reservation_request_log)
-
Bestätigung (reservation_confirmation_log)
-
Institution
Das Institution-Objekt ist mit den im Kursverwaltungsprogramm hinterlegten Informationen zur Volkshochschule aufgefüllt. Es wird hauptsächlich in den Standart-E-Mail-Templates verwendet.
Das Institution-Objekt enthält folgende Felder:
Feld | Typ | Beschreibung |
---|---|---|
Kind | string | Art, z.B. “Volkshochschule” |
KindShort | string | Art (kurz), z.B. „vhs“ |
Name | string | Name 1 |
Name2 | string | Name 2 |
Street | string | Straße |
StreetNumber | string | Hausnummer |
PostalCode | string | PLZ |
City | string | Ort |
State | string | Bundesland |
Country | string | Land |
Phone | string | Telefon |
Fax | string | Fax |
string | ||
Homepage | string | URL Homepage |
BankAccounts | List\<BankAccount> | Liste der Bankkonten (vom Typ BankAccount) |
Tabelle: Auflistung der Veranstalter-Felder für E-Mail- Datenkontext
Order
Das Order-Objekt enthält alle bei der Anmeldung verwendeten Daten inkl. mehrerer Hilfseigenschaften, die z.B. den Zugriff auf die Teilnehmer- oder Kontoinhaberdaten vereinfachen.
Feld | Typ | Beschreibung |
---|---|---|
AllProtocols | List\<OrderProtocol> | Liste aller Arbeitsschritte |
BankAccount | BankAccount | Liste des bei der Bestellungen genutzten Bankkontos |
BankAccountHolderPerson | Person | Personen-Objekt des Kontoinhabers |
BillingRecipientPerson | Person | Personen-Objekt des Rechnungsempfängers, Fallback auf Hauptbenutzer |
BillToAddressId | String | Id des Rechnungsempfängers |
BookingErrors | List\<ResponseError> | Liste der bei der Buchung aufgetretenen Fehler |
BookingStatus | BookingStatus | Status der Buchung Completed / Failed |
ConfirmationBy | String | Id des Teilnehmers, der eine Befürwortung durchführen soll. |
ConfirmReservationPerson | Person | Personen-Objekt des Teilnehmers, der eine Befürwortung durchführen soll. |
Culture | string | Sprach-Einstellung, Standard: „de-DE“ |
Debtor | Person | Personen-Objekt des Debitors: Bei Abbuchung Kontoinhaber, bei Überweisung Hauptteilnehmer |
Guest | Boolean | Wurde Anmeldung als Gastanmeldung durchgeführt? |
HasCoupon | Boolean | Enthält die Bestellung einen Gutschein-Kauf? |
HasCourse | Boolean | Enthält die Bestellung min. einen Kurs? |
HasFees | Boolean | Liegen für die Bestellung Gebühren vor? |
HasNormalRegistration | Boolean | Enthält die Bestellung min. eine erfolgreiche Anmeldung? |
HasOnlyRegularRegistrations | Boolean | Enthält die Bestellung ausschließlich erfolgreiche Anmeldungen? |
HasProspectiveBuyerList | Boolean | Enthält die Bestellung eine Anmeldung auf Interessentenliste? |
HasReservation | Boolean | Enthält die Bestellung eine Anmeldung im Befürwortungsmodus? |
HasWaitingList | Boolean | Enthält die Bestellung eine Anmeldung auf Warteliste? |
Id | string | Id der Buchung in ITEM_ORDERS-Tabelle |
MandateCreated | string | Mandatsreferenz für neu angelegtes Mandat |
MandateRequested | string | Mandatsreferenz für neu angefordertes Mandat |
Note | string | Notiz des Teilnehmers |
OneWay | Boolean | Anmeldung im Oneway-Modus, d.h. ohne Rückmeldung an Homepage |
OrderDate | DateTime | Datum der Buchung |
OrderDetails | List\<OrderDetail> | Liste der gebuchten Positionen, siehe unten |
OrderId | GUID | OrderId |
PaymentDetails | PaymentDetails | Zahlungsinformationen |
PaymentMethodChanged | Boolean | Hat sich Zahlform bei OneWay-Anmeldung geändert? |
Protocols | List\<OrderProtocol> | Liste aller Arbeitsschritte |
RedeemedCoupons | List\<Coupon> | Liste der eingelösten Gutscheine |
Rollback | Boolean | Testanmeldung mit Datenbankrollback? |
Tan | String | TAN |
TotalBookedQty | int | Anzahl aller tatsächlich gebuchten Plätze; Warteliste wird hier nicht mitgezählt. |
TotalFees | decimal | Gesamtgebühren |
TotalRequiredQty | int | Anzahl aller angeforderten Plätze |
UserAccount | UserAccount | UserAccount-Objekt, mit allen Informationen zu dem Benutzerprofil |
UserAccountId | string | ID des Hauptbenutzers (Kufer: Teilnehmer.NR, LISSY: ADRESSEN_ID) |
UserAccountPerson | Person | Personenbezogene Infos zu Hauptbenutzer |
ValidationErrors | List\<ResponseError> | Liste aller Validierungsfehler |
ValidationStatus | ValidationStatus | Status der Validierung: valid / invalid |
WS_Version | String | Version von Webservice, die Bestellung verarbeitet hat |
Tabelle: Auflistung der Order-Felder in E-Mail-Datenkontext
Beispiel: Zugriff auf Vornamen des Hauptbenutzers
\$Model.UserAccountPerson.FirstName
OrderDetail
Das OrderDetail-Objekt enthält alle Informationen für eine einzelne Position aus dem Warenkorb.
Feld | Typ | Beschreibung |
---|---|---|
AllProtocols | IEnumerable\<OrderProtocol> | Alle Protokoll-Meldungen für Kurs |
Attendants | List\<Attendant> | Liste aller Kursteilnehmer-Objekte |
BookingErrors | List\<ResponseError> | Liste aller Buchungsfehler |
BookingStatus | BookingStatus | Buchungsstatus: „Completed“ / „Failed“ |
CouponNote | String | Notiz bei Gutscheinerwerb |
CouponValue | Decimal | Gutschein-Wert |
Course | CourseDetails | Kurs-Details |
CourseId | String | Kurs-Nr (Kufer) bzw. Kurs_id (LISSY) |
CourseSummary | CourseSummary | Vereinfachtes Kurs-Objekt |
Fees | BasicFee | Übersicht über Kursgebühren |
HasUserProtocols | bool | Enthält Protokoll-Datensätze für Teilnehmer |
Id | String | ID in ITEM_ORDERDETAILS-Tabelle |
InternalOrderId | String | ID von zugehörigen Datensatz in ITEM_ORDERS-Tabelle |
Lecturer | Person | Personen-Datensatz des Dozenten |
Note | String | Kursbezogene Notiz des Teilnehmers |
Protocols | IEnumerable\<OrderProtocol> | Protokoll-Meldungen für Verwaltung |
RegistrationLevelChanged | Boolean | Unterscheidet sich der tatsächliche Anmeldestatus vom bestellten (nur bei OneWay-Anmeldungen)? |
RegistrationMode | RegistrationMode | Anmelde-Modus (Normal, Befürwortungsmodus) |
TotalQty | Int | Anzahl der bestellten Plätze |
Type | OrderDetailType | Art (Kurs, Gutschein) |
UserProtocols | IEnumerable\<OrderProtocol> | Protkoll-Meldungen für Teilnehmer |
ValidationErrors | List\<ResponseError> | Liste aller Validierungsfehler |
ValidationStatus | ValidationStatus | Validierungsstatus |
Venue | Kursort | Informationen Kursort |
Tabelle: Auflistung der OrderDetails-Felder im E-Mail-Datenkontext
Auf das OrderDetails-Objekte wird in der Regel innerhalb einer Schleife zugegriffen:
#foreach(var \$detail in \$Model.Order.OrderDetails)
{
\$detail.Course.Title
\$detail.Course.SubTitle
}
In dem obigen Beispiel werden beispielweise in einer foreach-Schleife Titel und Untertitel aller Kurse der Bestellung untereinander ausgegeben.
Attendant
Das Attendant-Objekt stellt die Anmeldung einer einzelnen Person zu einem Kurs dar. Es ist in Listenform im OrderDetails-Objekt enthalten.
Feld | Typ | Beschreibung |
---|---|---|
Coupons | List\<Coupon> | Liste der erworbenen Gutscheine |
ExternalId | String | Externe ID, z.B. aus ContentServ |
Fees | AggregatedFee | Gebühren-Objekt |
Id | String | Id des Personen-Objekts |
InternalId | String | Id’s der zugehörigen Anmeldungs bzw. Belegungs-Datensätze |
InvoiceNumber | String | Rechnungsnummer, Kassenzeichen |
LocalizedRegistrationLevel | String | Lokalisierte Version des Anmeldestatus |
MandateId | String | Bei der Verbuchung genutzte SEPA-Mandatsreferenz |
Person | Person | Personen-Objekt des Teilnehmers |
QtyOthers | Int | Anzahl der zusätzlichen Teilnehmer bei anonymer Mehrfachbuchung |
Quantity | Int | Anzahl der gebuchten Plätze |
RegistrationLevel | RegistrationLevel | Anmelde-Status |
Tabelle: Auflistung der Attendant-Felder zur Verwendung in E-Mail-Datenkontext
Abhängige Objekte
Person
Das Person-Objekt enthält alle personenbezogenen Informationen, wie z.B. Anschrift, Kontaktdaten.
Feld | Typ | Beschreibung |
---|---|---|
Barred | Boolean | Gesperrt (Ja/Nein) |
BarredDueTo | String | Grund für Sperre |
CareOf | String | „Care of“-Adresszusatz |
City | String | Ort |
ContactInformation | List\<ContactEntry> | Liste mit Kontaktdaten |
Country | String | Land |
Culture | String | Spracheinstellung, z.B. „de-DE“ |
DateOfBirth | DateTime | Geburtsdatum |
DefaultDiscountDetail | DiscountDetails | Ermäßigungsgruppe |
FirstName | String | Vorname |
Gender | String | Geschlecht (M/W) |
Id | String | ID in Datenbank |
Language | String | Sprache |
LastName | String | Nachname |
Nationality | String | Staatsangehörigkeit |
PostalCode | String | PLZ |
Salutation | String | Ansprache (z.B. Sehr geehrter Herr Mustermann) |
State | String | Bundesland |
Street | String | Straße |
StreetNumber | String | Hausnummer |
Title | String | Titel, z.B. Dr. med. |
Tabelle: Auflistung der Person-Felder zur Verwendung in E-Mail-Datenkontext
ContactEntry
Das Objekt ContactEntry stellt eine Kontaktmöglichkeit, z.B. E-Mail-Adresse oder Telefonnummer, dar.
Feld | Typ | Beschreibung |
---|---|---|
Id | string | Id von Kontaktdatensatz in Kursverwaltung |
Label | String | Beschriftung für Kontaktdatensatz, z.B. „E-Mail“, „Telefon dienstlich“ |
PromotionalUse | Boolean | Darf der Kontakt-Datensatz für Werbezwecke, z.B. Newsletter, verwendet werden? |
SortIndex | Int | Sortierung |
Type | ContactEntryType | Art, z.B. „phone“, „email“ |
Value | String | Wert |
Tabelle: Auflistung der ContactEntry-Felder zur Verwendung in E-Mail-Datenkontext
BankAccount
Das BankAccount-Objekt stellt einen Bankdatensatz im Kursverwaltungsprogramm dar.
Feld | Typ | Beschreibung |
---|---|---|
AccountHolderId | String | ID des Kontoinhabers |
AccountNumber | String | Kontonummer |
BankCode | String | BLZ |
BankName | String | Name Bankinstitut |
Bic | String | BIC |
Iban | String | IBAN |
Id | String | ID des Bankdatensatzes in Kursverwaltungsprogramm |
IsDifferentAccountHolder | Boolean | Liegt abw. Kontoinhaber vor? |
MandateDtOfSgntr | DateTime | Austellungsdatum SEPA-Lastschriftmandat |
MandateExpirationAt | DateTime | Ablaufdatum SEPA-Lastschriftmandat |
MandateId | String | Mandatsreferenz SEPA-Lastschriftmandat |
MandateInternalId | String | ID von Mandatsdatensatz in Kursverwaltungsprogramm |
MandateType | String | Art von SEPA-Lastschriftmandat (Wiederkehrend, Einmalig) |
SortIndex | Int | Sortierung |
Tabelle: Auflistung der BankAccount-Felder zur Verwendung in E-Mail-Datenkontext
BasicFee
Das Fee-Objekt stelle die Gebühren für eine Position des Warenkorbs dar:
Feld | Typ | Beschreibung |
---|---|---|
AmountPaid | Decimal | Bereits gezahlte Gebühr |
Quantity | Int | Anzahl |
Reduction | Decimal | Ermäßigung |
RegularFee | Decimal | Einzelne Gebühr |
RegularFeeTotal | Decimal | Gesamtbetrag ohne Ermäßigung |
TotalFee | Decimal | Gesamtbetrag nach Ermäßigung |
Tabelle: Auflistung der BasicFee-Felder zur Verwendung in E-Mail-Datenkontext
UserAccount
Das UserAccount-Objekt repräsentiert alle Daten eines Teilnehmers während einer Internetanmeldung.
Feld | Typ | Beschreibung |
---|---|---|
UserName | string | Benutzername (=E-Mail) |
PersonList | List\<Person> | Liste aller Personen-Objekte |
BankAccounts | List\<BankAccount> | Liste aller Bankkonten |
BillingRecipients | List\<BillingRecipient> | Liste der Standard-Rechnungsempfänger |
LinkedPersons | List\< LinkedPerson> | Liste der Subteilnehmer |
Tabelle: Auflistung der UserAccount-Felder zur Verwendung in E-Mail-Datenkontext
In der Regel wird aus den Mail-Templates nicht direkt auf das UserAccount-Objekt zugegriffen, sondern über die Hilfseigenschaften des Order-Objektes, z.B. Order.UserAccountPerson oder Order.BankAccount.
Datei-Anhänge
Vhs.Connect Konnektor kann an die erstellten E-Mails feste oder dynamische generierte Dateien anhängen:
-
Feste Anhänge:
Fertige PDF-Dateien mit AGBs, Mandatsanforderung usw. -
Dynamisch generierte PDFs:
Anmeldekarten, Rechnungen, Mandatsanforderungen, usw.
Abbildung: Bestätigungs-E-Mail mit dynamisch generiertem PDF-Anhang
Das folgende Kapitel beschreibt, welche Einstellungen in den Mail-Template-Dateien vorgenommen werden müssen, um die oben beschriebene Funktionalität zu erreichen.
Aufbau XML
Die Anhangs-Funktionalität wird innerhalb der MailTemplate-Datei im Unterpunkt \<AttachementTemplates> definiert. Das \<AttachementTemplates>-Element enthält eine Liste von \<AttachementTemplate>-Elementen, die je einen einzelnen Anhang repräsentieren.
Abbildung: Anhangsfunktionalität von Mail-Versand im Element \<AttachementTemplate> steuern
Im Element \<AttachementTemplate> können folgende Eigenschaften festgelegt werden:
Feld | Beschreibung |
---|---|
Type | Typ: Fester Anhang („file“) oder dynamisches PDF („html2pdf“) |
Path | Pfad zu Datei oder Vorlagendatei für PDF-Generierung |
FileNameTemplate | Template für Dateiname mit Datenbindung |
Scope | Umfang von Datenkontext: |
Ignore | Soll Anhang unter gewissen Umständen nicht verwendet werden? |
PdfManipulations | Liste von nachträglichen PDF-Manipulationen, z.B. für Hintergründe, Drehungen, usw. |
PageWidth | Breite des dynamisch generierten PDFs |
PageHeight | Höhe des dynamisch generierten PDFs |
CopyTo | Verzeichnis zum Speichern von dynamisch generierten PDFs |
-
summary: MailTo, Order, Institution
Anhang wird einmal pro Bestellung generiert, z.B. Gesamtrechnung. -
orderdetail: MailTo, Order, OrderDetail, Institution
Für jede Position(=OrderDetail) der Bestellung wird ein Anhang angehängt bzw. generiert. -
attendant: MailTo, Order, OrderDetail, Attendant, Institution
Pro Teilnehmer und Kurs wird ein Anhang erstellt, z.B. Anmeldekarte.
Feste Datei-Anhänge
Feste Datei-Anhänge können mit der folgenden Konfiguration erstellt werden:
\<AttachmentTemplate>
\<Type>file\</Type>
\<Path>MailTemplates\de-DE \*.pdf\</Path>
\</AttachmentTemplate>
Die obige Konfiguration hängt alle PDF-Dateien im Mail-Template-Ordner automatisch an die E-Mail an. Es müssen lediglich der Typ auf „file“ gestellt und im Element \<Path> ein relativer Pfad zu den anzuhängenden Dokumenten angegeben werden, der auch Wildcards (hier: *) enthalten kann, mehr hierzu s. wikipedia.org/wiki/Wildcard_(Informatik)
Hinweis: Im Dateinamen können Variablen, z.B. für die Kursnummer, eingebaut werden. Auf diese Weise können für unterschiedliche Kurse unterschiedliche PDF-Dokumente an die Bestätigungsmail angehängt werden.
PDF-Anhänge erstellen
Neben den festen PDF-Anhängen kann vhs.Connect Konnektor dynamisch PDF-Dateien generieren und an die verschiedenen E-Mails anhängen.
Abbildung: Anmeldekarte an Bestätigungs-E-Mail anhängen
In der obigen Abbildung wird eine Anmeldekarte gezeigt, die für jeden Kurs und Teilnehmer erstellt und an die Bestätigungs-E-Mail angehängt wird.
Die PDF-Erstellung setzt sich aus folgenden Komponenten und Prozessen zusammen:
-
HTML-Vorlagen-Datei:
Der Aufbau der PDF (Maße, Datenbindung, etc.) wird in einer HTML-Datei angegeben. -
Datenbindung:
NVelocity füllt Vorlagen-Datei mit Daten der Internetanmeldung aus. -
PDF-Erstellung
HTML-Datei wird als PDF gespeichert. -
PDF – Nachbearbeitung:
PDF-Datei wird ggf. mit Hintergrund oder zusätzlichen Seiten versehen
Um eine PDF an eine E-Mail anzuhängen, muss wie bei den festen Dateianhängen ein „AttachmentTemplate“-Element in das XML-Dokument des Mail-Template eingefügt werden:
Abbildung: Dynamischen PDF-Anhang für Mail-Versand generieren
Im Feld Type muss der Wert „html2pdf“ eingetragen werden. Der Eintrag im Feld Path steuert dann, wo die zu verwendende Vorlagendatei liegt. Die Seite kann in einem beliebigen HTML-Editor bearbeitet werden.
Abbildung: HTLM-Vorlagendatei für PDF-Anhang
Das Feld „Scope“ gibt an, wie oft das PDF generiert werden muss. In diesem Fall signalisiert der Eintrag „attendant“, dass das PDF für jede Kurs und jeden Teilnehmer erstellt werden muss.
Der Eintrag im Feld „Ignore“ steuert, ob das PDF in bestimmten Fällen nicht ausgegeben werden soll. In diesem Fall werden für Anmeldungen zu Kursen mit bestimmten Kennzeichen keine Anmeldekarten erstellt.
Anschließend können im Unterelement „PdfManipulations“ verschiedene PDF-Nachbearbeitungsschritte definiert werden. In diesem Beispiel wird ein Briefbogen („background.pdf“) auf allen Seiten in den Hintergrund gelegt.
Highlight Kurse
Kurse können in der Buchungsbestätigung und den Bulkmailings beworben werden. Hierzu sind folgende Einstellungen möglich/nötig:
Einstellungen:
Damit die Highlight-Kurse bei der Mailerstellung geladen werden, muss das
Interface HasHighlightCourses
auf dem MailContext vorhanden sein und in
den MailTemplateHints
einer oder mehrere der folgenden Optionen aktiviert werden:
Option | Beschreibung |
---|---|
All:ShowHighlightCourses | Alle Templates |
Bulk:ShowHighlightCourses | Alle Templates die mit bulk beginnen |
booking_confirmation.tmpl:ShowHighlightCourses | Nur das Template booking_confirmation.tmpl |
Sql-Templates
Es gibt bei den Sql-Templates unter Mailing
2 Templates die konfiguriert werden können.
HighlightCourses
: Wenn keine UserId vorhanden ist, dann wird dieses Template verwendet, um die Highlight-Kurse zu ladenHighlightCoursesUser
: Wenn eine UserId vorhanden ist (bei BulkMails wird dieses ausUserId
mit Fallback aufPersonId
geladen)
Beispiel Sql-Template für KuferSql-MSSQL:
select top 3
k.nr as CourseId
from
kurse k
left outer join WEB_KURSHIGHLIGHTS wh on k.NR= wh.knr
@where
and k.nr in (@CourseId)
and not exists (SELECT 1 FROM BELEGUNG b WHERE b.KNR = k.NR and b.TNR = @UserId) /* TN hat noch keine Anmeldung in Kurs*/
and isnull(k.TEIL_AKT,0)<k.TEIL_MAX /* Es gibt noch freie Plätze */
and wh.knr is not null /* Highlight gesetzt (Web-> Highlight-Kurs -> Kurs anzeigen*/
and (nullif(wh.von, '30.12.1899') is null or wh.von <= getdate()) /* von nicht gesetzt oder in vergangenheit*/
and (nullif(wh.bis, '30.12.1899') is null or wh.bis >= getdate()) /* bis nicht gesetzt oder in zukunft*/
and dateadd(d, -7, k.BEGINN_DAT) > getdate() /*Kurse dessen Beginndatum mindestens eine Woche in der Zukunft liegt*/
order by newid()
Mail-Variablen
Zur Einfachen Einbindung können die 2 Mail-Variablen VAR_HIGHLIGHT_COURSES
und VAR_HIGHLIGHT_COURSES_ZURB
genutzt werden.
Beispieleinbindung in booking_confirmation.tmpl:
...
#if($Helper.IsEmptyList($Model.HighlightCourses) == false)
@@VAR_HIGHLIGHT_COURSES
#end
...