发送邮件原创
金蝶云社区-野生的指针
野生的指针
33人赞赏了该文章 5,295次浏览 未经作者许可,禁止转载编辑于2022年10月25日 18:04:58
summary-icon摘要由AI智能服务提供

本文介绍了在一个特定系统中实现邮件发送及附件添加功能的详细步骤。包括配置邮件服务、在单据列表插件中监听按钮事件并调用邮件发送接口,以及如何设置邮件标题、正文、接收人、附件等。还提及了如果未使用系统默认邮件服务而需自定义时,需重写相关类和消息渠道注册类的注意事项。最后,还提到了平台版本和欢迎用户反馈。

一、需求背景

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)

图标赞 33
33人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!