发送邮件原创
金蝶云社区-野生的指针
野生的指针
30人赞赏了该文章 4,612次浏览 未经作者许可,禁止转载编辑于2022年10月25日 18:04:58

一、需求背景

1,需要在某个操作后发送邮件,比如在列表上点击按钮给指定某个人发送邮件。并且还要发送指定文件附件。


二、实现方案

1,需要在消息渠道配置邮件服务,然后在单据列表通过插件监听按钮,然后调用EmailHandler.sendEmail方法去发送邮件。


三、具体实现

1,找到系统管理->消息平台->消息渠道,一般默认有一个叫email的电子邮件,可以直接使用

image.png

2,点击修改,进行相关参数的配置

image.png

其中实现类,默认是kd.bos.workflow.engine.msg.handler.EmailServiceHandler,也可以根据需要自己重写,然后注册进来

邮箱配置,这里以QQ邮箱为例,在账户的设置中去开启服务,会得到授权码,就是上图中的密码,QQ邮箱邮件服务器地址是一样的,用户名和发送人账号,填写你的邮箱账号,发送人名称可以随意填写。


3,在消息模板中去增加消息模板(也可以不加,在代码中去给消息设置title,正文等等)

image.png

4,在单据列表插件中,需要创建消息,然后调用邮件发送接口

if (key.equals("kdec_baritemap2")) {
    EmailInfo emailInfo = new EmailInfo();
    emailInfo.setTitle("title");
    emailInfo.setContent("正文");
    List<String> receiver = new ArrayList<>();
    receiver.add("xxxxxx@qq.com");
    emailInfo.setReceiver(receiver);
    MessageAttachment attachment = new MessageAttachment();
    List<byte[]> datas = this.getBytesByFile("F:\\log\\demo.txt");
    attachment.setAttachments(datas);
    List<String> attachmentNames = new ArrayList<>();
    attachmentNames.add("xxxx.txt");
    emailInfo.setAttachments(datas);
    emailInfo.setAttachmentNames(attachmentNames);
    EmailHandler.sendEmail(emailInfo)
}

其中,邮件中添加附件是需要setAttachments,可以查看它的类型是List<byte[]>。

public static List<byte[]> getBytesByFile(String pathStr) {
    File file = new File(pathStr);
    try {
        FileInputStream fis = new FileInputStream(file);
        ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
        byte[] b = new byte[1000];
        int n;
        while ((n = fis.read(b)) != -1) {
            bos.write(b, 0, n);
        }
        fis.close();
        byte[] data = bos.toByteArray();
        List<byte[]> datas = new ArrayList<>();
        datas.add(data);
        bos.close();;
        return datas;
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

5,效果演示

image.png

四、踩坑

如果消息渠道,没用系统默认的email那个电子邮件,而是自己新建的一个,则需要重写kd.bos.message.service.handler.EmailHandler,以及消息渠道的注册类kd.bos.workflow.engine.msg.handler.EmailServiceHandler(因为这里默认的是调用的上面这个EmailHandler,因为这里的sendemail是直接get的标识为email的,可以重写,修改下。可以自己断点走一下。

public static Map<String, Object> sendEmail(EmailInfo emailInfo) {
    logger.info("sendEmail... title" + emailInfo.getTitle());
    MsgChannelInfo msgChannelInfo = MsgServiceCache.getMsgChannel("email");
    if (msgChannelInfo == null) {
        return MessageUtils.wrapResult(ResManager.loadKDString("未配置消息服务,无法发送邮件..."));
    } else {
        //todo ...
    }
}

五、平台版本

BOS_V3.0.009.0


大家如有任何建议和意见,欢迎在评论区留言,我将努力改进。创作不易,如能帮到大家,请动动您的金手指点赞鼓励一下,非常感谢~【emoji】【emoji】【emoji】

email.zip(1.20KB)

赞 30