java- недоставленные письма: получите идентификатор электронной почты, чьи письма не доставлены

Я делаю подсчет для писем, которые считаны: Чтение-получение, Не-чтение, Автоответ, Вне офиса, Отвечено Доставлено и недоставлено писем со следующим кодом. Но я хочу идентификаторы электронной почты, на которые письма не доставлены.

Чтобы получить электронную почту для недоставленных писем, я могу сделать это, проанализировав содержимое этого письма, но это будет очень долгая задача. Пожалуйста, помогите мне с лучшим решением

        JSONObject jo = new JSONObject();
        JSONArray dataCollection = new JSONArray();
        JSONObject data = null;
        try {

            Session session = Session.getDefaultInstance(props, null);
            Store store = session.getStore("imaps");

            store.connect(props.getProperty("mail.smtp.host"), userid, password);

            Folder inbox = store.getFolder("inbox");
            inbox.open(Folder.READ_WRITE);
            int countDelivered = 0;
            int countUndelivered = 0;
            int countRead = 0;
            int countAutoReply = 0;
            int countUnRead = 0;
            int countReplied = 0;

            jo.put("TotalMessage", inbox.getMessageCount());

            Message[] messages = inbox.getMessages(0,50);

            for (Message message : messages) {

                boolean undelMsgs = message.getFrom()[0].toString().contains("Mail Delivery")
                        || message.getFrom()[0].toString().contains("Postmaster")
                        || message.getFrom()[0].toString().contains("Failed") 
                        || message.getFrom()[0].toString().contains("Failure")
                        || message.getSubject().contains("(Failure)")
                        || message.getSubject().contains("Undeliverable:");

                boolean readMsgs = message.getSubject().contains("Read:") 
                        && !message.getSubject().contains("Not read:")
                        && !message.getSubject().contains("Un-Read:") 
                        && !message.getSubject().contains("UnRead:") ;

                boolean unreadMsgs = message.getSubject().contains("Un-Read:") 
                        || message.getSubject().contains("UnRead:") 
                        || message.getSubject().contains("Not read:");

                boolean autoReply = message.getSubject().contains("Automatic") 
                        || message.getSubject().contains("Reply:") 
                        || message.getSubject().contains("[Auto-Reply]")
                        || message.getSubject().contains("Out of Office");

                boolean replied = message.getSubject().contains("RE:");
                data = new JSONObject();

                if (undelMsgs)
                    countUndelivered++;
                else
                    countDelivered++;

                if (readMsgs)
                    countRead++;
                if (unreadMsgs)
                    countUnRead++;

                if (autoReply)
                    countAutoReply++;

                if (replied)
                    countReplied++;
                data = new JSONObject();
                data.put("subject=", message.getAllHeaders());
                data.put("from=", message.getFrom()[0]);

                dataCollection.put(data);
            }

            inbox.close(true);
            System.out.println("Done....");
            store.close();
            data = new JSONObject();
            data.put("Delivered=", countDelivered);
            data.put("Undelivered=", countUndelivered);
            data.put("Read=", countRead);
            data.put("AutoReply=", countAutoReply);
            data.put("Replied=", countReplied);
            data.put("UnRead=", countUnRead);

            dataCollection.put(data);

            jo.put("tableData", dataCollection);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return jo; 

Вы можете найти этот код очень хитрым и целенаправленным, но, чтобы получить это, у меня также не было никакого решения, доступного онлайн.

1 ответ

К сожалению, для этого нет золотого правила. Это зависит от того, какой отказавший SMTP-сервер отправит вас обратно.

Но есть надежда: MultipartReport

Если вы получили это в своем сообщении, а другой SMTP решил добавить (по крайней мере, заголовки) исходного сообщения, вы можете получить к нему следующий доступ:

  for (Message message : messages) {
     if(message instanceof MimeMessage) {
        MimeMessage mime = (MimeMessage)message;
        Object content = mime.getContent();
        if(content instanceof MultipartReport) {
           MultipartReport dsn = (MultipartReport)content;
           MimeMessage m = dsn.getReturnedMessage();
           if(m != null) {
              String originalMessageId = m.getMessageID();
               //TADAA!
           }
        }
     }
  }

Во всех остальных случаях вам приходится прибегать к другим идеям.

  • MultiPartReport.getReport() может быть DeliveryNotification, а заголовки могут содержать оригинальное поле-конверта-id с вашим идентификатором сообщения.

  • Может быть, есть заголовок "In-Reply-To"?

  • Может быть, есть заголовок "Ссылки"?

Оба могут содержать ваш оригинальный идентификатор сообщения. Но может даже не быть установлен, так что вы бы приступили к анализу самого текста отчета.

Другие вопросы по тегам