E-Mail-Verarbeitung mithilfe von Skripts anpassen
In Codebeamer können Benutzer ein benutzerdefiniertes Groovy- oder Javascript-Skript hinzufügen, um E-Mails zu verarbeiten, die zu einer E-Mail-Adresse gelangen. Mit diesen Skripts können zusätzliche Aktionen wie das Erstellen neuer Vorgänge, das Posten von Kommentaren usw. aktiviert werden.
Erstellen Sie zum Konfigurieren der E-Mail einen neuen E-Mail-Posteingang, und fügen Sie unten auf der Seite Ihr Groovy- oder Javascript-Skript hinzu, wie in der folgenden Abbildung dargestellt:
Das Skript wird beim Abrufen von E-Mails ausgeführt. Dies geschieht einmal für jede eingehende E-Mail.
Der Umfang des Skripts enthält Folgendes:
Variablenname
Typ
Beschreibung
applicationContext
org.springframework.context.ApplicationContext
Der Spring-Kontext wird verwendet, um über den Aufruf applicationContext.getBean("name...") Zugriff auf alle DAO und Manager von Codebeamer zu erhalten.
scriptWorkflowListener
com.intland.codebeamer.inbox.processors.ScriptEmailProcessor
Die E-Mail-Prozessor-Instanz selbst.
scriptEmailProcessor
gleich wie scriptWorkflowListener
Die E-Mail-Prozessor-Instanz selbst.
logger
org.apache.log4j.Logger
Verwenden Sie diese Variable, um Debug- oder Verfolgungsinformationen in log4j zu protokollieren. Durchsuchen Sie die Variable ScriptEmailProcessor nach solchen Protokollen.
email
com.intland.codebeamer.inbox.ReceivedMailBean
Diese Bean enthält den eingehenden E-Mail-Text und die vorverarbeiteten Daten. Verwenden Sie diese , um den Inhalt der E-Mail abzurufen.
inbox
com.intland.codebeamer.persistence.dto.InboxDto
Diese Bean enthält die Definition des E-Mail-Posteingangs.
emailContext
com.intland.codebeamer.inbox.emailresolver.ResolvedEmailContext
Die Bean enthält die aufgelöste Entität der Antwort-E-Mails.
sender
com.intland.codebeamer.persistence.dto.UserDto
Der Benutzer, der die E-Mail gesendet hat. Diese Variable ist nur anwendbar, wenn der Benutzer eine Antwort auf die Benachrichtigungs-E-Mail von Codebeamer sendet.
identifiable
IdentifiableDto
Wenn ein Benutzer eine Antwort auf eine Benachrichtigungs-E-Mail von Codebeamer sendet, wird die Entität, der Fehler oder der Vorgang aus der Benachrichtigungs-E-Mail abgerufen.
entity
...
Wenn ein Benutzer eine Antwort auf eine Benachrichtigungs-E-Mail von Codebeamer sendet, wird die Entität, der Fehler oder der Vorgang aus der Benachrichtigungs-E-Mail abgerufen.
bindings
javax.script.Bindings
Die von der Skript-Engine verwendete globale Variablenzuordnung.
user
com.intland.codebeamer.persistence.dto.UserDto
Der vom Posteingang bereitgestellte Standardbenutzer. Verwenden Sie diese Option, wenn Sie Entitäten, Vorgänge oder Wikiseiten als Standardbesitzer erstellen.
Beachten Sie Folgendes, wenn Sie Skripts verwenden, um E-Mails zu konfigurieren:
Verwenden Sie die email-Variable, um Zugriff auf den Inhalt der E-Mail zu erhalten.
Verwenden Sie die email.subject-Variable, um auf den Betreff der eingehenden E-Mail zuzugreifen.
Verwenden Sie die email.getHeader("to")-Variable, um auf das Feld "An" der E-Mail zuzugreifen. Greifen Sie ebenso auf E-Mail-Kopfzeilen zu.
E-Mails können mehrere Teile enthalten, z.B. mehrere HTML und Nur-Text-Teile. Folgendermaßen greifen Sie auf diese Teile zu:
email.getPlainTextParts().get(0).getBody() ruft den ersten Klartext-Teil der E-Mail ab.
email.getHtmlParts().get(0).getBody() ruft den ersten HTML-Teil aus der E-Mail ab.
Die E-Mail-Verarbeitung wird im Hintergrund ausgeführt. Es wird keine Benutzeroberflächenkomponente angezeigt, um die Debugging-Werte anzuzeigen. Verwenden Sie die Aufrufe logger.info ("..."), um die Protokolle oder die Debug-Informationen zu den Protokolldateien auf dem Server hinzuzufügen.
Die E-Mail-Verarbeitung erfolgt in bestimmten Intervallen. Sie müssen einige Minuten warten, bis die E-Mail verarbeitet wird. Während der Entwicklung können Sie die Posteingänge bei Bedarf manuell abrufen.
Verwenden Sie Aufrufe wie trackerItemManager=applicationContext.getBean (TrackerItemManager.class), um auf die DAO-/Manager-Klassen zuzugreifen.
Nachstehend finden Sie ein Beispiel für ein Groovy-Skript, das einen neuen Vorgang im zugehörigen Tracker erstellt:


import java.util.regex.*;

