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





















