Automatyczne rejestrowanie wiadomości e-mail w EZD RP (rozwiązanie)

Dzień dobry,

W porozumieniu z kolegami z Zespołu Wsparcia Technicznego grzecznościowo przedstawiam rozwiązanie automatycznej rejestracji wiadomości email w RPW w systemie EZD RP. Zasada działania jest prosta: wystarczy przenieść wiadomość do wskazanego folderu poczty aby korespondencja “sama” zarejestrowała się (wraz z metadanymi) w EZD RP. Zarejestrowana wiadomość jest przenoszona do kolejnego folderu aby utrzymać porządek w skrzynce. Opisane rozwiązanie dotyczy integracji usługi Outlook 365 z EZD RP ale z powodzeniem można je dostosować do innych usług np. w oparciu o protokół IMAP jak również dowolnie dostosowywać do swoich potrzeb.

Połączenia Outlooka 365 oraz EZD RP opiera się o wykorzystanie platformy n8n. Nie traktujcie tego jednak jako rekomendacji konkretnego środowiska automatyzacji procesów (równie dobrze można to zadanie zrealizować w NodeRed lub innym). Istotne jest to, że wykorzystano tu możliwości API EZD RP. Zastrzegam też, że nie udzielamy w poniższym zakresie wsparcia a ten post ma być inspiracją i zachętą do dzielenia się swoimi rozwiązaniami, które adresują Wasze potrzeby.

Platformę n8n instalujemy zgodnie z wytycznymi zawartymi na stronie https://n8n.io/ Rodzaj instalacji należy wybrać indywidualnie. Uwzględnić należy też kwestie licencyjne. Dodatkowo, aby przedstawiony na poniżej przepływ prawidłowo się wykonywał wymagane jest:

  • przepuszczenie ruchu sieciowego pomiędzy maszyną, na której mamy zainstalowane n8n, serwerem poczty oraz EZD RP.
  • włączenie uwierzytelniania OAuth2 dla użytkownika poczty, którego wykorzystamy przy uwierzytelnianiu. Szczegółowe informacje możemy znaleźć pod adresem: Microsoft credentials | Nodes | n8n Docs
  • wygenerowanie kluczy API w EZD RP i przydzielenie ich stanowisku, na które będą wpływać wiadomości z poczty.
  • dodanie na koncie, które ma być zintegrowane z EZD RP dedykowanego folderu, z którego wiadomości będą cyklicznie przenoszone do EZD RP. W opisanym poniżej przykładzie folder ma nazwę do EZD RP.

Przykładowy proces zapewniający przesyłanie wiadomości z programu Outlook do EZD RP pokazany jest na poniższym zrzucie ekranu, w dalszej kolejności omówione zostaną po kolei węzły wykorzystane w procesie.

Węzeł Schedule Trigger odpowiada za cykliczne wywołanie przebiegu, w jego parametrach ustawiamy co ile proces przeniesienia wiadomości do EZD RP ma być wywoływany.

Kolejne trzy węzły odpowiadają za uwierzytelnienie w EZD RP. W węźle typu Code wyliczamy dwa parametry używane przy autentykacji akh oraz rt. Przykładowy kod js, który to wykonuje jest przedstawiony poniżej:

// Zmienna'apiKey' przyjmuje wartość klucza api.

const apiKey = '92ba4f90-24cb-11f0-8d98-671850ddf2bf'; // Klucz api


// Wyliczanie daty i czasu bez milisekund

