AEM 和定制电子邮件

问题描述 投票:0回答:2

众所周知,MCM(市场活动管理是 AEM 的一部分)允许配置和管理电子邮件。一个重要的问题和潜在的解决方案已经在this线程中讨论过。

除了(相当技术性的)相关问题之外,我们还有一个与功能相关的问题。

我们想要实现的功能涵盖:

  • i18n 电子邮件内容
  • 电子邮件相关报告(阅读电子邮件与退回电子邮件,以及按国家/地区、语言、细分...)
  • 电子邮件批次配置
  • 附件配置
  • 并且绝对必须有......电子邮件内容的定制(通过使用不同的字体和 HTML 标签)

我找不到任何支持此功能的参考/示例。 Adobe 的电子邮件通道(Marketing Cloud 的一部分)似乎支持部分此功能(在this 文章中有记录),众所周知,MailChimp 等第 3 方解决方案是一个有效的替代方案,但我们的客户更倾向于拥有大部分功能AEM 中的功能。

非常感谢有关电子邮件内容定制(必须具备的要求)的指示。如果您认为我们的要求过于具体而无法由(通用)WCM 处理,请立即通知我们。

提前非常感谢,

维姆

email aem
2个回答
0
投票

您是否看到了 AEM (CQ) - Adobe Campaign 集成?我认为该解决方案应该适合您的需求。 http://wwwimages.adobe.com/content/dam/Adobe/en/solutions/campaign/pdfs/adobe-campaign-aem-solution-overview-ue.pdf


0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.