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

**URL:** <https://forum.ezdrp.gov.pl/t/automatyczne-rejestrowanie-wiadomosci-e-mail-w-ezd-rp-rozwiazanie/5017>\
**Category:** API EZD RP\
**Tags:** n8n\
**Created:** [30 Czerwiec 2026 12:27 UTC](https://forum.ezdrp.gov.pl/t/automatyczne-rejestrowanie-wiadomosci-e-mail-w-ezd-rp-rozwiazanie/5017 "2026-06-30T12:27:27Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Autor:** ![jacao](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.ezdrp.gov.pl/jacao/32/37_2.png) [@jacao](https://forum.ezdrp.gov.pl/u/jacao)\
**Data wpisu:** [30 Czerwiec 2026 12:27 UTC](https://forum.ezdrp.gov.pl/t/automatyczne-rejestrowanie-wiadomosci-e-mail-w-ezd-rp-rozwiazanie/5017/1 "2026-06-30T12:27:27Z")

</div>

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/](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](https://docs.n8n.io/integrations/builtin/credentials/microsoft/#microsoft-graph-api-base-url)
- 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.

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/3/393564b7cd0f53c52043a774a64ffd0920215943.png)

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.

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/8/86d84cadc90415b30c484a734c848a5d2bd37e02.png)

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:

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

const apiKey = '92ba4f90-24cb-11f0-8d98-671850ddf2aa'; // 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](https://podrecznik.ezdrp.gov.pl/wykorzystania-klucza-api-w-komunikacji-z-ezd-rp/) . Pola **akh** oraz **rt** pobieramy z wyniku działania węzła Code.

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/1/1fbb9a9358a37395c5acf7a13c06722e1ec6869a.png)

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/4/41e9fc8c204a09c3956c1986459829c3a3c4f6f7.png)

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/9/94e3fe0f33125492a9e8c761135356d3ccea5438.png)

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.

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/b/b6b8026d14518e59e75d7e3a88b0af96ac168365.png)

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.

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/9/9fc49d78d1152a6eade258da5a3e68b3629cae6b.png)

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:

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/9/958adfc9a6e022e6c4525cdcbbfe942c9dc54a00.png)

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’)}}**

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/f/f2963daa3cdaf1b07932b364e0d30ed4bd1214f2.png)

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:

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/f/f35dccec7fa763e96049b88bd7d9d3eaebe35cac.png)

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**.

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/4/41499297e3caf9cad07af5da2bf8e8a9ff0c31cd.png)

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.

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/a/a5e78c3f89d6be42cb98ae9124967cde11d5ad6b.png)

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

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/9/95bea222dfaf9610d6144ae72e578154b755001b.png)

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:

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/2/2ef118878436790e9f98a6ba392e541222e155ba.png)

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:

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/2/22a6485faec5a5f2e00241fb2aa2f9cd32535124.png)

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(‘/’)}}**.

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/e/e5dc5173c399aed3af7aa63df5d92a4d80d2385e.png)

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**.

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/2/255b440d8cd68fc01f4dba906e970d59f1c68587.png)

 ![image](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/d/d503b0f2e1ae4e3848da98ebc31d18e23ab6a64c.png)

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

```auto
{

"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:

 ![Obraz](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/d/dc3f0bc2cb13cbd5ca436dfe2d8be3845418b462.jpeg)

 ![Obraz](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/9/93573ff5099237a871153875d8c1f9377f5de3d8.jpeg)

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:

 ![Obraz](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/f/f044c0d84080613c39213cc71f24ba1ced9339ad.png)

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.

 ![Obraz](https://europe1.discourse-cdn.com/flex017/uploads/ezdrp/original/2X/9/9109ca9b4f1c62260ffd84e6b56e322efc6781d7.png)

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

---

<div class="post-metadata">

**Autor:** ![Sebastian](https://avatars.discourse-cdn.com/v4/letter/s/4da419/32.png) [@Sebastian](https://forum.ezdrp.gov.pl/u/Sebastian)\
**Data wpisu:** [30 Czerwiec 2026 17:57 UTC](https://forum.ezdrp.gov.pl/t/automatyczne-rejestrowanie-wiadomosci-e-mail-w-ezd-rp-rozwiazanie/5017/2 "2026-06-30T17:57:57Z")

</div>

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?

---

<div class="post-metadata">

**Autor:** ![jacao](https://dub1.discourse-cdn.com/flex017/user_avatar/forum.ezdrp.gov.pl/jacao/32/37_2.png) [@jacao](https://forum.ezdrp.gov.pl/u/jacao)\
**Data wpisu:** [30 Czerwiec 2026 20:45 UTC](https://forum.ezdrp.gov.pl/t/automatyczne-rejestrowanie-wiadomosci-e-mail-w-ezd-rp-rozwiazanie/5017/3 "2026-06-30T20:45:07Z")

</div>

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.