function formatDateTimeWithOffset(date) {

    const year = date.getFullYear();

    const month = String(date.getMonth() + 1).padStart(2, '0');

    const day = String(date.getDate()).padStart(2, '0');

    const hours = String(date.getHours()).padStart(2, '0');

    const minutes = String(date.getMinutes()).padStart(2, '0');

    const seconds = String(date.getSeconds()).padStart(2, '0');


    // Sprawdzenie strefy czasowej

    const offset = -date.getTimezoneOffset(); // Przesunięcie w minutach

    const offsetHours = Math.floor(Math.abs(offset) / 60);

    const offsetMinutes = Math.abs(offset % 60);

    const offsetSign = offset >= 0 ? '+' : '-'; // Sprawdzenie czy przesunięcie jest dodatnie czy ujemne

    const formattedOffset = `${offsetSign}${String(offsetHours).padStart(2, '0')}:${String(offsetMinutes).padStart(2, '0')}`;


    return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}${formattedOffset}`;

}


const now = new Date();

const rt = formatDateTimeWithOffset(now); // Czas w wymaganym formacie, bp. 2025-06-03T12:05:50+02:00


// Połączenie rt oraz klucza api

const stringToHash = rt + apiKey;


// Wyliczenie SHA-256 hash

const crypto = require('crypto');

const hash = crypto.createHash('sha256').update(stringToHash).digest();

 

// Kodowanie przy użyciu Base64

const akh = hash.toString('base64');

console.log('Request Time (rt):', rt);

console.log('API Key:', apiKey);

console.log('API Key Hash (akh):', akh);


// Dane wyjściowe zwracane przez węzeł:

return [

  {

    json: {

      rt: rt,

      akh: akh

    }

  }

];

 

Węzeł pobierz token pobiera token logowania. Przykładowa konfiguracja poniżej, pola użyte w węźle opisane są w artykule Wykorzystanie klucza API w komunikacji z EZD RP – Podręcznik użytkownika systemu EZD RP . Pola akh oraz rt pobieramy z wyniku działania węzła Code.

Ostatni z trzech węzłów pobiera listę stanowisk użytkownika, w przypadku, gdy chcemy użyć identyfikatora stanowiska, które mamy przypisane do klucza api możemy ten węzeł pominąć. Węzeł używa metody GET /ezdrp/integrator/v2/struktura/użytkownik w wyniku działania metody zwracana jest lista stanowisk użytkownika z przypisanym kluczem api. Przykładowa konfiguracja węzła poniżej, w węźle w nagłówku przekazujemy sposób autoryzacji Bearer token (token jest wartością zwróconą przez poprzedni węzeł) oraz Sid, czyli identyfikator stanowiska użytkownika z przypisanym kluczem API.

Węzeł pobierz wiadomości odpowiada za pobranie listy wszystkich wiadomości, które znajdują się w folderze do EZD RP. W węźle wykorzystana jest autoryzacja OAuth2. Dane autoryzacyjne podajemy w polu Credential to connect with. Kolejne parametry uzupełniamy zgodnie ze zrzutem ekranu, w parametrze Folder wybieramy folder, z którego wiadomości zostaną przeniesione do EZD RP. Domyślny limit wiadomości na liście to 100.

W wyniku działania węzła zostaje pobrana lista wiadomości, które znajdują się we wskazanym folderze.

Węzeł Loop Over Items odpowiada za wykonanie w pętli kolejnych węzłów, które pobierają wiadomości w postaci plików eml, przesyłanie ich do EZD RP wraz z rejestracją ich w RPW oraz przeniesienie wiadomości z folderu do EZD RP do innego folderu i nadaniu im kategorii w outlooku (nadawanie kategorii jest opcjonalne).

Węzeł pobierz wiadomość pobiera wiadomość o identyfikatorze zwracanym przez węzeł Loop over Items. Konfiguracja poniżej:

Węzeł data doręczenia wyodrębnia z daty otrzymania wiadomości zwracanej przez poprzedni węzeł datę doręczenia w postaci YYYY-MM-DD domyślnie jest ona zwracana z czasem doręczenia. Pole zwraca dwa pola: datę oraz godzinę doręczenia. Konfiguracja węzła poniżej, do rozdzielenia daty oraz czasu użyte zostało wyrażenie: {{$json.receivedDateTime.split(‘T’)}}

Węzeł pobierz jako eml pobiera wiadomość o id pobranym wcześniej przez węzeł pobierz wiadomość w postaci pliku eml. Używa on metody bramki Microsoft. Konfiguracja węzła poniżej:

Węzeł Convert to File konwertuje pobrany plik dodający w nazwie [Addin email] przed tytułem wiadomości i zapisując ją jako plik eml. Tytuł pobierany jest z odpowiedzi węzła pobierz wiadomość z pola subject.

Kolejne trzy węzły odpowiadają za przesłanie pliku eml wiadomości do EZD RP i zarejestrowanie go w RPW.

Węzeł dodaj obieg dodaje plik z pobraną wiadomością jako nowe zadanie w sekcji do obsłużenia. Węzeł używa metody POST /ezdrp/integrator/v2/obiegi. Konfiguracja węzła poniżej, w nagłówkach dodajemy pole Autorization oraz Sid. Pierwsze pole wypełniamy tak jak w przypadku węzła pobierz stanowiska w drugim wskazujemy stanowisko pobrane z odpowiedzi tego węzła lub ręcznie wstawiamy identyfikator stanowiska Sid. Opisany sposób wstawiania nagłówków jest wykorzystywany również w przypadku pozostałych węzłów korzystających z API EZD RP.

Sekcję send body uzupełniamy jak na zrzucie, tj. wskazujemy wcześniej przygotowany plik w postaci eml.

Węzeł Id dokumentu w obiegu odpowiada za pobranie identyfikatora dokumentu we wcześniej utworzonym obiegu na podstawie id obiegu zwracanego przez węzeł dodaj obieg. Wykorzystuje metodę GET /ezdrp/integrator/v2/obiegi/{idObieg}/dokumenty, parametry jak na zrzucie poniżej:

Węzeł dodaj dok do rpw odpowiada za zarejestrowanie w rejestrze przesyłek wpływających dokumentu, którego identyfikator zwrócił poprzedni węzeł. Wykorzystuje on metodę POST /ezdrp/integrator/v2/dokumenty/{idDokumentPrzestrzeni}/rpw, parametry jak na zrzucie poniżej:

Węzeł RPW odpowiada za rozdzielenie numeru RPW, który zostanie zwrócony przez poprzedni węzeł na trzy wartości RPW, numer, rok. Do rozdzielenia użyte zostało wyrażenie {{ $json.numerRpw.split(‘/’)}}.

Węzeł Metadane RPW uzupełnia metadane zarejestrowanej przesyłki, używa metody PUT /ezdrp/integrator/v2/rpw/{numer}/{rok}/metadane, przykład konfiguracji poniżej, węzeł używa numeru oraz roku zwróconego przez wcześniejszy węzeł o nazwie RPW.

Należy zwrócić uwagę na to, że body przekazywane jest jako json. Przykładowe body poniżej:

{

"metadaneSystemowe": {

"dataWplywu": "{{ $('data doręczenia').item.json.numerRpw[0] }}",

"uwagi": "Wiadomość otrzymana z adresu {{ $('pobierz wiadomość').item.json.sender.emailAddress.address }}",

"sposobDostarczenia": "596dc75e58a74fc983698e647a50b54f",

"rodzajDokumentu": "EZDRP.Metadane.Rodzaj.Dokumentu.22",

"typDokumentu": "EZDRP.Metadane.RPW.Typ.8",

"dostep": "EZDRP.Metadane.RPW.Dostep3",

"czyAnonimowy": true

},

"metadaneNiesystemowe": [

{

"id": "5f555b3900334ab293248223e6d6b6a1",

"wartosc": "test"

}

]

}


Jeżeli chcemy używać dedykowanego sposobu dostarczenia dla zarejestrowany wiadomości należy w EZD RP w module Administracja w Słowniki dodać taki sposób (Grupa Metadane, Nazwa RPW sposób dostarczenia). Szczegółowe informacje na temat metadanych RPW możemy pobrać korzystając z metody GET /ezdrp/integrator/v2/metadane/konfiguracja wywołując ją z parametrem klucz=2. Data wpływu pobierana jest z poprzednich węzłów, pole uwagi uzupełniane jest nadawcą wiadomości email. Wiadomość po przesłaniu do EZD RP wygląda jak poniżej:

Węzeł Ustaw kategorię ustawia wiadomości, którą właśnie zarejestrowaliśmy w EZD RP kategorię zieloną (ten węzeł jest opcjonalny). Przykładowa konfiguracja poniżej:

Węzeł Przenieś do folderu EZD RP odpowiada za przeniesienie zarejestrowanej wiadomości do innego folderu w naszym przypadku folder nazywa się zarejestrowane EZD RP i został wcześniej utworzony z poziomu Outlooka.

Zachęcam do testowania rozwiązania i dzielenia się usprawnieniami oraz innymi automatyzacjami zbudowanymi w oparciu o bezpłatne narzędzia i wykorzystujące API EZD RP oraz innych systemów z których korzystacie.

Pozdrawiam, Jacek

Jacku, ale jak rozumiem, to rozwiązanie raczej dedykowane jest podmiotom, które mają EZD na własnej infrastrukturze, czy to rozwiązanie zostało zastosowane na chmurze udostępnianej przez NASK?

Z rozwiazania moze skorzystac kazdy podmiot niezaleznie od tego czy korzysta z EZD RP e modelu SaaS czy onpremise. Warunkiem jest to zeby serwer n8n znajdowal sie w strefie dostepu majacej dostep do aplikacji (API). Czyli np. mozna miec SaaS EZD RP w NASK i n8n wtedy u siebie w serwerowni, ktore bedzie sie laczyc z IP dodanego do Bialej listy.