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"?
- Может быть, есть заголовок "Ссылки"?
Оба могут содержать ваш оригинальный идентификатор сообщения. Но может даже не быть установлен, так что вы бы приступили к анализу самого текста отчета.