#java #jakarta-mail #mime-message
#java #джакарта-почта #mime-сообщение
Вопрос:
Я добавляю пользовательский заголовок при отправке электронной почты на Java. Если кто-нибудь ответит на это письмо, мне нужно сохранить содержимое этого письма в базе данных. Я мог бы получить несколько ответов на это письмо. Поэтому для идентификации я добавляю пользовательский заголовок с уникальным значением.
При чтении непрочитанного письма из папки «Входящие» из хранилища imaps я не могу прочитать пользовательский заголовок. Кроме пользовательского заголовка, я могу читать другой заголовок.
Я читаю электронную почту, используя класс ниже
public class OutLookReader_imaps {
Folder inbox;
public OutLookReader_imaps() throws IOException {
System.out.println("Inside MailReader()...");
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
Properties props = System.getProperties();
props.setProperty("mail.imaps.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.imaps.socketFactory.fallback", "false");
props.setProperty("mail.imaps.port", "993");
props.setProperty("mail.imaps.socketFactory.port", "993");
props.put("mail.imaps.host", "outlook.office365.com");
try {
/* Create the session and get the store for read the mail. */
Session session = Session.getDefaultInstance(System.getProperties(), null);
Store store = session.getStore("imaps");
store.connect("outlook.office365.com", 993, "example@entransys.com", "password");
inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
Flags seen = new Flags(Flags.Flag.SEEN);
FlagTerm unseenFlagTerm = new FlagTerm(seen, false);
Message messages[] = inbox.search(unseenFlagTerm);
if (messages.length == 0) System.out.println("No messages found.");
System.out.println("No. of Unread Messages : " inbox.getUnreadMessageCount());
System.out.println("No. of Messages : " inbox.getMessageCount());
System.out.println("No. of Deleted Messages : " inbox.getMode());
for (int i = 0; i < messages.length; i ) {
if (i > 10) {
System.exit(0);
inbox.close(true);
store.close();
}
System.out.println("Message " (i 1));
System.out.println("From : " messages[i].getFrom()[0]);
System.out.println("Subject : " messages[i].getSubject());
System.out.println("Sent Date : " messages[i].getSentDate());
System.out.println("Header : " messages[i].getAllHeaders());
System.out.println("Content : " messages[i].getContent().toString());
System.out.println("Content Type : " messages[i].getContentType());
System.out.println("Description : " messages[i].getDescription());messages[i].getContent());
System.out.println("Unique Header : " messages[i].getHeader("X-Universally-Unique-Identifier"));
System.out.println("Header uni : " messages[i].getHeader("X-Uniform-Type-Identifier"));
Enumeration allHeaders = messages[i].getAllHeaders();
while (allHeaders.hasMoreElements()) {
Header header = (Header) allHeaders.nextElement();
String headerName = header.getName();
String headerVal = header.getValue();
System.out.println("Header Name : " headerName);
System.out.println("Header Value : " headerVal);
}
}
try {
inbox.close(true);
store.close();
} catch (Exception ex) {
System.out.println("Exception arise at the time of read mail");
ex.printStackTrace();
}
} catch (MessagingException e) {
System.out.println("Exception while connecting to server: " e.getLocalizedMessage());
e.printStackTrace();
System.exit(2);
}
}
public void printAllMessages(Message[] msgs) throws Exception {
for (int i = 0; i < msgs.length; i ) {
System.out.println("MESSAGE #" (i 1) ":");
printEnvelope(msgs[i]);
}
}
public void printEnvelope(Message message) throws Exception {
Address[] a;
if ((a = message.getFrom()) != null) {
for (int j = 0; j < a.length; j ) {
System.out.println("Email From : " a[j].toString());
}
}
String subject = message.getSubject();
Date receivedDate = message.getReceivedDate();
Date sentDate = message.getSentDate();
SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
System.out.println("Email Subject : " subject);
if (receivedDate != null) {
System.out.println("Received Date: " df.format(receivedDate));
}
System.out.println("Sent Date : " df.format(sentDate));
}
public static void main(String args[]) throws IOException {
new OutLookReader_imaps();
}
}
Комментарии:
1. покажите нам, что вы сделали до сих пор.
2. Обновленный класс Java, который я использую для чтения электронной почты
3. Используйте
getAllHeaders()
метод, чтобы вернуть перечисление для заголовков. Затем повторите его. Все методы и классы описаны в javadocs.4. @Stephen, я надеюсь, что я делаю это в коде
Enumeration allHeaders = messages[i].getAllHeaders();
, и я повторяюallHeaders
5. Вот как я устанавливаю заголовок при отправке электронной почты
message.setHeader("X-Universally-Unique-Identifier", uuid.toString());
Ответ №1:
Пользовательские заголовки, которые вы добавляете к отправляемым сообщениям, не будут добавлены к сообщениям, которые отвечают на отправленное вами сообщение. Обычно будет заголовок In-Reply-To или заголовок References, который включает идентификатор сообщения отправленного вами сообщения, но даже их присутствие не гарантируется. Вероятно, самый надежный способ связать ответы с отправленными сообщениями — это включить уникальный идентификатор в тему отправленного вами сообщения.
Комментарии:
1. Я могу добавить UUID в тему, но при ответе они могут изменить тему.
2. Да, идеального решения не существует. Если вы управляете своим собственным почтовым сервером, вы можете создать адрес From, специфичный для каждого отправляемого вами сообщения, чтобы ответы на этот адрес можно было связать с исходным сообщением.
3. Я решил проблему с помощью заголовка In-Reply-To и References . Я отмечаю ваш ответ как правильный ответ. Спасибо за вашу помощь. Ваш ответ мне очень помог. Я вам очень благодарен.