javamail 收邮件时正文+图片时为什么图片没有显示,这个是怎么解析img里src下的cid

写收邮件时只是显示了html里的img里的src下的cid:xxxxxx;这个是怎么通过这个cid找到图片路径的

但是这个图片的path路径怎么根据这个cid得到呢?

我记得以前好像是拼接html代码 邮件就展现了

我之前找java mail的教程:
Java Mail 入门
在页面里搜 Including Images with Your Messages
就能找到引用图片的方法

楼主可以考虑使用Base64的方式去显示图片,这样不必考虑图片路径,而且浏览器的兼容性很好。注意base64前需要拼上一串说明帮助img标签解析。

可以用base64方法试试

通过解析替换得到,给你段代码,自行研究,还没来得及整理


 public   String repDomain(String source, String element, String attr,List<String> contentId) throws UnsupportedEncodingException {
        String img = "";
        String reg = "<" + element + "[^<>]*?\\s" + attr + "=['\"]?(.*?)['\"]?(\\s.*?)?>";  
        Matcher m = Pattern.compile(reg).matcher(source);  
        while (m.find()) {
          img = m.group(1);
          int r=img.lastIndexOf("/")+1;
          String subImg= URLDecoder.decode(img.substring(r, img.length()), "UTF-8"); 
//        subImg= subImg.substring(0, subImg.lastIndexOf("."));
          contentId.add(subImg);
          subImg="cid:"+subImg;
          source = source.replace(img, subImg);
        }
        return source;
      }
    @Value("#{settings['document.path']}")
    private String documentPath;
    @Override
    public void sendMimeMessage(final List<String> toAddressList, final String fromAddress, final String subject,
                                final String content, final List<String> fileList, final String contentType, final List<String> cc_receiver)
                                                                                                            throws Exception {
          List<String> contentId=new ArrayList<String>();
        final String html=repDomain(content,"img","src",contentId);
        final List<String> cid=contentId;
        try {
            // 扩展信息介质接口,实现接口中的方法
            MimeMessagePreparator mimeMail = new MimeMessagePreparator() {

                public void prepare(MimeMessage mimeMessage) throws MessagingException, UnsupportedEncodingException {
                    // 设置收信人地址
                    if (CollectionUtils.isNotEmpty(toAddressList)) {
                        String listString=toAddressList.toString();
                        listString=listString.substring(0,listString.length()-1);
                        listString=listString.substring(1);
                        InternetAddress[] iaToList = new InternetAddress().parse(listString);
                        mimeMessage.setRecipients(Message.RecipientType.TO, iaToList);
                    } else {
                        return;
                    }
                    if( cc_receiver.size()>0){
                        String listString=cc_receiver.toString();
                        listString=listString.substring(0,listString.length()-1);
                        listString=listString.substring(1);
                        InternetAddress[] iaToList = new InternetAddress().parse(listString);
                        InternetAddress[] iaCcList = new InternetAddress().parse(listString);
                        mimeMessage.setRecipients(Message.RecipientType.CC, iaCcList);
                    }
                    // 设置发件人地址
                    if (StringUtils.isNotBlank(fromAddress)) {
                        mimeMessage.setFrom(new InternetAddress(fromAddress));
                    } else {
                        return;
                    }
                    // 设置邮件主题
                    if (StringUtils.isNotBlank(subject)) {
                        mimeMessage.setSubject(subject);
                    }
                    // 多部件的,可以看做一个邮件容器,包含正文、附件等
                    Multipart multipart = new MimeMultipart();
                    // 添加正文
                    MimeBodyPart contentMimeBodyPart = new MimeBodyPart();
                    if (StringUtils.isNotBlank(content)) {
                        if (StringUtils.isNotBlank(contentType)) {
                            // contentMimeBodyPart.setContent(content, "text/html;charset=utf-8");
                            contentMimeBodyPart.setContent(html, contentType);
                        } else {
                            contentMimeBodyPart.setText(html);
                        }
                    }
                    multipart.addBodyPart(contentMimeBodyPart);

                    for (String string : cid) {
                        contentMimeBodyPart = new MimeBodyPart();
                     DataSource fds = new FileDataSource
                             (documentPath+"/upload/ckDir/images/images.war/"+string);
                    log.info("img path:"+documentPath+"/upload/ckDir/images/images.war/"+string);
                    contentMimeBodyPart.setDataHandler(new DataHandler(fds));

                    contentMimeBodyPart.setHeader("Content-ID","<"+string+">");
                     multipart.addBodyPart(contentMimeBodyPart);
                    }
                    // 添加附件,可以添加多个附件
                    if (CollectionUtils.isNotEmpty(fileList)) {
                        for (String file : fileList) {
                            MimeBodyPart fileMimeBodyPart = new MimeBodyPart();
                            // 文件数据源
                            FileDataSource fds = new FileDataSource(file);
                            // 数据处理器
                            fileMimeBodyPart.setDataHandler(new DataHandler(fds));
                            // 设置文件名
                            fileMimeBodyPart.setFileName(MimeUtility.encodeText(fds.getName()));
                            multipart.addBodyPart(fileMimeBodyPart);
                        }
                    }
                    // 将Multipart添加MimeMessage
                    mimeMessage.setContent(multipart);
                    mimeMessage.setSentDate(new Date());
                }
            };
            // 发送邮件
            mailSender.send(mimeMail);
            log.info("dynamic image mail has bean sent !");  
        } catch (Exception e) {
            log.error("toAddress:" + toAddressList.toString() + ",fromAddress:" + fromAddress + ",send mail fail:", e);
            throw new Exception("send mail fail");
        }
    }

如果图片存在服务器的硬盘上的话 可以直接饮用,路径是相对路径

楼主可以引用图片资源 直接放到邮件里面太麻烦了