import com.intland.codebeamer.persistence.dto.*;
import com.intland.codebeamer.persistence.dto.base.*;
import com.intland.codebeamer.persistence.dao.*;
import com.intland.codebeamer.persistence.util.ArtifactPlusContent;
import com.intland.codebeamer.remoting.ArtifactType;
import com.intland.codebeamer.remoting.DescriptionFormat;
import com.intland.codebeamer.manager.*;
import com.intland.codebeamer.controller.importexport.*;
import org.apache.commons.lang3.*;
import com.intland.codebeamer.text.html.*;
import com.intland.codebeamer.manager.util.*;

logger.info("I'm a groovy script, processing " + email);

// id of Leads tracker on cb.com
leadTrackerId = 94520

trackerDao = applicationContext.getBean(TrackerDao.class);
trackerItemManager = applicationContext.getBean(TrackerItemManager.class);

item = new TrackerItemDto();
leadsTracker = trackerDao.findById(leadTrackerId);
item.setTracker(leadsTracker);

// read custom fields in "Leads" tracker
// using a helper class to access fields by name
fieldAccessor = new com.intland.codebeamer.text.excel.FieldAccessor(applicationContext);
fieldAccessor.setUser(user);

def setField(issue, fieldName, value) {
field = fieldAccessor.getFieldByName(issue, fieldName);
if (field != null) {
field.setValue(issue, value);
} else {
logger.warn("Can not find field <" + fieldName +"> on " + issue);
}
};

def getEmailValue(text, regexp, defaultValue) {
p = Pattern.compile(regexp);
matcher = p.matcher(text);
found = defaultValue;
if (matcher.find()) {
found = matcher.group(1);
found = StringUtils.trimToNull(found);
}
logger.info("Found <" + found +"> for regexp <" + regexp +">");

if (StringUtils.isBlank(found) || "--".equals(found)) {
found = defaultValue;
}
return found;
}

subject = email.subject;
message = "";
if (subject.contains("CB New Account") && (subject.contains("saas.codebeamer.com") || subject.contains("codebeamer.com"))) {
// a new account is created on saas
html = email.getHtmlParts().get(0).getBody();
txt = HtmlCleaner.htmlToText(html); // convert the HTML to plain text to extract data from there
logger.info("Cleaned HTML to <" + txt +">")

firstName = getEmailValue(txt, "(?m)First Name(.*?)$", "--");
lastName = getEmailValue(txt, "(?m)Last Name(.*?)$", "--");
email = getEmailValue(txt, "(?m)Email.*?\<mailto:(.*)\>.*?$", "--");
company = getEmailValue(txt, "(?m)Company(.*)$", email);
country = getEmailValue(txt, "(?m)Geo-Location(.*?),", "--");

setField(item, "First name", firstName);
setField(item, "Last name", lastName);
setField(item, "E-Mail", email);
setField(item, "Company", company);
setField(item, "Country", country);
setField(item, "Lead Source", "Trial registration");

desc = subject +"
";
desc += "Country:" + country +"
";

item.description = desc;
} else {
to = email.getHeader("to");
if ("[email protected]".equals(to)) {
txt = email.getPlainTextParts().get(0).getBody();
logger.info("Processing email text:<"+ txt +">");

email = getEmailValue(txt, "(?m)Email(.*)$", "--");
if (! email.equals("--")) {
firstName = getEmailValue(txt, "(?m)First Name(.*)$", "--");
lastName = getEmailValue(txt, "(?m)Last Name(.*)$", "--");
company = getEmailValue(txt, "(?m)Company(.*)$", email);
phone = getEmailValue(txt, "(?m)Phone(.*)$", "--");
country = getEmailValue(txt, "(?m)Geo-Location(.*?),", "--");

setField(item, "First name", firstName);
setField(item, "Last name", lastName);
setField(item, "E-Mail", email);
setField(item, "Company", company);
setField(item, "Phone", phone);
setField(item, "Country", country);
setField(item, "Lead Source", "Trial registration");

desc = subject +"
";
desc += "Country:" + country +"
";

message = getEmailValue(txt, "(?m)(?s)Message:(.*)", "");
if (! StringUtils.isBlank(message)) {
desc += "
Message:
" + message +"
";
}

item.description = desc;
}
} else {
item = null;
}
}

if (item != null) {
try {
logger.warn("Creating a new item" + item);
trackerItemManager.create(user, item, null);
logger.warn("Created item:" + item);
} catch (Throwable th) {
err = th.getMessage();
logger.info("Failed to create item:" + item, th);

if (err.contains("same email") || err.contains("already exists")) {
// if this is a VetoException with "Lead #1234 with same email already exists!" because duplicate emails found
// and thrown by CodebeamerComTrackerItemListener, then add the subject as comment to the issue
Pattern issueIdPattern = Pattern.compile("\#(\d*)");
matcher = issueIdPattern.matcher(err);
if (matcher.find()) {
issueId = Integer.valueOf(matcher.group(1));

logger.warn("Adding comment to issue #" + issueId +", subject:<" + subject +">");
ArtifactDto comment = new ArtifactDto();
comment.setOwner(user);
comment.setDescriptionFormat(DescriptionFormat.WIKI);
comment.setDescription(subject +"

" + message);
Date date = new Date();
comment.setCreatedAt(date);
comment.setLastModifiedAt(date);
comment.setTypeId(Integer.valueOf(com.intland.codebeamer.remoting.ArtifactType.ISSUE_ATTACHMENT));
List<ArtifactPlusContent> arts = Arrays.asList(new ArtifactPlusContent(comment, null));
trackerItemManager.addAttachments(user, issueId, arts, null, new ActionData(null));
}
}
}
}
War dies hilfreich?