Как да съпоставим отговорените имейли с изпратените покани? (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

Е, свойството UID на iCalendar беше дефинирано точно за тази цел. Вижте 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 Message-ID и го замени със свой собствен. Кратко и просто решение би било да изпратите произволно генериран 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