Чтение вложений электронной почты с использованием JavaMail - чтение «winmail.dat», а не фактическое вложение - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь создать клиент, который использует API javax.mail для чтения сообщений электронной почты, включая вложения. Моей первоначальной мыслью было использовать библиотеку Tika. Когда это дало неожиданный результат (см. Код и подробности ниже), я попытался использовать вариант кода, представленный в этом вопросе .

Моя функция для чтения электронных писем:

    // Reference: https://www.tutorialspoint.com/javamail_api/javamail_api_checking_emails.htm
public class CheckingMails {

    public static void check(String host, String storeType, String user, String password) {
        try {

            // create properties field
            Properties properties = new Properties();

            properties.put("mail.pop3.host", host);
            properties.put("mail.pop3.port", "110");
            Session emailSession = Session.getInstance(properties);
            Store store = emailSession.getStore("pop3");
            store.connect(host, user, password);
            Folder emailFolder = store.getFolder("INBOX");
            emailFolder.open(Folder.READ_WRITE);

            // retrieve the messages from the folder in an array and print it
            Message[] messages = emailFolder.getMessages();

            System.out.println("messages.length---" + messages.length);

            for (int i = 0, n = messages.length; i < n; i++) {
                Message message = messages[i];

                Object content = message.getContent();
                if (content instanceof java.lang.String) {
                    System.out.println((String) content);
                } else if (content instanceof Multipart) {
                    Multipart mp = (Multipart) content;

                    for (int j = 0; j < mp.getCount(); j++) {
                        Part part = mp.getBodyPart(j);

                        String disposition = part.getDisposition();

                        if (disposition == null) {
                            // Check if plain
                            MimeBodyPart mbp = (MimeBodyPart) part;
                            if (mbp.isMimeType("text/plain")) {
                                System.out.println("Mime type is plain");
                                System.out.println((String) mbp.getContent());
                            } else {

                                // Special non-attachment cases here of
                                // image/gif, text/html, ...

                                System.out.println("File name is " + part.getFileName());

                            }
                        } else if ((disposition != null)
                                && (disposition.equals(Part.ATTACHMENT) || disposition.equals(Part.INLINE))) {
                            // Check if plain
                            MimeBodyPart mbp = (MimeBodyPart) part;
                            if (mbp.isMimeType("text/plain")) {
                                System.out.println("Mime type is plain");
                                System.out.println((String) mbp.getContent());
                            } else {
                                System.out.println("Save file " + part.getFileName());

                            }
                        }
                    }
                }

                System.out.println("Tika results " + parseMsg(message));

            }

            // close the store and folder objects
            emailFolder.close(false);
            store.close();

        } catch (MessagingException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Когда я тестирую программу, отправляя тестовое сообщение с простым CSV-файлом в качестве вложения, анализатор Tika выдает следующее (сокращенно для краткости):

    ------=_NextPart_000_0028_01D47C16.81FB45C0
    Content-Type: application/ms-tnef;
        name="winmail.dat"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment;
        filename="winmail.dat"

    eJ8+IhUSAQaQCAAEAAAAAAABAAEAAQeQBgAIAAAA5AQAAAAAAADoAAEIgAcAGAAAAElQTS5NaWNy
    b3NvZnQgTWFpbC5Ob3RlADEIAQOQBgCgDQAANgAAAAsAAgABAAAAAwAmAAAAAAALACkAAAAAAB4A
    cAABAAAABQAAAFRlc3QAAAAAAgFxAAEAAAAWAAAAAdR8SMswwghurPF+SpeO8uRrTzrhCgAACwAB
    DgAAAAACAQoOAQAAABg..... 

------=_NextPart_000_0028_01D47C16.81FB45C0--

Другая часть кода (которая проверяет расположение сообщения) выводит нечто похожее на следующее:

 messages.length---1
Mime type is plain



Email Boday



Save file winmail.dat

Почему приложение читает / распознает winmail.dat, а не вложение, которое было отправлено вместе с сообщением (файл CSV)?

Спасибо за любую помощь.

...