Доступ к данным календаря Lotus Notes C # - PullRequest
0 голосов
/ 30 января 2012

Я пытаюсь получить доступ к базе данных Lotus Domino.Можно ли это сделать с помощью C #?Есть ли примеры, на которые я мог бы взглянуть?

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Существует множество примеров, просто попробуйте найти их.Этот пример может помочь вам начать:

//This DLL you've got to add under Project-> Add Reference --> COM Tab --> Lotus Domino Objects
//Standard Path for this DLL is: "C:\Program Files\Notes\domobj.tlb"
using Domino;   //domobj.tlb*
...

try
{
    //-------------------------------------------
    //!!Important!!
    //Before you start, you have to check 2 things
    //1.) Lotus Notes has to run when you start this application
    //2.)The files "notes.ini" and "user.id" 
    // has to be in the main Lotus Notes folder
    //--------------------------------------------    

    //First, create a new Lotus Notes Session Object
    Domino.NotesSession LNSession = new Domino.NotesSession();
    //Next add a Database and a Document Object (not new)
    Domino.NotesDatabase LNDatabase;
    Domino.NotesDocument LNDocument;
    //Initialize your Session with your Password
    LNSession.Initialize("password");

    //Connect to your Notes Server and the path of your 
    //.nsf File (in my case its in a subfolder 'mail').
    LNDatabase = LNSession.GetDatabase("Notes-Server", "mail\\user.nsf", false);
    //Create an in memory document in the server database
    LNDocument = LNDatabase.CreateDocument();
    //-------Assign Field Values-------
    //Define Start&End Date+Time of your appointment
    //Year, Month, Day, Hour, Minute and Second
    System.DateTime StartDate = new DateTime(2008, 3, 19, 8, 2, 0);
    System.DateTime EndDate = new DateTime(2008, 3, 19, 8, 5, 0);
    //This Defines that it is an Calendar Entry
    LNDocument.ReplaceItemValue("Form", "Appointment");
    //Type of the appointment, means:
    LNDocument.ReplaceItemValue("AppointmentType", "0");
    //0 = Date, Appointment           
    //1 = Anniversary
    //2 = All Day Event (Do Not Set Time Here!)
    //3 = Meeting
    //4 = Reminder
    //5 = Date (Special, experimental!)    
    // Title of your entry
    LNDocument.ReplaceItemValue("Subject", "hello world");

    // Set Confidential Level (Public=1 or Private=0) 
    LNDocument.ReplaceItemValue("$PublicAccess","1");    

    //Add Start&End Time of your event
    LNDocument.ReplaceItemValue("CALENDARDATETIME", StartDate);
    LNDocument.ReplaceItemValue("StartDateTime", StartDate);
    LNDocument.ReplaceItemValue("EndDateTime", EndDate);
    LNDocument.ReplaceItemValue("StartDate", StartDate);
    LNDocument.ReplaceItemValue("MeetingType", "1");
    //Infos in The Body
    LNDocument.ReplaceItemValue("Body", "Body Text Body Text ...");
    //Add an alarm to your appointment
    LNDocument.ReplaceItemValue("$Alarm", 1);
    LNDocument.ReplaceItemValue("$AlarmDescription", "hello world (alarm)");
    LNDocument.ReplaceItemValue("$AlarmMemoOptions", "" );
    //5 = Time (in minutes) before alarm goes on
    LNDocument.ReplaceItemValue("$AlarmOffset", 5);
    LNDocument.ReplaceItemValue("$AlarmSound", "tada");
    LNDocument.ReplaceItemValue("$AlarmUnit", "M");
    //This saves your Document in the Notes Calendar
    LNDocument.ComputeWithForm(true, false);
    LNDocument.Save(true, false, false);
    //On success, you'll see an info message;
    MessageBox.Show("Calendar Entry Successfully Added!", "Info", 
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception e1)
{
    //On error you'll see an error message
    MessageBox.Show(e1.Message);
}
...
0 голосов
/ 15 апреля 2014

Прежде всего, мои соболезнования по поводу выбора почтового сервера, навязанного вам вашей компанией.

Проблема в том, что действительно нет хороших примеров.Существует только небольшое сообщество пользователей, которые все еще используют эту мертвую технологию.

Вот то, что я нашел:

Как облажался, как это звучит ... Откройте файл nsf в шестнадцатеричном редакторе - есть несколько «хороших» примеров, написанных на VB (или Lotus Script) втам.o_O

Но, насколько я могу судить (по крайней мере, для себя), информация календаря не хранится в локальных файлах NSF.Проблемы, с которыми мы сталкиваемся:

  1. Что такое имя сервера / имя базы данных?Я могу найти около 10 различных IP-адресов сервера домино, если я их осмотрю - могу ли я использовать только один из них?Помогает ли знание SMTP-адреса?
  2. Какую строку передать в GetView?Я видел, как "Контакты", "Люди", "$ (Люди)", помещающие туда что-то глупое, возвращают ноль, есть ли где-нибудь список ??
  3. Откуда пришел пользователь?В остальной части юниверса для аутентификации используются имя пользователя и пароль.Почему API Notes не хочет знать имя пользователя ??

Чтобы ответить 1 : я думаю, что пустая строка каким-то образом получает нужный сервер из реестра Бог знает где.

Еще одна возможность - попробовать это. На Lotus Notes есть стрелка вниз, которая расширяется, чтобы вы могли переходить к Mail, Calendar, (и куче других дерьмов, которые вынаверно никогда не пользовался).Щелкните правой кнопкой мыши Календарь здесь, затем перейдите в Приложение> Свойства.Это перечислит сервер и имя файла.Удалите висящий / мусор / хрень с имени сервера.Это даст имя сервера для функции ниже.Также удалите префикс \ mail \ directory из имени файла, который даст базу данных для функции ниже.

Чтобы ответить 2 : я не нашел лучшего ответа, чем использование Hex-редактора или поиск в Интернете фрагментов кода.Я подозреваю, что эта строка установлена ​​не IBM, а во время установки.Так что, если бы мы могли найти значение по умолчанию, * может работать.Я снова хотел бы получить лучший ответ сам.Для меня работает $ All для электронной почты (извините В лотосных заметках нет «писем», Lotus отправляет «Memos») и Calendar для календаря.

Для ответа 3 :Lotus Notes API, похоже, использует последнего вошедшего в систему пользователя для аутентификации следующего вошедшего в систему пользователя.Пойми, наверное, поэтому Lotus и так более безопасен.

Следующая функция требует ссылки на Domino dll.Возможно, вам придется сослаться на него, и если вы используете 64-битную систему, он все равно не будет работать.Скомпилируйте это в 32-битном режиме.Не забывайте, что Lotus Notes - это приложение уровня предприятия, и световые годы за пределы возможностей Outlook.Это вернет серию пар ключ / значение.Да, вы правильно прочитали.Это все пары ключ-значение.Куча 64-битного закодированного мусора, цветовых кодов, направляющих, на первый взгляд случайных массивов «1» и другой бесполезной хрени, к счастью, вам нужны данные в виде открытого текста.

using System;
using System.Linq;
using System.Data;
using System.Collections;
using System.Runtime.InteropServices;
using Microsoft.Win32;
using Domino;
using System.Text;
using System.IO;
using System.Collections.Generic;

namespace NotesScraper
{
    public class NotesCommunication
    {
        public  KeyValuePair<string, NotesViewResultSet[]>[] PullNotesView(string[] ViewNames, string server, string database, string password )
        {
            if (ViewNames == null || ViewNames.Length == 0 || ViewNames.ToList().Distinct().Count() != ViewNames.Length )
            {
                throw new ArgumentException();
            }
            else
            {
                List<KeyValuePair<string, NotesViewResultSet[]>> results = new List<KeyValuePair<string, NotesViewResultSet[]>>();
                NotesSession notesSession = new Domino.NotesSession();
                notesSession.Initialize(password);
                NotesDatabase notesDatabase = notesSession.GetDatabase(server, database, false);
                for(int i=0; i<ViewNames.Length; i++)
                {
                    List<NotesViewResultSet> result = new List<NotesViewResultSet>();
                    Domino.NotesView notesView;
                    string view = ViewNames[i];
                    notesView = notesDatabase.GetView(view);
                    NotesViewEntryCollection notesViewCollection = notesView.AllEntries;
                    for (int rowCount = 1; rowCount <= notesViewCollection.Count; rowCount++)
                    {
                        NotesViewEntry viewEntry = notesViewCollection.GetNthEntry(rowCount);
                        NotesDocument document = viewEntry.Document;
                        Array notesThings = document.Items as Array;
                        for (int j = 0; j < notesThings.Length; j++)
                        {
                            NotesItem notesItem = (notesThings.GetValue(j) as Domino.NotesItem);
                            result.Add(new NotesViewResultSet() 
                            { 
                                RecordID = rowCount,
                                Name = notesItem.Name,
                                Value = notesItem.Text
                            });
                        }
                    }
                    results.Add(new KeyValuePair<string,NotesViewResultSet[]>(view, result.ToArray()));
                }
                return results.ToArray();
            }
        }
    }
    public class NotesViewResultSet
    {
        public int RecordID {get;set;}
        public string Name { get; set; }
        public string Value { get; set; }
    }
}
...