众所周知,MCM(市场活动管理是 AEM 的一部分)允许配置和管理电子邮件。一个重要的问题和潜在的解决方案已经在this线程中讨论过。
除了(相当技术性的)相关问题之外,我们还有一个与功能相关的问题。
我们想要实现的功能涵盖:
我找不到任何支持此功能的参考/示例。 Adobe 的电子邮件通道(Marketing Cloud 的一部分)似乎支持部分此功能(在this 文章中有记录),众所周知,MailChimp 等第 3 方解决方案是一个有效的替代方案,但我们的客户更倾向于拥有大部分功能AEM 中的功能。
非常感谢有关电子邮件内容定制(必须具备的要求)的指示。如果您认为我们的要求过于具体而无法由(通用)WCM 处理,请立即通知我们。
提前非常感谢,
维姆
您是否看到了 AEM (CQ) - Adobe Campaign 集成?我认为该解决方案应该适合您的需求。 http://wwwimages.adobe.com/content/dam/Adobe/en/solutions/campaign/pdfs/adobe-campaign-aem-solution-overview-ue.pdf
package com.safeway.app.wcax.campaign.workflow;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import javax.jcr.RepositoryException;
import javax.jcr.Session;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.util.ByteArrayDataSource;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.HtmlEmail;
import org.apache.sling.api.resource.ResourceResolver;
import org.osgi.framework.Constants;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.adobe.granite.workflow.WorkflowException;
import com.adobe.granite.workflow.WorkflowSession;
import com.adobe.granite.workflow.exec.WorkItem;
import com.adobe.granite.workflow.exec.WorkflowProcess;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import com.day.cq.mailer.MessageGateway;
import com.day.cq.mailer.MessageGatewayService;
import com.day.cq.search.PredicateGroup;
import com.day.cq.search.Query;
import com.day.cq.search.QueryBuilder;
import com.day.cq.search.result.Hit;
import com.day.cq.search.result.SearchResult;
import com.safeway.app.wcax.campaign.util.WorkflowUtil;
@Component(service = WorkflowProcess.class, property = {
Constants.SERVICE_DESCRIPTION + "=Write Adaptive Form Attachments to File System",
Constants.SERVICE_VENDOR + "=Test Company", "process.label" + "=Generate Report And Send Email Process" })
public class GenerateReportAndSendEmail implements WorkflowProcess {
private static final Logger log = LoggerFactory.getLogger(GenerateReportAndSendEmail.class);
@Reference
QueryBuilder queryBuilder;
@Reference
private MessageGatewayService messageGatewayService;
@Override
public void execute(WorkItem workItem, WorkflowSession workflowSession, MetaDataMap processArguments)
throws WorkflowException {
ResourceResolver resourceResolver = workflowSession.adaptTo(ResourceResolver.class);
Map<String, String> argsMap = Optional.ofNullable(WorkflowUtil.getProcessArgsMap(processArguments))
.orElse(new HashMap<>());
if (argsMap != null) {
for (Map.Entry<String, String> entry : argsMap.entrySet()) {
log.info("sendEmail(): Argument key is [{}] and value is [{}]", entry.getKey(), entry.getValue());
}
}
String emailSubject = MapUtils.getString(argsMap, "Subject", "default subject");
String emailBody = MapUtils.getString(argsMap, "Email_body", "default body");
String payloadPath = workItem.getWorkflowData().getPayload().toString();
// functionality start
Map<String, String> predicates = new HashMap<>();
predicates.put("type", "cq:Page");
predicates.put("path", payloadPath);
predicates.put("p.limit", "-1");
QueryBuilder queryBuilder = resourceResolver.adaptTo(QueryBuilder.class);
Query query = queryBuilder.createQuery(PredicateGroup.create(predicates),
resourceResolver.adaptTo(Session.class));
SearchResult results = query.getResult();
final StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("Page Path,Category Tags,Vanity Paths,Redirect Path");
for (Hit hit : results.getHits()) {
try {
hit.getProperties();
String[] cqTags = hit.getProperties().get("cq:tags", String[].class);
String[] vanityPaths = hit.getProperties().get("sling:vanityPath", String[].class);
String redirectPath = hit.getProperties().get("cq:redirectTarget", StringUtils.EMPTY);
final StringBuilder cqTagBuilder = new StringBuilder();
if (null != cqTags) {
for (String tag : cqTags) {
cqTagBuilder.append(tag).append(";");
}
}
final StringBuilder vanityPathBuilder = new StringBuilder();
if (null != vanityPaths) {
for (String vanityPath : vanityPaths) {
vanityPathBuilder.append(vanityPath).append(";");
}
}
stringBuilder.append("\r\n");
stringBuilder.append(hit.getPath()).append(",");
stringBuilder.append(cqTagBuilder).append(",");
stringBuilder.append(vanityPathBuilder).append(",");
stringBuilder.append(redirectPath);
} catch (RepositoryException e) {
e.printStackTrace();
}
}
String csvContent = stringBuilder.toString();
sendEmail(emailSubject, emailBody, argsMap, csvContent);
}
private Boolean sendEmail(String emailSubject, String emailMsg, Map<String, String> argsMap, String csvContent) {
Boolean status = false;
try {
String emailFrom = MapUtils.getString(argsMap, "Email_from", "default");
String emailRecipents = MapUtils.getString(argsMap, "Recipient_Email", "[email protected]");
final HtmlEmail email = new HtmlEmail();
final ArrayList<InternetAddress> emailRecipients = getEmailAddress(emailRecipents);
email.setCharset("UTF-8");
email.setFrom(emailFrom);
email.setTo(emailRecipients);
email.setSubject(emailSubject);
email.setHtmlMsg(emailMsg);
if (StringUtils.isNotBlank(csvContent)) {
email.attach(new ByteArrayDataSource(csvContent, "text/csv"), "pagereports.csv", "Execution details");
}
MessageGateway<HtmlEmail> messageGateway = this.messageGatewayService.getGateway(HtmlEmail.class);
messageGateway.send(email);
status = true;
} catch (AddressException | IOException | EmailException e) {
log.error("Exception during sending email", e);
}
return status;
}
private ArrayList<InternetAddress> getEmailAddress(String toAddress) throws AddressException {
final ArrayList<InternetAddress> emailRecipients = new ArrayList<>();
if (StringUtils.isNotEmpty(toAddress) && toAddress.contains(";")) {
final String[] emailIds = toAddress.split(";");
for (final String emailId : emailIds) {
emailRecipients.add(new InternetAddress(emailId));
}
} else if (StringUtils.isNotEmpty(toAddress)) {
emailRecipients.add(new InternetAddress(toAddress));
}
return emailRecipients;
}
}
package com.safeway.app.wcax.campaign.util;
import com.adobe.granite.workflow.metadata.MetaDataMap;
import org.apache.commons.lang3.StringUtils;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* A utility class that is used to manage the Workflow Process Arguments
*/
public class WorkflowUtil {
public static final String PROCESS_ARGS = "PROCESS_ARGS";
private WorkflowUtil() {
}
/**
* Reads the workflow-step arguments and returns them as a
* <code>Map<String, String></code>
*
* @param metaDataMap The Meta Data map received by the workflow process and
* that contains the arguments
* @return the worklow-step arguments as a <code>Map<String, String></code>
*/
public static Map<String, String> getProcessArgsMap(MetaDataMap metaDataMap) {
final String processArgs;
// Avoid any NPE
if (metaDataMap == null || metaDataMap.isEmpty())
return null;
if (metaDataMap.containsKey(PROCESS_ARGS)) {
processArgs = metaDataMap.get(PROCESS_ARGS, "String").toString();
return toMap(StringUtils.split(processArgs, System.getProperty("line.separator")), "=");
}
return null;
}
public static Map<String, String> toMap(final String[] values, final String separator) {
final Map<String, String> map = new LinkedHashMap<>();
if (values == null || values.length < 1) {
return map;
}
for (final String value : values) {
final String[] tmp = StringUtils.split(value, separator, -1);
if (tmp.length == 2 && StringUtils.stripToNull(tmp[0]) != null) {
map.put(StringUtils.trim(tmp[0]), StringUtils.trimToEmpty(tmp[1]));
}
}
return map;
}
}
enter code here