C #, Lotus Interop: получение информации о сообщениях - PullRequest
0 голосов
/ 20 ноября 2008

Я использую Interop.Domino.dll для извлечения сообщений электронной почты из «базы данных» Lotus (термин используется свободно). У меня возникают трудности с поиском определенных полей, и я удивляюсь, как это сделать правильно. Я использую NotesDocument.GetFirstItem для получения Subject, From и Body.

Мои проблемы в этом отношении таковы:

  1. Как мне получить адрес для ответа? Есть ли список «Предметов», куда можно попасть? Я не могу его найти.
  2. Как получить понятные имена для адресов отправителя и ответа?
  3. Когда я получаю Body таким образом, оно форматируется странным образом с наборами квадратных скобок ([]), случайно расположенными по всему телу сообщения, и части текста не соответствуют моим ожиданиям.

Код, связанный с кодом:

string 
  ActualSubject = nDoc.GetFirstItem("Subject").Text,
  ActualFrom = nDoc.GetFirstItem("From").Text,
  ActualBody = nDoc.GetFirstItem("Body").Text;

Ответы [ 3 ]

2 голосов
/ 20 ноября 2008

Ха, понял!

Object[] ni = (Object[])nDoc.Items;
string names_values = "";
for (int x = 0; x < ni.Length; x++)
{
NotesItem item = (NotesItem)ni[x];
if (!string.IsNullOrEmpty(item.Name)) names_values += x.ToString() + ": " + item.Name + "\t\t" + item.Text + "\r\n";
}

Возвращено список индексов, имен и значений:

0: Received     from example.com ([192.168.0.1])          by host.example.com (Lotus Domino Release 6.5.4 HF182)          with ESMTP id 2008111917343129-205078 ;          Wed, 19 Nov 2008 17:34:31 -0500
1: Received     from example.com ([192.168.0.2])          by host2.example.com (Lotus Domino Release 6.5.4 HF182)          with ESMTP id 2008111917343129-205078 ;          Wed, 19 Nov 2008 17:34:31 -0500
2: X_PGRTRKID       130057945714t
3: X_PGRSRC     IE
4: ReplyTo      "example" <name@email.example.com>
5: Principal        "example" <customerservice@email.example.com>
6: From         "IE130057945714t"<service@test.email.example.com>
7: SendTo       me@example.com
8: Subject      (Message subject redacted)
9: PostedDate       11/19/2008 03:34:15 PM
10: MIME_Version        1.0
11: $Mailer     SMTP DirectMail
12: $MIMETrack      Itemize by SMTP Server on xxxPT02-CORP/example(Release 6.5.4 HF182|May 31, 2005) at 11/19/2008 05:34:31 PM;Serialize by Router on xxxPT02-CORP/example(Release 6.5.4 HF182|May 31, 2005) at 11/19/2008 05:34:32 PM;Serialize complete at 11/19/2008 05:34:32 PM;MIME-CD by Router on xxxPT02-CORP/example(Release 6.5.4 HF182|May 31, 2005) at 11/19/2008 05:34:32 PM;MIME-CD complete at 11/19/2008 05:34:32 PM;Itemize by Router on camp-db-05/example(Release 7.0.2 HF76|November 03, 2006) at 11/19/2008 05:34:32 PM;MIME-CD by Notes Client on MyName/Guest/example(Release 6.5.6|March 06, 2007) at 11/20/2008 12:46:25 PM;MIME-CD complete at 11/20/2008 12:46:25 PM
13: Form        Memo
14: $UpdatedBy      ;CN=xxxPT02-CORP/O=example
15: $ExportHeadersConverted     1
16: $MessageID      <redacted@LocalDomain>
17: RouteServers        CN=xxxPT02-CORP/O=example;CN=camp-db-05/O=example
18: RouteTimes      11/19/2008 03:34:31 PM-11/19/2008 03:34:32 PM;11/19/2008 03:34:32 PM-11/19/2008 03:34:32 PM
19: $Orig       958F2E4E4B666AB585257506007C02A7
20: Categories      
21: $Revisions      
22: DeliveredDate       11/19/2008 03:34:32 PM
23: Body        []exampleexample

Теперь, кто может сказать мне, почему Тело продолжает портиться?

1 голос
/ 20 ноября 2008

Элемент Body является NotesRichTextItem, а не обычным NotesItem. Это другой тип объектов в мире Lotus Notes (и часто источник большого разочарования разработчиков!)

У меня нет большого опыта использования COM для подключения к Domino, и я знаю, что есть различия в том, к чему у вас есть доступ, но Справка Domino Designer должна дать вам много информации о классах, таких как NotesRichTextItem.

Возможно, метод "GetFormattedText" будет работать для вас лучше, чем доступ к свойству Text элемента.

Вот пример метода (взят из справки Domino Designer)

Dim doc As NotesDocument
Dim rtitem As Variant
Dim plainText As String
Dim fileNum As Integer
'...set value of doc...
Set rtitem = doc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
  plainText = rtitem.GetFormattedText( False, 0 )
End If
' get a file number for the file
fileNum = Freefile
' open the file for writing
Open "c:\plane.txt" For Output As fileNum
' write the formatted text to the file
Print #fileNum, plainText
' close the file
Close #fileNum
0 голосов
/ 21 ноября 2008

Это может не работать в зависимости от того, как настроена ваша среда, но самый простой способ работать с почтой в домино - оставить их как MIME и получить значения через NotesMIMEEntity и NotesMIMEHeader. Это будет работать только в том случае, если почта пришла из Интернета, а не из собственных Notes, и среда была настроена для хранения почты в формате MIME.

В противном случае вам нужно получить доступ к телу в качестве NotesRichTextItem. Из этого элемента вам нужно получить NotesRichTextNavigator, который позволит вам перемещаться по структуре расширенного текста, если вам нужно.

Если вы считаете, что структура должна быть относительно простой, попробуйте вызвать NotesRichTextItem.GetFormattedText (). Если это все еще не работает, вам нужно будет разобраться в том, что происходит, поиграв с примером и посмотрев, как выглядит структура NotesRichTextNavigator.

...