【仅供内部供应商使用,不提供对外解答和培训】

一、特殊名词介绍

二、背景、场景介绍

EmailSendProvider主要用于对报表预览和定时调度发送邮件前,进行拦截。做转发、监控、以及流量和安全监控。

三、接口介绍

EmailSendProvider.java
package com.fr.decision.fun;

import com.fr.decision.basic.EmailAttr;
import com.fr.report.ResultWorkBookProvider;
import com.fr.stable.fun.mark.Mutable;
import org.jetbrains.annotations.Nullable;

/**
 * 邮件发送接口
 *
 * @author zack
 */
public interface EmailSendProvider extends Mutable {
    String MARK_STRING = "EmailSendProvider";
    int CURRENT_LEVEL = 1;

    /**
     * 邮件发送接口
     *
     * @param resultWorkBook 结果报表
     * @param emailAttr      邮件实体属性
     * @return 是否终止主体逻辑上没有跑完的邮件发送逻辑 返回true的话主体代码后续的邮件发送将不再执行
     * @throws Exception
     */
    boolean sendMail(@Nullable ResultWorkBookProvider resultWorkBook, EmailAttr emailAttr) throws Exception;


    /**
     * 当前实现是否生效
     *
     * @param resultWorkBook 结果报表
     * @return 是否生效
     */
    boolean accept(@Nullable ResultWorkBookProvider resultWorkBook);


    /**
     * 当前实现的正文展示格式要求
     *
     * @param format
     * @return
     */
    boolean contentFormatRequired(ContentFormat format);

    enum ContentFormat {
        /**
         * html格式
         */
        HTML,
        /**
         * 图片格式
         */
        IMAGE
    }

}


EmailAttr.java
package com.fr.decision.basic;

import com.fr.base.EmailAttachment;
import com.fr.stable.ArrayUtils;
import com.fr.stable.email.EmailAttachmentProvider;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

/**
 * 邮件实体属性
 */
public class EmailAttr {
    public static final String ATTR_BODY_IMAGE = "bodyImage";
    public static final String ATTR_RESULT_BOOK = "resultBook";
    private String to;//收件人
    private String cc;//抄送
    private String bcc;//密送
    private String from;//收件人
    private String subject;//主体
    private String content;//正文文本
    private boolean showTPL;//是否正文显示模板
    private EmailAttachmentProvider[] attachments;//附件
    private Map<String, Object> otherAttrMap;//其他属性


    private EmailAttr(String to, String cc, String bcc, String from, String subject, String content, boolean showTPL, EmailAttachmentProvider[] attachments) {
        this.to = to;
        this.cc = cc;
        this.bcc = bcc;
        this.from = from;
        this.subject = subject;
        this.content = content;
        this.attachments = attachments;
        this.showTPL = showTPL;
    }

    public static EmailAttr build(String to, String cc, String bcc, String from, String subject, String content, boolean showTPL, EmailAttachmentProvider[] attachments) {
        return new EmailAttr(to, cc, bcc, from, subject, content, showTPL, attachments);
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public String getCc() {
        return cc;
    }

    public void setCc(String cc) {
        this.cc = cc;
    }

    public String getBcc() {
        return bcc;
    }

    public void setBcc(String bcc) {
        this.bcc = bcc;
    }

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public EmailAttachment[] getAttachments() {
        return ArrayUtils.isEmpty(attachments) ? new EmailAttachment[0] : Arrays.asList(attachments).toArray(new EmailAttachment[]{});
    }

    public boolean isShowTPL() {
        return showTPL;
    }

    public void setShowTPL(boolean showTPL) {
        this.showTPL = showTPL;
    }

    public void setAttachments(EmailAttachment[] attachments) {
        this.attachments = attachments;
    }

    public void addOtherAttr(String key, Object value) {
        if (otherAttrMap == null) {
            otherAttrMap = new HashMap<String, Object>();
        }
        otherAttrMap.put(key, value);
    }

    public Object getOtherAttr(String key) {
        if (otherAttrMap == null || key == null) {
            return null;
        }
        return otherAttrMap.get(key);
    }
}


四、支持版本

产品线

版本

支持情况

备注

FR10.0支持
BI5.1支持
BI5.1.2支持
BI5.1.3支持

五、插件注册

plugin.xml
<extra-decision>
    <EmailSendProvider class="your class name"/>
</extra-decision>

六、原理说明

该接口通过 Set<EmailSendProvider> emailSendProviders = ExtraDecisionClassManager.getInstance().getArray(EmailSendProvider.MARK_STRING);的方式在需要调用的地方获取到插件中所有申明的邮件发送拦截接口实例。

产品中主要在EmailDealWithAction、EmailDealWithAction以及EmailPreviewHTML中发送邮件前生效。

七、特殊限制说明

该接口在不同的场景下使用有相应的区别需要注意:

对于预览模板发送邮件的场景拦截时,ResultWorkBookProvider 是当前报表的结果报表,可以用于对要发送的邮件内容或相应的检查做数据筛查和重组。

但是如果是在定时调度场景下发送邮件被拦截时,ResultWorkBookProvider的值是null。也就是如果只用该接口需要根据结果报表二次处理邮件正文之类的信息,则只支持对预览模板再发送邮件的场景可用!

八、常用链接

demo地址:demo-email-send-provider


九、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。


  • No labels