In diesem Kapitel werden folgende Themen behandelt:
Die Fähigkeit, E-Mails zu empfangen und zu senden ist eine Kernfunktion von ConSol CM. Eine detaillierte Einführung in die E-Mail-Funktionen finden Sie im ConSol CM Administratorhandbuch.
In diesem Abschnitt ist beschrieben, wie Sie Skripte schreiben, die E-Mails aus dem Workflow senden. Dies ist beispielsweise für folgende Anwendungsfälle sehr praktisch:
Normalerweise schreiben Sie den Text der E-Mail nicht in das Skript sondern arbeiten mit E-Mail-Vorlagen. Lesen Sie dazu zuerst den Abschnitt über den ConSol CM Textvorlagen-Manager im ConSol CM Administratorhandbuch.
Verwenden Sie ein Objekt der Klasse Mail.
Hier können Sie alle erforderlichen Parameter für eine E-Mail definieren und das Mail-Objekt so konfigurieren, dass es das queue-spezifische Standardskript für E-Mails verwendet. Dies ist das Skript, das die E-Mail verarbeitet, bevor sie das CM-System verlässt. Diese Art von Skript kann einer Queue zugewiesen werden (E-Mail-Skript, siehe Abschnitt Queue-Verwaltung im ConSol CM-Administratorhandbuch). Die Verwendung so eines Skripts kann hilfreich sein, wenn Sie zum Beispiel eine REPLY-TO-Adresse setzen möchten, die nicht die (in einer System-Property gespeicherte) Standardadresse für REPLY TO ist.
Dieses Skript kann an eine der ersten Aktivitäten des Workflows angehängt werden.
// create new mail object
def mail = new Mail()
// fetch main contact of the ticket
def maincontact = ticket.getMainContact()
// fetch e-mail address of the main contact. The Data Object Group Field has to be addressed using Data Object Group name:Data Object Group Field name
def toaddress = maincontact.get("MyCustomerDataObjectGroup:email")
// put the e-mail TO address into the Mail object
mail.setTo(toaddress)
// fetch the REPLY TO address, this is stored in a system property
def replyaddress = configurationService.getValue("cmweb-server-adapter","mail.reply.to")
// put the e-mail REPLY TO address into the Mail object
mail.setReplyTo(replyaddress)
// build e-mail text using a template which is stored in the Template Designer
def text = workflowApi.renderTemplate("Acknowledgement_of_receipt")
// put the e-mail text into the Mail object
mail.setText(text)
// create the subject of the e-mail, the ticket number with the correct Regular Expression has to be set for correct recognition of incoming e-mails for the ticket
def ticketname = ticket.getName()
def subject = "Your case has been registered as Ticket (" + ticketname + ")"
// put the subject into the Mail object
mail.setSubject(subject)
// send out the e-mail
mail.send()
Code-Beispiel 53: Senden einer automatischen Empfangsbestätigung an den Kunden, der das Ticket erstellt hat, unter Verwendung eines Mail-Objekts
Dieses Skript kann an eine automatische Aktivität, die mit einem Zeit-Trigger verbunden ist, angehängt werden. Der Zeit-Trigger misst das Eskalationsintervall. Wenn die Deadline erreicht wurde, feuert der Trigger und das Ticket läuft in die automatische Aktivität.
// create new mail object
def mail = new Mail()
// fetch current engineer of the ticket and set it as e-mail receiver
if (ticket.engineer){
mail.setTargetEngineer(ticket.engineer)
// fetch the REPLY TO address, this is stored in a system property
def replyaddress = configurationService.getValue("cmweb-server-adapter","mail.reply.to")
// put the e-mail REPLY TO address into the Mail object
mail.setReplyTo(replyaddress)
// build e-mail text using a template which is stored in the Template Designer
def text = workflowApi.renderTemplate("ESCALATION_Mail")
// put the e-mail text into the Mail object
mail.setText(text)
// create the subject of the e-mail, the ticket number with the correct Regular Expression has to be set for correct recognition of incoming e-mails for the ticket
def ticketname = ticket.getName()
def subject = "ESCALATION Level 3 REACHED! Ticket (" + ticket.getId() + ")"
// put the subject into the Mail object
mail.setSubject(subject)
// send out the e-mail
mail.send()
}
Code-Beispiel 54: Senden einer E-Mail an den Bearbeiter, wenn eine bestimmte Eskalationsstufe erreicht wurde, unter Verwendung eines Mail-Objekts
Dies ist das gleiche Skript, das auch im obigen Beispiel gezeigt ist. Es wird allerdings ein queue-spezifisches E-Mail-Skript angewendet. Eine detaillierte Erklärung über diese Art von Skript finden Sie im ConSol CM Administratorhandbuch, Abschnitt Admin-Tool-Skripte.
Dies bewirkt, dass die ausgehende E-Mail das Skript durchläuft, bevor sie das CM-System verlässt. E-Mail-Parameter wie CC, BCC oder REPLY TO können geändert werden.
// create new mail object
def mail = new Mail()
// fetch main contact of the ticket
def maincontact = ticket.getMainContact()
// fetch e-mail address of the main contact. The Data Object Group Field has
// to be addressed using Data Object Group name:Data Object Group Field name
def toaddress = maincontact.get("MyCustomerDataObjectGroup:email")
// put the e-mail TO address into the Mail object
mail.setTo(toaddress)
// fetch the REPLY TO address, this is stored in a system property
def replyaddress = configurationService.getValue("cmweb-server-adapter","mail.reply.to")
// put the e-mail REPLY TO address into the Mail object
mail.setReplyTo(replyaddress)
// build e-mail text using a template which is stored in the Template Designer
def text = workflowApi.renderTemplate("Acknowledgement_of_receipt")
// put the e-mail text into the Mail object
mail.setText(text)
// create the subject of the e-mail, the ticket number with the correct Regular Expression
// has to be set for correct recognition of incoming e-mails for the ticket
def ticketname = ticket.getName()
def subject = "Your case has been registered as Ticket (" + ticketname + ")"
// put the subject into the Mail object
mail.setSubject(subject)
// Mail should use the e-mail script which is configured for the queue
mail.useDefaultScript()
// send out the e-mail
mail.send()
Code-Beispiel 55: Senden einer E-Mail an einen Kunden unter Einbeziehung des queue-spezifischen E-Mail-Skripts, unter Verwendung eines Mail-Objekts
Damit wird eine E-Mail mit allen Kunden (die eine E-Mail-Adresse haben) als Empfänger gesendet. Beachten Sie, dass dies ein einfaches Beispiel ist, das die Verwendung einer Liste zeigt. Die REPLY-TO-Adresse wird nicht gesetzt, sodass Antworten auf diese E-Mail nicht an das Ticket angehängt würden.
def custEmails = workflowApi.getContactList()*.get("email").findAll{it != null}.join(",")
workflowApi.sendEmail(custEmails, "Confirmation", "Good afternoon, we received your request!", null, null)
Code-Beispiel 56: Senden einer E-Mail an alle Kontakte des Tickets
Damit wird eine E-Mail an jeden einzelnen Kunden (der eine E-Mail-Adresse hat) gesendet. Beachten Sie, dass dies ein einfaches Beispiel ist, das die Verwendung einer Liste zeigt. Die REPLY-TO-Adresse wird nicht gesetzt, sodass Antworten auf diese E-Mail nicht an das Ticket angehängt würden.
workflowApi.getContactList().each {
def custEmail = it.get("email")
if (custEmail){
workflowApi.sendEmail(custEmail, "Confirmation",
"Good afternoon, we received your request!", null, null)
}
}
Der folgende Code zeigt ein Skript, das aufgerufen wird, um eine Empfangsbestätigung an den Kunden zu senden, wenn ein Ticket für diesen Kunden erstellt wird. Wenn der Hauptkunde des Tickets eine Firma ist, wird keine E-Mail gesendet, weil die Firmen in unserem Beispielsystem keine E-Mail-Adressen haben. Im nächsten Schritt muss das Datenobjektgruppenfeld, das die E-Mail-Adresse enthält, gefunden werden. Der Feldname kann je nach Kundengruppe (mit dem entsprechenden Kundendatenmodell) unterschiedlich sein, was berücksichtigt werden muss. Wenn eine E-Mail gesendet wurde, wird dies in einem Eintrag im Ticketprotokoll mit dem richtigen Eintragstyp dokumentiert.
import com.consol.cmas.common.model.mail.Mail
import com.consol.cmas.common.model.content.MailEntryStatus;
import com.consol.cmas.common.model.content.AttachmentEntry;
import com.consol.cmas.common.model.content.ContentFile;
import com.consol.cmas.common.model.content.ContentEntryCategory
import com.consol.cmas.common.model.content.MailEntry;
import com.consol.cmas.common.util.MailHeadersUtil;
import com.consol.cmas.core.server.service.*;
// create new mail object
def mail = new Mail()
def ticket = workflowApi.getTicket()
// fetch main contatc of the ticket
def maincontact = ticket.getMainContact()
def unit_type = maincontact.definition.type.toString()
if(unit_type.equals('COMPANY')) {
println 'No email address for company; no receipt notice sent.'
return
} else if (unit_type.equals('CONTACT')){
def toaddress_field
def custgroup = maincontact.customerGroup.name
println 'Customergroup is now ' + custgroup
switch(custgroup) {
case "Reseller": toaddress_field = "email";
break;
case "DirectCustomers": toaddress_field = "dir_cust_email"
break;
case "MyCustomerGroup": toaddress_field = "email"
break;
case "OurPartnerCompanies": toaddress_field = "email"
break;
case "RetailCustomers": toaddress_field = "retail_customer_email"
break;
}
def toaddress = maincontact.get(toaddress_field)
println 'toaddress is now ' + toaddress
if (!toaddress){
println 'No email address found for contact, no receipt notice sent.'
} else {
// put the e-mail TO address into the Mail object
mail.setTo(toaddress)
// fetch the REPLY TO address, theis is stored in a system property
def replyaddress = configurationService.getValue("cmweb-server-adapter","mail.reply.to")
// put the e-mail REPLY TO address into the Mail object
mail.setReplyTo(replyaddress)
// build e-mail text using a template which is stored in the Template Designer
def text = workflowApi.renderTemplate("Acknowledgement_of_receipt")
// put the e-mail text into the Mail object
mail.setText(text)
// create the subject of the e-mail, the ticket number with the correct Regular Expression
// has to be set for correct recognition of incoming e-mails for the ticket
def ticketname = ticket.getName()
def subject = "Your case has been registered as Ticket (" + ticketname + ")"
// put the subject into the Mail object
mail.setSubject(subject)
// Mail should use the e-mail script which is configured for the queue
mail.useDefaultScript()
// send out the e-mail and register status
def attList = new ArrayList<AttachmentEntry>()
def collection = new HashSet<MailEntry>()
def mailStatus = true;
// add attachments to attList .
try {
mail.send();
} catch (Exception e){
mailStatus = false;
}
MailEntry mailEntry = new MailEntry(subject,text);
// you can also use an email template -> String text = workflowApi.renderTemplate
mailEntry.setTicket(ticket);
mailEntry.setCategory(ContentEntryCategory.OUTGOING_MAIL);
// or other status -> see com.consol.cmas.common.model.content.ContentEntryCategory in API
mailEntry.setCreationDate(new Date());
mailEntry.setLastModificationDate(new Date());
mailEntry.setMimeType("text/html"); // maybe "text/plain" shows linebreaks if "text/html" doesn't
mailEntry.setEncoding("UTF-8");
mailEntry.setAttribute(MailHeadersUtil.FROM_PROPERTY, replyaddress)
mailEntry.setAttribute(MailHeadersUtil.TO_PROPERTY, toaddress)
mailEntry.setAttribute(MailHeadersUtil.SUBJECT_PROPERTY,subject);
if(mailStatus){
mailEntry.setMailEntryStatus(MailEntryStatus.SUCCESS)
} else {
mailEntry.setMailEntryStatus(MailEntryStatus.FAILURE)
}
attList?.each { att ->
mailEntry.addAttachment(att)
}
collection.add(mailEntry)
workflowApi.updateTicket(ticket,collection)
} // end if (!toaddress){
} // end of else if (unit_type.equals('COMPANY')){
Code-Beispiel 57: Admin-Tool-Skript zum Senden einer Empfangsbestätigung und Einfügen der E-Mail als Eintrag in das Ticketprotokoll
Im vorangegangenen Programmierbeispiel werden folgende Zeilen verwendet:
def ticketname = ticket.getName()
def subject = "Your case has been registered as Ticket (" + ticketname + ")"
Dies hat den Grund, dass das Muster für den E-Mail-Betreff sicherstellt, dass eine eingehende E-Mail dem richtigen Ticket zugewiesen werden kann. Dies bedeutet, dass Sie, wenn Sie die im obigen Beispiel gezeigte Codierung verwenden, sicherstellen müssen, dass das verwendete Muster mit dem Muster im Admin Tool (Navigationselement E-Mail ) übereinstimmt (siehe auch folgende Abbildung).
Abbildung 140: Admin Tool: Muster und Vorlage für den E-Mail-Betreff
Um Inkonsistenzen zwischen dem Workflow-Code und der Systemkonfiguration (Admin Tool) zu vermeiden, können Sie auch mit dem implizit in CM vorhandenen Vorlagennamen arbeiten.
Verwenden Sie im Admin-Tool-Skript folgenden Code:
import static com.consol.cmas.common.util.TemplateUtil.TICKET_SUBJECT_TEMPLATE_NAME
( ... )
def subject = templateService.merge(TICKET_SUBJECT_TEMPLATE_NAME, [ticketName:ticket.name])
Beachten Sie, dass Sie einen ticketName genannten Parameter im Kontext setzen müssen, damit die Vorlage funktioniert.
Alternative Lösung: Wenn Sie die Vorlage für die ausgehende E-Mail so ändern, dass sie entweder ticketName oder das Objekt ticket annimmt (dann können Sie mit ticket.name arbeiten), können Sie auch mit der normalen Methode renderTemplate() arbeiten, die unten gezeigt ist.
Die Vorlage für ausgehende E-Mail-Betreffs ist dann:
Ticket (<#if ticketName??>${ticketName}<#elseif ticket??>${ticket.name}</#if>)
Und der Betreff lautet dann:
def subject = workflowApi.renderTemplate(TICKET_SUBJECT_TEMPLATE_NAME)
Wenn Sie Skripte schreiben, in denen E-Mails an Bearbeiter und/oder Kunden gesendet werden, müssen Sie die Vertretungsregeln der Bearbeiter berücksichtigen. Detaillierte Erklärungen über die Vertretungsfunktion finden Sie im ConSol CM Administratorhandbuch (Abschnitt Rollenverwaltung) und im ConSol CM Benutzerhandbuch (Abschnitt Bearbeiterprofil).
Wichtige Informationen über die Konfigurationen von Vertretungen
Beachten Sie, dass es zwei unterschiedliche Szenarien für das Senden von E-Mails gibt und dass das Verhalten des CM-Systems bezüglich des Sendens von Vertretungs-E-Mails in den beiden Szenarien unterschiedlich sein kann!
Für mittels Skripten gesendete E-Mails hängt das Verhalten des CM-Systems bezüglich der Vertretungsregeln von der Methode ab, die zum Senden der E-Mail verwendet wird.
Alle drei hier aufgeführten Methoden gehören zur Java-Klasse Mail.
Mail.setTo(<e-mail of originalReceivingEngineer>)
Diese Methode erhält ein String-Objekt als Parameter. Dabei handelt es sich um die E-Mail-Adresse des Empfängers. Mit dieser Methode wird keine Kopie der ursprünglichen E-Mail an die Vertreter gesendet.
Mail.setTargetEngineer(<current engineer of the ticket>)
Diese Methode erhält ein Engineer-Objekt als Parameter und sendet die ursprüngliche E-Mail an die E-Mail-Adresse des Bearbeiters (sofern gesetzt) und an den vertretenden Bearbeiter, der als Vertreter für die ursprüngliche E-Mail-Adresse registriert ist. Seien Sie damit vorsichtig und lesen Sie die Infobox oben!
Diese Methode erhält eine Liste von Engineer-Objekten als Parameter und sendet die ursprüngliche E-Mail an die E-Mail-Adresse aller Bearbeiter in der Liste (sofern die E-Mail-Adresse gesetzt ist) und an die Vertreter aller in der Liste enthaltenen E-Mail-Adressen der Bearbeiter. Seien Sie damit vorsichtig und lesen Sie die Infobox oben!
Alle drei Methoden werden gleich verwendet, d. h. Sie müssen nur eine dieser Methoden verwenden, um die Adresse des Empfängers in einem Skript zu setzen, das eine E-Mail senden soll. Im folgenden Beispiel wird die Methode Mail.setTargetEngineer() verwendet.
import com.consol.cmas.common.model.mail.Mail
def ticket = workflowApi.ticket
import com.consol.cmas.common.model.mail.Mail
// Read engineer login from CF
// engineer login could also be retrieved, e.g., using ticket.engineer or engineerService.current, depending on what you need
def engineerName = ticket.get("main_data_fields.next_mail_to_engineer")
def engineer
if (engineerName) {
engineer = engineerService.getByName(engineerName)
}
def engineerMail = engineer?.email
if (engineerMail) {
def subject = "Your info mail about ticket " + ticket.getName() + " Subject:' " + ticket.getSubject() + "'"
// Retrieve e-mail text from template
def text = workflowApi.renderTemplate("engineer_info")
def mail = new Mail()
mail.setTargetEngineer(engineer)
mail.setSubject(subject)
mail.setText(text)
// Use outgoing mail script, queue-specific
mail.useDefaultScript()
try {
mail.send()
} catch (Exception e){
mailStatus = false
}
Code-Beispiel 58: Workflow- oder Admin-Tool-Skript zum Senden einer E-Mail an einen Bearbeiter, unter Verwendung der Vertretungsfunktion durch Einsatz der Methode setTargetEngineer()