Как сопоставить отвеченные электронные письма с отправленными приглашениями? (Java Mail)


Итак, я отправляю приглашения ICal с помощью Java Mail, я даю каждому из них идентификатор сообщения. Теперь, если кто-то отвечает, принимая/отклоняя, я получаю ответное электронное письмо, но с другим идентификатором сообщения.
Кажется, Outlook генерирует новые идентификаторы сообщений и отбрасывает все заголовки, которые я установил в приглашении. Есть ли способ сопоставить отправленное приглашение с их ответами или наоборот?

Вот что он показывает, когда я просматриваю свой интернет-заголовок приглашения:

Return-Path: 
X-Original-To: 
Delivered-To:
Received: from
by 
for   ; Tue, 15 Oct 2013 09:52:39 +0200 (CEST)
From:
To:
Message-ID: 11111111111111111111111111
Subject: TestMail 
MIME-Version: 1.0
Content-Type: multipart/alternative; 
boundary="----=_Part_0_694990101.1381823559402"
UID:  114442
ContentID: blabla

А вот как выглядит заголовок ответа:

Return-Path: 
X-Original-To: 
Delivered-To: 
Received: from 
for   ; Tue, 15 Oct 2013 09:52:44 +0200 (CEST)
From: 
To: 
Subject: Accepted: TestMail 11.10
Date: Tue, 15 Oct 2013 09:52:44 +0200
Message-ID: <000301cec97b$8866c540$99344fc0$@[email protected]>
MIME-Version: 1.0
Content-Type: text/calendar; method=REPLY;
charset="utf-8"
Content-Transfer-Encoding: 7bit
X-Mailer: Microsoft Office Outlook 12.0
Thread-Index: Ac7Je4UCPB4Lb2ZERnCPQEx3IbfpbQAAAEBQAAAAkSA=
Content-Language: de


Заранее спасибо за любую помощь!


person user2870415    schedule 11.10.2013    source источник


Ответы (4)


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

person Bill Shannon    schedule 11.10.2013

Ну, свойство iCalendar UID было определено именно для этой цели. См. http://tools.ietf.org/html/rfc5545#section-3.8. 4.7

Каждый ответ должен содержать свойство UID (внутри компонента VEVENT), соответствующее значению из вашего исходного запроса. Вы не должны полагаться на механизм транспорта (здесь iMIP, но это может быть iSchedule), чтобы выполнить сопоставление.

person Arnaud Quillaud    schedule 14.10.2013
comment
Да, я также устанавливаю этот UID, но проблема в том, что когда кто-то отвечает на приглашение, а я получаю письмо с отказом/принятием, заголовок не содержит ни UID, ни чего-либо другого, что я установил в заголовке. Похоже, Outlook выбрасывает мою информацию. - person user2870415; 15.10.2013
comment
UID — это не заголовок, а свойство iCalendar. Так что это должно быть в приложении текста/календаря, которое возвращается с ответом. - person Arnaud Quillaud; 16.10.2013

У меня была аналогичная проблема, когда я использовал Amazon SES в качестве своего SMTP-сервера. Он заменил мой идентификатор сообщения Javamail и заменил его своим собственным. Коротким и простым решением было бы отправить случайно сгенерированный UID в ссылочном заголовке (ссылочный заголовок обычно не перезаписывается большинством поставщиков услуг электронной почты): -

Что-то вроде этого: email.setHeader("References", reference);, где ссылочный заголовок выглядит так: reference = UUID.randomUUID().toString()+"@email.abcd.com"

Подробнее о заголовке ссылки см. здесь: http://cr.yp.to/immhf/thread.html

person user96546    schedule 14.10.2013
comment
Я сделал это, но когда я получаю ответ на свое приглашение, вся информация, которую я установил в шапке, исчезает. - person user2870415; 15.10.2013
comment
не могли бы вы показать мне код, в котором вы установили ссылочный заголовок электронного письма, и в формате вы поместили ссылочный заголовок? формат должен соответствовать указанному cr.yp.to/immhf/thread.html , приложенному в угловых скобках - person user96546; 15.10.2013

Я понял! Мне нужно было прочитать тело ответа, а не заголовок. Все, что я установил, было сохранено в теле. Чтобы получить содержимое тела, вам нужно получить inputStream, например:

Folder folder = store.getFolder("Inbox");
folder.open(Folder.READ_WRITE);
Message message[] = folder.getMessages();
InputStream in = messages.getInputStream();

Затем вам просто нужно написать типичный IO Reader, чтобы получить строки, разделить их и взять значения, которые вы установили. Вот и все.

person user2870415    schedule 15.10.2013