Napisałem dwie metody, jedną dla załączników i jedną dla treści wiadomości e-mail. Muszę wyodrębnić obrazy z treści wiadomości e-mail. Te dwie metody działają dobrze, ale gdy obrazy pojawiają się w treści wiadomości e-mail, należy je zapisać w bazie danych. Więc można go użyć później.

W przypadku załączników : - public static List getAttachments (MimeMultipart multipart, List existingAttachments) {

    if (multipart != null) {
        try {
            if (existingAttachments == null) {
                existingAttachments = new ArrayList<MimeBodyPart>();
            }
            for (int i = 0; i < multipart.getCount(); i++) {
                if (multipart.getBodyPart(i) instanceof MimeBodyPart) {
                    MimeBodyPart currentPart = (MimeBodyPart) multipart.getBodyPart(i);
                    if (Part.ATTACHMENT.equalsIgnoreCase(currentPart.getDisposition())) {
                        if (!existingAttachments.contains(currentPart)) {
                            existingAttachments.add(currentPart);
                            System.out.println(currentPart.getFileName());
                        }
                    } else if (currentPart.getContent() instanceof MimeMultipart) {
                        existingAttachments = getAttachments((MimeMultipart) currentPart.getContent(), existingAttachments);
                    }
                }
            }
        } catch (MessagingException ex) {
            LoggerFactory.getLogger(EmailUtil.class.getName()).error(ex.getMessage());
        } catch (IOException ex) {
            LoggerFactory.getLogger(EmailUtil.class.getName()).error(ex.getMessage());
        }
    }
    return existingAttachments;
}

w przypadku treści wiadomości e-mail Ta metoda polega na wyodrębnianiu treści wiadomości e-mail

public static String getContent(MimeMultipart multipart) {
    String emailContent = null;
    if (multipart != null) {
        try {
            for (int i = 0; i < multipart.getCount(); i++) {
                if (multipart.getBodyPart(i) instanceof MimeBodyPart) {
                    MimeBodyPart currentPart = (MimeBodyPart) multipart.getBodyPart(i);
                    if (Part.INLINE.equalsIgnoreCase(currentPart.getDisposition())) {
                        LoggerFactory.getLogger(EmailUtil.class.getName()).info("Content dispo is inline");
                        emailContent = (String) currentPart.getContent();
                    } else if (currentPart.getDisposition() == null && currentPart.getContentType().toLowerCase().contains("text")) {
                        LoggerFactory.getLogger(EmailUtil.class.getName()).info("Content dispo is null and type is text/*");
                        try {
                           emailContent = (String) currentPart.getContent();

                        } catch (ClassCastException ex) {
                            LoggerFactory.getLogger(EmailUtil.class.getName()).warn("Classcast exception caught and managed");
                            try {
                                InputStream is = currentPart.getInputStream();

                                emailContent = IOUtils.toString(is, currentPart.getEncoding());
                                Document doc=Jsoup.parse(emailContent);
                                Elements elements =doc.getElementsByTag("img");
                                System.out.println(elements);
                                int htmlCloseIndex = emailContent.indexOf("</html>");
                                emailContent = emailContent.substring(0, htmlCloseIndex);
                                emailContent+="</html>";
                            } catch (Exception e) {
                                LoggerFactory.getLogger(EmailUtil.class.getName()).error("Exception rebound caught and managed, email content will not read");
                                //emailContent = "Unable to read email content";
                                e.printStackTrace();
                            }
                        }
                    }else if (currentPart.getDisposition() == null && currentPart.getContentType().contains("TEXT")) {
                        LoggerFactory.getLogger(EmailUtil.class.getName()).info("Content dispo is null and type is TEXT/*");
                        try {
                            emailContent = (String) currentPart.getContent();
                        } catch (ClassCastException ex) {
                            LoggerFactory.getLogger(EmailUtil.class.getName()).warn("Classcast exception caught and managed");
                            try {
                                InputStream is = currentPart.getInputStream();
                                emailContent = IOUtils.toString(is, currentPart.getEncoding());

                                int htmlCloseIndex = emailContent.indexOf("</html>");
                                emailContent = emailContent.substring(0, htmlCloseIndex);
                                emailContent+="</html>";
                            } catch (Exception e) {
                                LoggerFactory.getLogger(EmailUtil.class.getName()).error("Exception rebound caught and managed, email content will not read");
                                //emailContent = "Unable to read email content";
                                e.printStackTrace();
                            }
                        }
                    } 
                    else if (currentPart.getContent() instanceof MimeMultipart) {
                        emailContent = getContent((MimeMultipart) currentPart.getContent());

                    }
                }
            }
        } catch (MessagingException ex) {
            LoggerFactory.getLogger(EmailUtil.class.getName()).error(ex.getMessage());
            LoggerFactory.getLogger(EmailUtil.class.getName()).warn("email content will not read");
           //emailContent = "Unable to read email content";
        } catch (IOException ex) {
            LoggerFactory.getLogger(EmailUtil.class.getName()).error(ex.getMessage());
            LoggerFactory.getLogger(EmailUtil.class.getName()).warn("email content will not read");
           // emailContent = "Unable to read email content";
        } catch (ClassCastException ex) {
            LoggerFactory.getLogger(EmailUtil.class.getName()).warn("Classcast exception caught and managed");
        // emailContent = "Unable to read email content";
        }
    }
    return emailContent;
}
1
Rajan jha 19 listopad 2019, 14:21
Twoje pytanie nie jest jasne. Czy możesz określić, w czym tak naprawdę potrzebujesz pomocy? Przychodzi mi do głowy wiele problemów, które mógłbyś mieć na myśli: jak uzyskać bajty obrazu, jak przechowywać dane obrazu w bazie danych. Na marginesie / nie jest to kluczowe dla twojego pytania: wychwytywanie wyjątku classcast jest moim zdaniem złą praktyką, gdy masz operator instanceof, którego możesz użyć do sprawdzenia, czy obiekt jest częścią klasy.
 – 
Joeblade
19 listopad 2019, 15:50
Tak, chcę uzyskać bajt obrazu i chcę go przechowywać w moim katalogu lokalnym.
 – 
Rajan jha
20 listopad 2019, 09:38

1 odpowiedź

Dobrze, jeden zaczyna się od tagów <img src="...">, już wziąłeś:

Elements elements = doc.getElementsByTag("img");

Tag img dla osadzonego obrazu wygląda następująco:

<img src="data:image/jpeg;base64,..." ...>

A więc posiadanie atrybutu src wystarczy:

String src = ...
if (src.startsWith("data:")) { // Embedded image data.
    int p = src.indexOf(';'); // Or better ";base64,"
    if (p == -1) {
        throw new IllegalArgumentException();
    }
    String mimeType = src.substring(5, p);
    String base64Data = src.substring(p + 1 + 6 + 1); // ";base64,"
    byte[] data = Base64.getDecoder().decode(base64Data);
    String file = "test." + mimeType.replaceFirst("^.*/(.*)$", "$1");
    Path path = Paths.get(file);
    Files.write(path, data);
}
0
Joop Eggen 19 listopad 2019, 15:20
Nie dostaję tego ... dla mnie wyodrębniam treść wiadomości e-mail i otrzymuję tag taki jak ten
 – 
Rajan jha
20 listopad 2019, 09:58
Ten protokół cid: pokazuje alternatywę posiadania obrazu jako załącznika, co jest prostsze. blog.mailtrap.io/… - po prostu zdobądź załącznik z tym cid.
 – 
Joop Eggen
20 listopad 2019, 12:26