xinyb
2024-08-30 f5cc47742dd3d2f2ffd8443ffc82a912683f7824
src/com/yc/crm/mail/service/MailImpl.java
@@ -31,6 +31,7 @@
import java.io.InputStream;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
 * @BelongsProject: eCoWorksV3
@@ -56,14 +57,16 @@
            if (StringUtils.isBlank(m.getDocCode())) {
                sql += "declare @docCode varchar(50) \n";
                sql += "exec sp_newdoccode 482101," + GridUtils.prossSqlParm(m.getUserCode()) + ",@docCode output \n";
                sql += "insert into t482101H(companyId,companyName,formId,docCode,docdate,PeriodID,postCode,postname,mailType,sender,receiver,cc,bcc,subject,userCode,userName,content,file_unid) values ";
                sql += "insert into t482101H(companyId,companyName,formId,docCode,docdate,PeriodID,postCode,postname,mailType,sender,receiver," +
                        "cc,bcc,subject,userCode,userName,content,file_unid,messageId,read_flag,delete_flag) values ";
                sql += "(" + GridUtils.prossSqlParm(m.getCompanyId()) + "," + GridUtils.prossSqlParm(m.getCompanyName()) + ",482101," +
                        "@docCode,convert(varchar(10),getdate(),120),convert(varchar(7),getdate(),120),"
                        + GridUtils.prossSqlParm(m.getUserCode()) + "," + GridUtils.prossSqlParm(m.getUserName()) + "," +
                        +m.getMailType() + "," + GridUtils.prossSqlParm(m.getSender()) + "," +
                        GridUtils.prossSqlParm(m.getReceiver()) + "," + GridUtils.prossSqlParm(m.getCc()) + "," + GridUtils.prossSqlParm(m.getBcc()) + "," +
                        GridUtils.prossSqlParm(m.getSubject()) + "," + GridUtils.prossSqlParm(m.getUserCode()) + "," + GridUtils.prossSqlParm(m.getUserName()) + "," +
                        GridUtils.prossSqlParm(m.getContent()) + "," + GridUtils.prossSqlParm(m.getFileUNID()) + ") \n";
                        GridUtils.prossSqlParm(m.getContent()) + "," + GridUtils.prossSqlParm(m.getFileUNID()) + "," + GridUtils.prossSqlParm(m.getMessageId()) + "," +
                        m.getReadFlag() + "," + m.getDeleteFlag() + ") \n";
                sql += "select @docCode as docCode";
                String docCode = jdbcTemplate.queryForObject(sql, String.class);
                if (StringUtils.isNotBlank(docCode)) {
@@ -85,14 +88,16 @@
            sql += "declare @docCode varchar(50) \n";
            for (t482101HEntity m : mail) {//遍历内容
                sql += "exec sp_newdoccode 482101," + GridUtils.prossSqlParm(m.getUserCode()) + ",@docCode output \n";
                sql += "insert into t482101H(companyId,companyName,formId,docCode,docdate,PeriodID,postCode,postname,mailType,sender,receiver,cc,bcc,subject,userCode,userName,content,file_unid) values ";
                sql += "insert into t482101H(companyId,companyName,formId,docCode,docdate,PeriodID,postCode,postname,mailType,sender,receiver," +
                        "cc,bcc,subject,userCode,userName,content,file_unid,messageId,read_flag,delete_flag) values ";
                sql += "(" + GridUtils.prossSqlParm(m.getCompanyId()) + "," + GridUtils.prossSqlParm(m.getCompanyName()) + ",482101," +
                        "@docCode,convert(varchar(10),getdate(),120),convert(varchar(7),getdate(),120),"
                        + GridUtils.prossSqlParm(m.getUserCode()) + "," + GridUtils.prossSqlParm(m.getUserName()) + "," +
                        +m.getMailType() + "," + GridUtils.prossSqlParm(m.getSender()) + "," +
                        GridUtils.prossSqlParm(m.getReceiver()) + "," + GridUtils.prossSqlParm(m.getCc()) + "," + GridUtils.prossSqlParm(m.getBcc()) + "," +
                        GridUtils.prossSqlParm(m.getSubject()) + "," + GridUtils.prossSqlParm(m.getUserCode()) + "," + GridUtils.prossSqlParm(m.getUserName()) + "," +
                        GridUtils.prossSqlParm(m.getContent()) + "," + GridUtils.prossSqlParm(m.getFileUNID()) + ") \n";
                        GridUtils.prossSqlParm(m.getContent()) + "," + GridUtils.prossSqlParm(m.getFileUNID()) + "," + GridUtils.prossSqlParm(m.getMessageId()) + "," +
                        m.getReadFlag() + "," + m.getDeleteFlag() + ") \n";
//                sql +="exec postt482101V3 '' ,'',''";
            }
            jdbcTemplate.update(sql);
@@ -118,10 +123,22 @@
    }
    @Override
    public Integer deleteReceivingMail(String docCode) {
    public Integer deleteReceivingMail(String userCode, String docCode) {
        String sql = "set nocount on\n";
        try {
            sql += "update t482101H deleteFlag=1 where docCode=" + GridUtils.prossSqlParm(docCode) + "\n";//标记为已删除
            sql += "update t482101H deleteFlag=1 where userCode=" + GridUtils.prossSqlParm(userCode) + " and docCode=" + GridUtils.prossSqlParm(docCode) + "\n";//标记删除
            sql += "select select @@ROWCOUNT";
            return jdbcTemplate.update(sql, Integer.class);
        } catch (Exception e) {
            throw e;
        }
    }
    @Override
    public Integer deleteReceivingMail(String messageId) {
        String sql = "set nocount on\n";
        try {
            sql += "delete t482101H where messageId=" + GridUtils.prossSqlParm(messageId) + "\n";//删除
            sql += "select select @@ROWCOUNT";
            return jdbcTemplate.update(sql, Integer.class);
        } catch (Exception e) {
@@ -193,7 +210,7 @@
            //获得收件箱的邮件列表
            Message[] messages = folder.search(flagTerm);
            //返回邮箱封装内容
            return setMailContent(messages, request);
            return setMailContent(messages, user, request);
        } catch (NoSuchProviderException e) {
            throw e;
        } catch (MessagingException e) {
@@ -222,8 +239,13 @@
            //根据当前用户查询绑定的邮箱信息
            T482102Entity emailEntity = emailAccountIfc.getAccountInfo(t482101H.getUserCode(), t482101H.getSender());//返回邮箱的账号信息
            if (emailEntity == null || StringUtils.isBlank(emailEntity.getEmail())) {
                throw new Exception("找不到邮箱:" + t482101H.getSender() + "配置信息,请完善:" + t482101H.getSender() + "邮箱配置在尝试发送邮件");
                if (StringUtils.isBlank(t482101H.getDocCode())) {
                    t482101H.setMailType(0);//草稿箱状态
                    t482101H = saveReceivingMail(t482101H);//保存到草稿箱内
                }
                throw new Exception("找不到邮箱:" + t482101H.getSender() + "配置信息请完善。邮件已保存到草稿箱#" + t482101H.getDocCode());
            }
            //有发送的邮件保存到后台数据库
            //邮箱服务器配置
            Properties properties = new Properties();
            properties.setProperty("mail.smtp.host", emailEntity.getSmtpHost());
@@ -245,6 +267,11 @@
            message.setFrom(new InternetAddress(sendEmail));
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipientEmail));
            message.setSubject(t482101H.getSubject());
            String Unique_ID = UUID.randomUUID().toString();//unId码
            String message_id = "<onBus_" + Unique_ID + "_" + t482101H.getDocCode() + ">";//系统单号唯一码
            message.setHeader("Message-ID", message_id);//系统内部唯一码
            t482101H.setMessageId(message_id);//messageId赋值
            if (StringUtils.isNotBlank(t482101H.getCc())) {//抄送
                String[] cc = t482101H.getCc().split(";");
@@ -280,8 +307,14 @@
            }
            message.setContent(multipart);
            try {
                if(StringUtils.isBlank(t482101H.getDocCode())){//不在草稿箱有单号
                    saveReceivingMail(t482101H);//保存后发送
                }else{
                    t482101H.setMailType(2);//发件箱状态
                    updateMailDrafts(t482101H);//更新成草稿箱
                }
                Transport.send(message);//发送
            } catch (MessagingException m) {//异常处理
            } catch (MessagingException m) {//发送异常处理
                t482101H.setMailType(0);//草稿箱状态
                updateMailDrafts(t482101H);//更新成草稿箱
                throw new Exception("发送邮件异常,邮件已保存在草稿箱。异常原因:" + m.getCause() != null ? m.getCause().getMessage() : m.getMessage());
@@ -327,29 +360,40 @@
     * @throws MessagingException
     * @throws IOException
     */
    public List<t482101HEntity> setMailContent(Message[] messages, HttpServletRequest request) throws Exception {
    public List<t482101HEntity> setMailContent(Message[] messages, String receiver, HttpServletRequest request) throws Exception {
        try {
            List<t482101HEntity> t482101HEntityList = new ArrayList<>();
            HttpSession session = request.getSession();
            List<String> messageIdList = getMessageIdList(receiver);
            Message m = null;
            for (int i = 0; i < messages.length; i++) {
                m = messages[i];
                String from = MimeUtility.decodeText(m.getFrom()[0].toString());
                InternetAddress internetAddress = new InternetAddress(from);
                String messageId = m.getHeader("Message-ID")[0];
                if (messageIdList != null && messageIdList.contains(messageId)) {
                    if (m.isSet(Flags.Flag.DELETED)) {//邮件是否需要删除
                        //删除系统里的邮件
                        deleteReceivingMail(messageId);
                    }
                    //已经存在就不需要再次封装处理
                    continue;
                }
                t482101HEntity mail = new t482101HEntity();
                if (m.isSet(Flags.Flag.SEEN)) {
//                    System.out.println("邮件已标记为已读。");
                mail.setMessageId(messageId);//获取邮件唯一ID
                mail.setMailType(1);//收件
                if (m.isSet(Flags.Flag.SEEN)) {//邮件已标记为已读
                    mail.setReadFlag(1);//已读
                } else {
//                    m.setFlag(Flags.Flag.SEEN, true);//标记成已读
                    mail.setReadFlag(0);//已读
                }
                if (m.isExpunged()) {//检查一个消息是否已被删除。‌
                    mail.setDeleteFlag(1);//已删除
                } else {
                    mail.setDeleteFlag(0);//已删除
                }
                mail.setMailType(1);//收件
                if (m.isSet(Flags.Flag.ANSWERED)) {//邮件是否已回复
                }
                if (m.isSet(Flags.Flag.DRAFT)) {//是否是草稿箱
                    mail.setMailType(0);//是草稿箱
                }
                mail.setClassType(1);
                mail.setUserCode((String) session.getAttribute(SessionKey.USERCODE));
                mail.setUserName((String) session.getAttribute(SessionKey.USERNAME));
@@ -365,7 +409,7 @@
                    List<String> fileSeq = new ArrayList<>();
                    MimeMultipart mimeMultipart = (MimeMultipart) m.getContent();
                    String uuId = UUID.randomUUID().toString().toUpperCase();//生成uuid
                    result = getTextFromMimeMultipart(mimeMultipart, uuId, fileSeq,request);
                    result = getTextFromMimeMultipart(mimeMultipart, uuId, fileSeq, request);
                    if (fileSeq.size() > 0) {//有附件内容保存
                        mail.setFileUNID(uuId + ";" + StringUtils.join(fileSeq, ";"));
                    }
@@ -373,12 +417,13 @@
                    result = m.getContent().toString();
                }
                mail.setContent(result);//保存内容
                String from = MimeUtility.decodeText(m.getFrom()[0].toString());
                InternetAddress internetAddress = new InternetAddress(from);
                mail.setSender(internetAddress.getAddress());//发件人
                from = MimeUtility.decodeText(m.getRecipients(Message.RecipientType.TO)[0].toString());
                internetAddress = new InternetAddress(from);
                mail.setReceiver(internetAddress.getAddress());//收件人
                mail.setReceiver(receiver);//统一成一个收件人
                String cc = "";//抄送人
                Address[] ccAddress = m.getRecipients(Message.RecipientType.CC);
                if (ccAddress != null && ccAddress.length > 0) {
@@ -389,9 +434,8 @@
                    }
                    cc = cc.substring(0, cc.lastIndexOf(";"));
                }
                mail.setCc(cc);//抄送人
                String bcc = "";//抄送人
                mail.setCc(cc);
                String bcc = "";//密送
                Address[] bccAddress = m.getRecipients(Message.RecipientType.BCC);
                if (bccAddress != null && bccAddress.length > 0) {
                    for (Address c : bccAddress) {
@@ -411,7 +455,7 @@
    }
    // 辅助方法,用于递归获取纯文本邮件内容
    private String getTextFromMimeMultipart(MimeMultipart mimeMultipart, String uuId, List<String> fileSeq,HttpServletRequest request) throws Exception {
    private String getTextFromMimeMultipart(MimeMultipart mimeMultipart, String uuId, List<String> fileSeq, HttpServletRequest request) throws Exception {
        int count = mimeMultipart.getCount();
        if (count == 0) {
            throw new MessagingException("Multipart with no body parts");
@@ -432,11 +476,11 @@
                if (bodyPart.isMimeType("text/plain")) {
                    result.append(bodyPart.getContent());
                } else if (bodyPart.isMimeType("image/*")) {//图片
                    result.append(saveFileAndImage(bodyPart, "image", uuId,request));
                    result.append(saveFileAndImage(bodyPart, "image", uuId, request));
                } else if (Part.ATTACHMENT.equalsIgnoreCase(bodyPart.getDisposition())) {//附件
                    fileSeq.add(saveFileAndImage(bodyPart, Part.ATTACHMENT, uuId,request));
                    fileSeq.add(saveFileAndImage(bodyPart, Part.ATTACHMENT, uuId, request));
                } else if (bodyPart.isMimeType("multipart/*")) {
                    result.append(getTextFromMimeMultipart((MimeMultipart) bodyPart.getContent(), uuId, fileSeq,request));
                    result.append(getTextFromMimeMultipart((MimeMultipart) bodyPart.getContent(), uuId, fileSeq, request));
                }
            }
        }
@@ -459,7 +503,7 @@
        return textPlainFound && textHtmlFound;
    }
    private String saveFileAndImage(BodyPart bodyPart, String type, String unId,HttpServletRequest request) throws Exception {
    private String saveFileAndImage(BodyPart bodyPart, String type, String unId, HttpServletRequest request) throws Exception {
        try {
            String fileName = MimeUtility.decodeText(bodyPart.getFileName());
            if (type.equals("image")) {
@@ -484,7 +528,7 @@
                //输出 url
//                return imgData.getImageUrl(attachmentWhereEntity.getUnid() + ";" + attachmentWhereEntity.getSeq(), null,
//                        null, true, true, null);
                DataSourceEntity dataSourceEntity= MultiDataSource.getDataSourceMap(request);
                DataSourceEntity dataSourceEntity = MultiDataSource.getDataSourceMap(request);
                return shoppingImageServer + "/uploads/attachment/" + dataSourceEntity.getDbId() + "/482101/" + attachmentWhereEntity.getUnid() + "@p@" + attachmentWhereEntity.getSeq() + ".jpg";
            } else if (type.equals(Part.ATTACHMENT)) {
                return attachmentWhereEntity.getSeq() + "";
@@ -512,7 +556,7 @@
                + " PhysicalPath,PhysicalFile,OriginalFileName,FileSize,FileType, \n"
                + " AuthorCode,AuthorName,SmallPicPath,UploadTime,OriginalPicture \n"
                + " from _sys_Attachment \n"
                + " where unid = @unid " ;
                + " where unid = @unid ";
        if (seqs.size() > 0) {
            sql += " and seq in(" + StringUtils.join(seqs, ",") + ")\n";
        }
@@ -527,4 +571,21 @@
        }
        return attachmentList;
    }
    @Override
    public List<String> getMessageIdList(String receiver) {
        List<String> messageId = null;
        String sql = " set nocount on \n";
        try {
            sql += "select messageId from t482101H where receiver='" + receiver + "'";
            List<t482101HEntity> message = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(t482101HEntity.class));
            if (message != null && message.size() > 0) {
                messageId = new ArrayList<>();
                messageId = message.stream().map(t482101HEntity::getMessageId).distinct().collect(Collectors.toList());//去重
            }
            return messageId;
        } catch (Exception e) {
            throw e;
        }
    }
}