[{"data":1,"prerenderedAt":4679},["ShallowReactive",2],{"\u002Fblog\u002Fai-for-coding":3,"\u002Fblog\u002Fai-for-coding-surround":4668},{"id":4,"title":5,"author":6,"body":7,"date":4657,"description":4658,"draft":4659,"extension":200,"image":4660,"meta":4661,"minRead":4662,"navigation":221,"path":4663,"seo":4664,"sitemap":4665,"stem":4666,"__hash__":4667},"blog\u002Fblog\u002Fai-for-coding.md","AI for coding? Nie ma ucieczki!","Artur Wilczek",{"type":8,"value":9,"toc":4651},"minimark",[10,15,42,53,79,86,90,100,111,122,180,184,187,196,344,351,466,473,2481,2487,2490,2503,2522,4571,4575,4589,4595,4604,4622,4636,4639,4647],[11,12,14],"h2",{"id":13},"wstęp","Wstęp",[16,17,18,19,29,30,33,34,37,38,41],"p",{},"Od pewnego czasu używam ",[20,21,22],"strong",{},[23,24,28],"a",{"href":25,"rel":26},"https:\u002F\u002Fgithub.com\u002Ffeatures\u002Fcopilot",[27],"nofollow","GitHub Copilot Pro"," i modeli takich jak ",[20,31,32],{},"GPT-5",", ",[20,35,36],{},"Gemini 2.5 Pro"," oraz ",[20,39,40],{},"Claude Sonnet 4.5"," do testowego tworzenia kodu.",[16,43,44,45,52],{},"Używam rozszerzenia do ",[20,46,47],{},[23,48,51],{"href":49,"rel":50},"https:\u002F\u002Fcode.visualstudio.com\u002F",[27],"VS Code",", które daje możliwość pracy w trzech trybach:",[54,55,56,63,69],"ul",{},[57,58,59,62],"li",{},[20,60,61],{},"Ask",", jeśli chcesz o coś zapytać bez automatycznej ingerencji w istniejący kod",[57,64,65,68],{},[20,66,67],{},"Edit",", jeśli chcesz wykonać konkretną, najczęściej niewielką, zmianę w kodzie",[57,70,71,74,75,78],{},[20,72,73],{},"Agent",", jeśli chcesz, żeby ",[20,76,77],{},"Copilot"," był bardziej samodzielny, analizował istniejący kod i wykonywał większe modyfikacje zgodnie z Twoimi wytycznymi",[16,80,81,82,85],{},"Domyślnie włączone jest też automatyczne uzupełnianie kodu (",[20,83,84],{},"Code Completions","), które cały czas próbuje podpowiadać kolejne instrukcje, frazy czy całe bloki kodu — można je uśpić lub wyłączyć, jeśli przeszkadza. Czasami bywa to irytujące, a czasami przerażające, bo wydaje się, że agent czyta w myślach i proponuje dokładnie to (i w takiej formie), o czym akurat pomyślałem.",[11,87,89],{"id":88},"zadanie-dla-agenta","Zadanie dla agenta",[16,91,92,93,96,97,99],{},"W jednym z ostatnio realizowanych projektów pojawiła się potrzeba szybkiego napisania klasy obsługującej skrzynkę pocztową ",[20,94,95],{},"MS Exchange",". W nowym, pustym folderze, w trybie ",[20,98,73],{}," piszę taki prompt:",[101,102,107],"pre",{"className":103,"code":105,"language":106},[104],"language-text","Zainicjuj nowy projekt **Node.js**, a następnie przygotuj klasę **ExchangeMailbox**:\n- nowa klasa w dedykowanym pliku **ExchangeMailbox.js**\n- jedna metoda **sendMail**, która daje możliwość wysyłania wiadomości pocztowych\n- użyj **MS Graph API**\n- zainstaluj wszystkie potrzebne pakiety **NPM**\n- wszystkie potrzebne dane dostępowe do API, np. **Tenant ID**, pobieraj ze zmiennych środowiskowych definiowanych w pliku **.env**\n- utwórz plik **main.js** i zaimplementuj testy nowej klasy\n","text",[108,109,105],"code",{"__ignoreMap":110},"",[16,112,113,114,121],{},"Prompt redaguję z użyciem składni ",[20,115,116],{},[23,117,120],{"href":118,"rel":119},"https:\u002F\u002Fpl.wikipedia.org\u002Fwiki\u002FMarkdown",[27],"Markdown",", ale nie mam pewności, czy dla agenta ma znaczenie, że słowa kluczowe są w ten sposób wyróżnione. Tak czy owak, prompt w oknie pracy agenta jest czytelniejszy i prezentuje się tak:",[123,124,125,136],"blockquote",{},[16,126,127,128,131,132,135],{},"Zainicjuj nowy projekt ",[20,129,130],{},"Node.js",", a następnie przygotuj klasę ",[20,133,134],{},"ExchangeMailbox",":",[54,137,138,144,151,157,163,173],{},[57,139,140,141],{},"nowa klasa w dedykowanym pliku ",[20,142,143],{},"ExchangeMailbox.js",[57,145,146,147,150],{},"jedna metoda ",[20,148,149],{},"sendMail",", która daje możliwość wysyłania wiadomości pocztowych",[57,152,153,154],{},"użyj ",[20,155,156],{},"MS Graph API",[57,158,159,160],{},"zainstaluj wszystkie potrzebne pakiety ",[20,161,162],{},"NPM",[57,164,165,166,169,170],{},"wszystkie potrzebne dane dostępowe do API, np. ",[20,167,168],{},"Tenant ID",", pobieraj ze zmiennych środowiskowych definiowanych w pliku ",[20,171,172],{},".env",[57,174,175,176,179],{},"utwórz plik ",[20,177,178],{},"main.js"," i zaimplementuj testy nowej klasy",[11,181,183],{"id":182},"wyniki-pracy-agenta","Wyniki pracy agenta",[16,185,186],{},"Agent pracował około 3 minut i przygotował:",[54,188,189],{},[57,190,191,192,195],{},"plik ",[20,193,194],{},"copilot-instructions.md",", który jest lepszą wersją mojego prompt-a",[101,197,201],{"className":198,"code":199,"filename":194,"language":200,"meta":110,"style":110},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Node.js ExchangeMailbox Project\n\nThis project implements a Node.js application with ExchangeMailbox class for sending emails via MS Graph API.\n\n## Features\n\n- ExchangeMailbox class with sendMail method\n- MS Graph API integration for email sending\n- Environment variable configuration\n- Sample test implementation\n\n## Setup\n\n1. Install dependencies: `npm install`\n2. Configure .env file with MS Graph API credentials\n3. Run test: `node main.js`\n","md",[108,202,203,216,223,230,235,244,249,258,266,274,282,287,295,300,319,328],{"__ignoreMap":110},[204,205,208,212],"span",{"class":206,"line":207},"line",1,[204,209,211],{"class":210},"sMK4o","# ",[204,213,215],{"class":214},"sBMFI","Node.js ExchangeMailbox Project\n",[204,217,219],{"class":206,"line":218},2,[204,220,222],{"emptyLinePlaceholder":221},true,"\n",[204,224,226],{"class":206,"line":225},3,[204,227,229],{"class":228},"sTEyZ","This project implements a Node.js application with ExchangeMailbox class for sending emails via MS Graph API.\n",[204,231,233],{"class":206,"line":232},4,[204,234,222],{"emptyLinePlaceholder":221},[204,236,238,241],{"class":206,"line":237},5,[204,239,240],{"class":210},"## ",[204,242,243],{"class":214},"Features\n",[204,245,247],{"class":206,"line":246},6,[204,248,222],{"emptyLinePlaceholder":221},[204,250,252,255],{"class":206,"line":251},7,[204,253,254],{"class":210},"-",[204,256,257],{"class":228}," ExchangeMailbox class with sendMail method\n",[204,259,261,263],{"class":206,"line":260},8,[204,262,254],{"class":210},[204,264,265],{"class":228}," MS Graph API integration for email sending\n",[204,267,269,271],{"class":206,"line":268},9,[204,270,254],{"class":210},[204,272,273],{"class":228}," Environment variable configuration\n",[204,275,277,279],{"class":206,"line":276},10,[204,278,254],{"class":210},[204,280,281],{"class":228}," Sample test implementation\n",[204,283,285],{"class":206,"line":284},11,[204,286,222],{"emptyLinePlaceholder":221},[204,288,290,292],{"class":206,"line":289},12,[204,291,240],{"class":210},[204,293,294],{"class":214},"Setup\n",[204,296,298],{"class":206,"line":297},13,[204,299,222],{"emptyLinePlaceholder":221},[204,301,303,306,309,312,316],{"class":206,"line":302},14,[204,304,305],{"class":210},"1.",[204,307,308],{"class":228}," Install dependencies: ",[204,310,311],{"class":210},"`",[204,313,315],{"class":314},"sfazB","npm install",[204,317,318],{"class":210},"`\n",[204,320,322,325],{"class":206,"line":321},15,[204,323,324],{"class":210},"2.",[204,326,327],{"class":228}," Configure .env file with MS Graph API credentials\n",[204,329,331,334,337,339,342],{"class":206,"line":330},16,[204,332,333],{"class":210},"3.",[204,335,336],{"class":228}," Run test: ",[204,338,311],{"class":210},[204,340,341],{"class":314},"node main.js",[204,343,318],{"class":210},[54,345,346],{},[57,347,191,348,350],{},[20,349,172],{}," z komentarzami",[101,352,356],{"className":353,"code":354,"filename":172,"language":355,"meta":110,"style":110},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# MS Graph API Configuration\n# Uzyskaj te wartości z Azure Portal -> App registrations\n\n# ID aplikacji (Client ID) z Azure AD\nAZURE_CLIENT_ID=your_client_id_here\n\n# Klucz tajny aplikacji (Client Secret) z Azure AD\nAZURE_CLIENT_SECRET=your_client_secret_here\n\n# ID dzierżawy (Tenant ID) z Azure AD\nAZURE_TENANT_ID=your_tenant_id_here\n\n# Email nadawcy (użytkownik, którego konto będzie używane do wysyłania)\nSENDER_EMAIL=your_sender_email@yourdomain.com\n\n# Opcjonalne: Email odbiorcy dla testów\nTEST_RECIPIENT_EMAIL=test_recipient@example.com\n","bash",[108,357,358,364,369,373,378,389,393,398,408,412,417,427,431,436,446,450,455],{"__ignoreMap":110},[204,359,360],{"class":206,"line":207},[204,361,363],{"class":362},"sHwdD","# MS Graph API Configuration\n",[204,365,366],{"class":206,"line":218},[204,367,368],{"class":362},"# Uzyskaj te wartości z Azure Portal -> App registrations\n",[204,370,371],{"class":206,"line":225},[204,372,222],{"emptyLinePlaceholder":221},[204,374,375],{"class":206,"line":232},[204,376,377],{"class":362},"# ID aplikacji (Client ID) z Azure AD\n",[204,379,380,383,386],{"class":206,"line":237},[204,381,382],{"class":228},"AZURE_CLIENT_ID",[204,384,385],{"class":210},"=",[204,387,388],{"class":314},"your_client_id_here\n",[204,390,391],{"class":206,"line":246},[204,392,222],{"emptyLinePlaceholder":221},[204,394,395],{"class":206,"line":251},[204,396,397],{"class":362},"# Klucz tajny aplikacji (Client Secret) z Azure AD\n",[204,399,400,403,405],{"class":206,"line":260},[204,401,402],{"class":228},"AZURE_CLIENT_SECRET",[204,404,385],{"class":210},[204,406,407],{"class":314},"your_client_secret_here\n",[204,409,410],{"class":206,"line":268},[204,411,222],{"emptyLinePlaceholder":221},[204,413,414],{"class":206,"line":276},[204,415,416],{"class":362},"# ID dzierżawy (Tenant ID) z Azure AD\n",[204,418,419,422,424],{"class":206,"line":284},[204,420,421],{"class":228},"AZURE_TENANT_ID",[204,423,385],{"class":210},[204,425,426],{"class":314},"your_tenant_id_here\n",[204,428,429],{"class":206,"line":289},[204,430,222],{"emptyLinePlaceholder":221},[204,432,433],{"class":206,"line":297},[204,434,435],{"class":362},"# Email nadawcy (użytkownik, którego konto będzie używane do wysyłania)\n",[204,437,438,441,443],{"class":206,"line":302},[204,439,440],{"class":228},"SENDER_EMAIL",[204,442,385],{"class":210},[204,444,445],{"class":314},"your_sender_email@yourdomain.com\n",[204,447,448],{"class":206,"line":321},[204,449,222],{"emptyLinePlaceholder":221},[204,451,452],{"class":206,"line":330},[204,453,454],{"class":362},"# Opcjonalne: Email odbiorcy dla testów\n",[204,456,458,461,463],{"class":206,"line":457},17,[204,459,460],{"class":228},"TEST_RECIPIENT_EMAIL",[204,462,385],{"class":210},[204,464,465],{"class":314},"test_recipient@example.com\n",[54,467,468],{},[57,469,470,471],{},"główny plik implementujący klasę - ",[20,472,143],{},[474,475,476],"code-collapse",{},[101,477,481],{"className":478,"code":479,"filename":143,"language":480,"meta":110,"style":110},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { ConfidentialClientApplication } from '@azure\u002Fmsal-node'\nimport { Client } from '@microsoft\u002Fmicrosoft-graph-client'\nimport dotenv from 'dotenv'\n\n\u002F\u002F Ładowanie zmiennych środowiskowych\ndotenv.config()\n\n\u002F**\n * Klasa do uwierzytelniania z MS Graph API\n *\u002F\nclass MSALAuthProvider {\n  constructor() {\n    this.clientApp = new ConfidentialClientApplication({\n      auth: {\n        clientId: process.env.AZURE_CLIENT_ID,\n        clientSecret: process.env.AZURE_CLIENT_SECRET,\n        authority: `https:\u002F\u002Flogin.microsoftonline.com\u002F${process.env.AZURE_TENANT_ID}`\n      }\n    })\n  }\n\n  async getAccessToken() {\n    const request = {\n      scopes: ['https:\u002F\u002Fgraph.microsoft.com\u002F.default']\n    }\n\n    try {\n      const response = await this.clientApp.acquireTokenByClientCredential(request)\n      return response.accessToken\n    } catch (error) {\n      console.error('Error acquiring token:', error)\n      throw error\n    }\n  }\n}\n\n\u002F**\n * Klasa ExchangeMailbox do wysyłania wiadomości email przez MS Graph API\n *\u002F\nexport class ExchangeMailbox {\n  constructor() {\n    this.authProvider = new MSALAuthProvider()\n    this.client = null\n    this.userEmail = process.env.SENDER_EMAIL\n  }\n\n  \u002F**\n   * Inicjalizacja klienta Graph API\n   *\u002F\n  async initialize() {\n    try {\n      this.client = Client.init({\n        authProvider: async done => {\n          try {\n            const accessToken = await this.authProvider.getAccessToken()\n            done(null, accessToken)\n          } catch (error) {\n            done(error, null)\n          }\n        }\n      })\n    } catch (error) {\n      console.error('Error initializing Graph client:', error)\n      throw error\n    }\n  }\n\n  \u002F**\n   * Wysyła wiadomość email\n   * @param {Object} mailOptions - Opcje wiadomości\n   * @param {string} mailOptions.to - Adres odbiorcy\n   * @param {string} mailOptions.subject - Temat wiadomości\n   * @param {string} mailOptions.body - Treść wiadomości (HTML lub tekst)\n   * @param {string} [mailOptions.bodyType='HTML'] - Typ treści: 'HTML' lub 'Text'\n   * @param {Array} [mailOptions.attachments] - Załączniki (opcjonalne)\n   * @returns {Promise\u003CObject>} Wynik wysyłania\n   *\u002F\n  async sendMail(mailOptions) {\n    if (!this.client) {\n      await this.initialize()\n    }\n\n    const { to, subject, body, bodyType = 'HTML', attachments = [] } = mailOptions\n\n    if (!to || !subject || !body) {\n      throw new Error('Parametry to, subject i body są wymagane')\n    }\n\n    const message = {\n      subject: subject,\n      body: {\n        contentType: bodyType,\n        content: body\n      },\n      toRecipients: [\n        {\n          emailAddress: {\n            address: to\n          }\n        }\n      ]\n    }\n\n    \u002F\u002F Dodanie załączników jeśli są dostępne\n    if (attachments && attachments.length > 0) {\n      message.attachments = attachments.map(attachment => ({\n        '@odata.type': '#microsoft.graph.fileAttachment',\n        'name': attachment.name,\n        'contentBytes': attachment.contentBytes, \u002F\u002F Base64 encoded\n        'contentType': attachment.contentType || 'application\u002Foctet-stream'\n      }))\n    }\n\n    try {\n      const response = await this.client.api(`\u002Fusers\u002F${this.userEmail}\u002FsendMail`).post({\n        message: message\n      })\n\n      console.log(`Email wysłany pomyślnie do: ${to}`)\n      return {\n        success: true,\n        message: 'Email wysłany pomyślnie',\n        response: response\n      }\n    } catch (error) {\n      console.error('Błąd podczas wysyłania emaila:', error)\n      return {\n        success: false,\n        message: 'Błąd podczas wysyłania emaila',\n        error: error.message\n      }\n    }\n  }\n\n  \u002F**\n   * Sprawdza połączenie z MS Graph API\n   * @returns {Promise\u003Cboolean>} True jeśli połączenie działa\n   *\u002F\n  async testConnection() {\n    try {\n      if (!this.client) {\n        await this.initialize()\n      }\n\n      \u002F\u002F Testujemy połączenie sprawdzając token dostępu\n      const accessToken = await this.authProvider.getAccessToken()\n      if (accessToken && accessToken.length > 0) {\n        console.log('Połączenie z MS Graph API działa. Token otrzymany pomyślnie.')\n        return true\n      } else {\n        console.log('Nie udało się uzyskać tokenu dostępu.')\n        return false\n      }\n    } catch (error) {\n      console.error('Błąd połączenia z MS Graph API:', error)\n      return false\n    }\n  }\n}\n","js",[108,482,483,510,530,547,551,556,570,574,579,584,589,601,611,634,643,665,684,714,720,729,735,740,753,766,788,794,799,807,838,851,870,897,906,911,916,922,927,932,938,943,957,966,982,995,1016,1021,1026,1032,1038,1044,1056,1063,1084,1104,1112,1136,1151,1167,1183,1189,1195,1203,1218,1242,1249,1254,1259,1264,1269,1275,1303,1325,1346,1367,1398,1424,1444,1449,1467,1484,1497,1502,1507,1558,1563,1596,1617,1622,1627,1639,1651,1661,1673,1684,1690,1701,1707,1717,1728,1733,1738,1744,1749,1754,1760,1791,1821,1843,1864,1887,1914,1922,1927,1932,1939,1991,2002,2009,2014,2040,2047,2061,2077,2088,2093,2108,2132,2139,2151,2167,2182,2187,2192,2197,2202,2207,2213,2232,2237,2249,2256,2272,2284,2289,2294,2300,2321,2347,2368,2377,2387,2407,2415,2420,2435,2459,2466,2471,2476],{"__ignoreMap":110},[204,484,485,489,492,495,498,501,504,507],{"class":206,"line":207},[204,486,488],{"class":487},"s7zQu","import",[204,490,491],{"class":210}," {",[204,493,494],{"class":228}," ConfidentialClientApplication",[204,496,497],{"class":210}," }",[204,499,500],{"class":487}," from",[204,502,503],{"class":210}," '",[204,505,506],{"class":314},"@azure\u002Fmsal-node",[204,508,509],{"class":210},"'\n",[204,511,512,514,516,519,521,523,525,528],{"class":206,"line":218},[204,513,488],{"class":487},[204,515,491],{"class":210},[204,517,518],{"class":228}," Client",[204,520,497],{"class":210},[204,522,500],{"class":487},[204,524,503],{"class":210},[204,526,527],{"class":314},"@microsoft\u002Fmicrosoft-graph-client",[204,529,509],{"class":210},[204,531,532,534,537,540,542,545],{"class":206,"line":225},[204,533,488],{"class":487},[204,535,536],{"class":228}," dotenv ",[204,538,539],{"class":487},"from",[204,541,503],{"class":210},[204,543,544],{"class":314},"dotenv",[204,546,509],{"class":210},[204,548,549],{"class":206,"line":232},[204,550,222],{"emptyLinePlaceholder":221},[204,552,553],{"class":206,"line":237},[204,554,555],{"class":362},"\u002F\u002F Ładowanie zmiennych środowiskowych\n",[204,557,558,560,563,567],{"class":206,"line":246},[204,559,544],{"class":228},[204,561,562],{"class":210},".",[204,564,566],{"class":565},"s2Zo4","config",[204,568,569],{"class":228},"()\n",[204,571,572],{"class":206,"line":251},[204,573,222],{"emptyLinePlaceholder":221},[204,575,576],{"class":206,"line":260},[204,577,578],{"class":362},"\u002F**\n",[204,580,581],{"class":206,"line":268},[204,582,583],{"class":362}," * Klasa do uwierzytelniania z MS Graph API\n",[204,585,586],{"class":206,"line":276},[204,587,588],{"class":362}," *\u002F\n",[204,590,591,595,598],{"class":206,"line":284},[204,592,594],{"class":593},"spNyl","class",[204,596,597],{"class":214}," MSALAuthProvider",[204,599,600],{"class":210}," {\n",[204,602,603,606,609],{"class":206,"line":289},[204,604,605],{"class":593},"  constructor",[204,607,608],{"class":210},"()",[204,610,600],{"class":210},[204,612,613,616,619,622,625,627,631],{"class":206,"line":297},[204,614,615],{"class":210},"    this.",[204,617,618],{"class":228},"clientApp",[204,620,621],{"class":210}," =",[204,623,624],{"class":210}," new",[204,626,494],{"class":565},[204,628,630],{"class":629},"swJcz","(",[204,632,633],{"class":210},"{\n",[204,635,636,639,641],{"class":206,"line":302},[204,637,638],{"class":629},"      auth",[204,640,135],{"class":210},[204,642,600],{"class":210},[204,644,645,648,650,653,655,658,660,662],{"class":206,"line":321},[204,646,647],{"class":629},"        clientId",[204,649,135],{"class":210},[204,651,652],{"class":228}," process",[204,654,562],{"class":210},[204,656,657],{"class":228},"env",[204,659,562],{"class":210},[204,661,382],{"class":228},[204,663,664],{"class":210},",\n",[204,666,667,670,672,674,676,678,680,682],{"class":206,"line":330},[204,668,669],{"class":629},"        clientSecret",[204,671,135],{"class":210},[204,673,652],{"class":228},[204,675,562],{"class":210},[204,677,657],{"class":228},[204,679,562],{"class":210},[204,681,402],{"class":228},[204,683,664],{"class":210},[204,685,686,689,691,694,697,700,703,705,707,709,711],{"class":206,"line":457},[204,687,688],{"class":629},"        authority",[204,690,135],{"class":210},[204,692,693],{"class":210}," `",[204,695,696],{"class":314},"https:\u002F\u002Flogin.microsoftonline.com\u002F",[204,698,699],{"class":210},"${",[204,701,702],{"class":228},"process",[204,704,562],{"class":210},[204,706,657],{"class":228},[204,708,562],{"class":210},[204,710,421],{"class":228},[204,712,713],{"class":210},"}`\n",[204,715,717],{"class":206,"line":716},18,[204,718,719],{"class":210},"      }\n",[204,721,723,726],{"class":206,"line":722},19,[204,724,725],{"class":210},"    }",[204,727,728],{"class":629},")\n",[204,730,732],{"class":206,"line":731},20,[204,733,734],{"class":210},"  }\n",[204,736,738],{"class":206,"line":737},21,[204,739,222],{"emptyLinePlaceholder":221},[204,741,743,746,749,751],{"class":206,"line":742},22,[204,744,745],{"class":593},"  async",[204,747,748],{"class":629}," getAccessToken",[204,750,608],{"class":210},[204,752,600],{"class":210},[204,754,756,759,762,764],{"class":206,"line":755},23,[204,757,758],{"class":593},"    const",[204,760,761],{"class":228}," request",[204,763,621],{"class":210},[204,765,600],{"class":210},[204,767,769,772,774,777,780,783,785],{"class":206,"line":768},24,[204,770,771],{"class":629},"      scopes",[204,773,135],{"class":210},[204,775,776],{"class":629}," [",[204,778,779],{"class":210},"'",[204,781,782],{"class":314},"https:\u002F\u002Fgraph.microsoft.com\u002F.default",[204,784,779],{"class":210},[204,786,787],{"class":629},"]\n",[204,789,791],{"class":206,"line":790},25,[204,792,793],{"class":210},"    }\n",[204,795,797],{"class":206,"line":796},26,[204,798,222],{"emptyLinePlaceholder":221},[204,800,802,805],{"class":206,"line":801},27,[204,803,804],{"class":487},"    try",[204,806,600],{"class":210},[204,808,810,813,816,818,821,824,826,828,831,833,836],{"class":206,"line":809},28,[204,811,812],{"class":593},"      const",[204,814,815],{"class":228}," response",[204,817,621],{"class":210},[204,819,820],{"class":487}," await",[204,822,823],{"class":210}," this.",[204,825,618],{"class":228},[204,827,562],{"class":210},[204,829,830],{"class":565},"acquireTokenByClientCredential",[204,832,630],{"class":629},[204,834,835],{"class":228},"request",[204,837,728],{"class":629},[204,839,841,844,846,848],{"class":206,"line":840},29,[204,842,843],{"class":487},"      return",[204,845,815],{"class":228},[204,847,562],{"class":210},[204,849,850],{"class":228},"accessToken\n",[204,852,854,856,859,862,865,868],{"class":206,"line":853},30,[204,855,725],{"class":210},[204,857,858],{"class":487}," catch",[204,860,861],{"class":629}," (",[204,863,864],{"class":228},"error",[204,866,867],{"class":629},") ",[204,869,633],{"class":210},[204,871,873,876,878,880,882,884,887,889,892,895],{"class":206,"line":872},31,[204,874,875],{"class":228},"      console",[204,877,562],{"class":210},[204,879,864],{"class":565},[204,881,630],{"class":629},[204,883,779],{"class":210},[204,885,886],{"class":314},"Error acquiring token:",[204,888,779],{"class":210},[204,890,891],{"class":210},",",[204,893,894],{"class":228}," error",[204,896,728],{"class":629},[204,898,900,903],{"class":206,"line":899},32,[204,901,902],{"class":487},"      throw",[204,904,905],{"class":228}," error\n",[204,907,909],{"class":206,"line":908},33,[204,910,793],{"class":210},[204,912,914],{"class":206,"line":913},34,[204,915,734],{"class":210},[204,917,919],{"class":206,"line":918},35,[204,920,921],{"class":210},"}\n",[204,923,925],{"class":206,"line":924},36,[204,926,222],{"emptyLinePlaceholder":221},[204,928,930],{"class":206,"line":929},37,[204,931,578],{"class":362},[204,933,935],{"class":206,"line":934},38,[204,936,937],{"class":362}," * Klasa ExchangeMailbox do wysyłania wiadomości email przez MS Graph API\n",[204,939,941],{"class":206,"line":940},39,[204,942,588],{"class":362},[204,944,946,949,952,955],{"class":206,"line":945},40,[204,947,948],{"class":487},"export",[204,950,951],{"class":593}," class",[204,953,954],{"class":214}," ExchangeMailbox",[204,956,600],{"class":210},[204,958,960,962,964],{"class":206,"line":959},41,[204,961,605],{"class":593},[204,963,608],{"class":210},[204,965,600],{"class":210},[204,967,969,971,974,976,978,980],{"class":206,"line":968},42,[204,970,615],{"class":210},[204,972,973],{"class":228},"authProvider",[204,975,621],{"class":210},[204,977,624],{"class":210},[204,979,597],{"class":565},[204,981,569],{"class":629},[204,983,985,987,990,992],{"class":206,"line":984},43,[204,986,615],{"class":210},[204,988,989],{"class":228},"client",[204,991,621],{"class":210},[204,993,994],{"class":210}," null\n",[204,996,998,1000,1003,1005,1007,1009,1011,1013],{"class":206,"line":997},44,[204,999,615],{"class":210},[204,1001,1002],{"class":228},"userEmail",[204,1004,621],{"class":210},[204,1006,652],{"class":228},[204,1008,562],{"class":210},[204,1010,657],{"class":228},[204,1012,562],{"class":210},[204,1014,1015],{"class":228},"SENDER_EMAIL\n",[204,1017,1019],{"class":206,"line":1018},45,[204,1020,734],{"class":210},[204,1022,1024],{"class":206,"line":1023},46,[204,1025,222],{"emptyLinePlaceholder":221},[204,1027,1029],{"class":206,"line":1028},47,[204,1030,1031],{"class":362},"  \u002F**\n",[204,1033,1035],{"class":206,"line":1034},48,[204,1036,1037],{"class":362},"   * Inicjalizacja klienta Graph API\n",[204,1039,1041],{"class":206,"line":1040},49,[204,1042,1043],{"class":362},"   *\u002F\n",[204,1045,1047,1049,1052,1054],{"class":206,"line":1046},50,[204,1048,745],{"class":593},[204,1050,1051],{"class":629}," initialize",[204,1053,608],{"class":210},[204,1055,600],{"class":210},[204,1057,1059,1061],{"class":206,"line":1058},51,[204,1060,804],{"class":487},[204,1062,600],{"class":210},[204,1064,1066,1069,1071,1073,1075,1077,1080,1082],{"class":206,"line":1065},52,[204,1067,1068],{"class":210},"      this.",[204,1070,989],{"class":228},[204,1072,621],{"class":210},[204,1074,518],{"class":228},[204,1076,562],{"class":210},[204,1078,1079],{"class":565},"init",[204,1081,630],{"class":629},[204,1083,633],{"class":210},[204,1085,1087,1090,1092,1095,1099,1102],{"class":206,"line":1086},53,[204,1088,1089],{"class":565},"        authProvider",[204,1091,135],{"class":210},[204,1093,1094],{"class":593}," async",[204,1096,1098],{"class":1097},"sHdIc"," done",[204,1100,1101],{"class":593}," =>",[204,1103,600],{"class":210},[204,1105,1107,1110],{"class":206,"line":1106},54,[204,1108,1109],{"class":487},"          try",[204,1111,600],{"class":210},[204,1113,1115,1118,1121,1123,1125,1127,1129,1131,1134],{"class":206,"line":1114},55,[204,1116,1117],{"class":593},"            const",[204,1119,1120],{"class":228}," accessToken",[204,1122,621],{"class":210},[204,1124,820],{"class":487},[204,1126,823],{"class":210},[204,1128,973],{"class":228},[204,1130,562],{"class":210},[204,1132,1133],{"class":565},"getAccessToken",[204,1135,569],{"class":629},[204,1137,1139,1142,1144,1147,1149],{"class":206,"line":1138},56,[204,1140,1141],{"class":565},"            done",[204,1143,630],{"class":629},[204,1145,1146],{"class":210},"null,",[204,1148,1120],{"class":228},[204,1150,728],{"class":629},[204,1152,1154,1157,1159,1161,1163,1165],{"class":206,"line":1153},57,[204,1155,1156],{"class":210},"          }",[204,1158,858],{"class":487},[204,1160,861],{"class":629},[204,1162,864],{"class":228},[204,1164,867],{"class":629},[204,1166,633],{"class":210},[204,1168,1170,1172,1174,1176,1178,1181],{"class":206,"line":1169},58,[204,1171,1141],{"class":565},[204,1173,630],{"class":629},[204,1175,864],{"class":228},[204,1177,891],{"class":210},[204,1179,1180],{"class":210}," null",[204,1182,728],{"class":629},[204,1184,1186],{"class":206,"line":1185},59,[204,1187,1188],{"class":210},"          }\n",[204,1190,1192],{"class":206,"line":1191},60,[204,1193,1194],{"class":210},"        }\n",[204,1196,1198,1201],{"class":206,"line":1197},61,[204,1199,1200],{"class":210},"      }",[204,1202,728],{"class":629},[204,1204,1206,1208,1210,1212,1214,1216],{"class":206,"line":1205},62,[204,1207,725],{"class":210},[204,1209,858],{"class":487},[204,1211,861],{"class":629},[204,1213,864],{"class":228},[204,1215,867],{"class":629},[204,1217,633],{"class":210},[204,1219,1221,1223,1225,1227,1229,1231,1234,1236,1238,1240],{"class":206,"line":1220},63,[204,1222,875],{"class":228},[204,1224,562],{"class":210},[204,1226,864],{"class":565},[204,1228,630],{"class":629},[204,1230,779],{"class":210},[204,1232,1233],{"class":314},"Error initializing Graph client:",[204,1235,779],{"class":210},[204,1237,891],{"class":210},[204,1239,894],{"class":228},[204,1241,728],{"class":629},[204,1243,1245,1247],{"class":206,"line":1244},64,[204,1246,902],{"class":487},[204,1248,905],{"class":228},[204,1250,1252],{"class":206,"line":1251},65,[204,1253,793],{"class":210},[204,1255,1257],{"class":206,"line":1256},66,[204,1258,734],{"class":210},[204,1260,1262],{"class":206,"line":1261},67,[204,1263,222],{"emptyLinePlaceholder":221},[204,1265,1267],{"class":206,"line":1266},68,[204,1268,1031],{"class":362},[204,1270,1272],{"class":206,"line":1271},69,[204,1273,1274],{"class":362},"   * Wysyła wiadomość email\n",[204,1276,1278,1281,1284,1288,1290,1294,1297,1300],{"class":206,"line":1277},70,[204,1279,1280],{"class":362},"   * ",[204,1282,1283],{"class":487},"@",[204,1285,1287],{"class":1286},"s6hCs","param",[204,1289,491],{"class":487},[204,1291,1293],{"class":1292},"sFweD","Object",[204,1295,1296],{"class":487},"}",[204,1298,1299],{"class":1097}," mailOptions",[204,1301,1302],{"class":362}," - Opcje wiadomości\n",[204,1304,1306,1308,1310,1312,1314,1317,1319,1322],{"class":206,"line":1305},71,[204,1307,1280],{"class":362},[204,1309,1283],{"class":487},[204,1311,1287],{"class":1286},[204,1313,491],{"class":487},[204,1315,1316],{"class":1292},"string",[204,1318,1296],{"class":487},[204,1320,1321],{"class":1097}," mailOptions.to",[204,1323,1324],{"class":362}," - Adres odbiorcy\n",[204,1326,1328,1330,1332,1334,1336,1338,1340,1343],{"class":206,"line":1327},72,[204,1329,1280],{"class":362},[204,1331,1283],{"class":487},[204,1333,1287],{"class":1286},[204,1335,491],{"class":487},[204,1337,1316],{"class":1292},[204,1339,1296],{"class":487},[204,1341,1342],{"class":1097}," mailOptions.subject",[204,1344,1345],{"class":362}," - Temat wiadomości\n",[204,1347,1349,1351,1353,1355,1357,1359,1361,1364],{"class":206,"line":1348},73,[204,1350,1280],{"class":362},[204,1352,1283],{"class":487},[204,1354,1287],{"class":1286},[204,1356,491],{"class":487},[204,1358,1316],{"class":1292},[204,1360,1296],{"class":487},[204,1362,1363],{"class":1097}," mailOptions.body",[204,1365,1366],{"class":362}," - Treść wiadomości (HTML lub tekst)\n",[204,1368,1370,1372,1374,1376,1378,1380,1382,1384,1387,1389,1392,1395],{"class":206,"line":1369},74,[204,1371,1280],{"class":362},[204,1373,1283],{"class":487},[204,1375,1287],{"class":1286},[204,1377,491],{"class":487},[204,1379,1316],{"class":1292},[204,1381,1296],{"class":487},[204,1383,776],{"class":487},[204,1385,1386],{"class":1097},"mailOptions.bodyType",[204,1388,385],{"class":487},[204,1390,1391],{"class":1097},"'HTML'",[204,1393,1394],{"class":487},"]",[204,1396,1397],{"class":362}," - Typ treści: 'HTML' lub 'Text'\n",[204,1399,1401,1403,1405,1407,1409,1412,1414,1416,1419,1421],{"class":206,"line":1400},75,[204,1402,1280],{"class":362},[204,1404,1283],{"class":487},[204,1406,1287],{"class":1286},[204,1408,491],{"class":487},[204,1410,1411],{"class":1292},"Array",[204,1413,1296],{"class":487},[204,1415,776],{"class":487},[204,1417,1418],{"class":1097},"mailOptions.attachments",[204,1420,1394],{"class":487},[204,1422,1423],{"class":362}," - Załączniki (opcjonalne)\n",[204,1425,1427,1429,1431,1434,1436,1439,1441],{"class":206,"line":1426},76,[204,1428,1280],{"class":362},[204,1430,1283],{"class":487},[204,1432,1433],{"class":1286},"returns",[204,1435,491],{"class":487},[204,1437,1438],{"class":1292},"Promise\u003CObject>",[204,1440,1296],{"class":487},[204,1442,1443],{"class":362}," Wynik wysyłania\n",[204,1445,1447],{"class":206,"line":1446},77,[204,1448,1043],{"class":362},[204,1450,1452,1454,1457,1459,1462,1465],{"class":206,"line":1451},78,[204,1453,745],{"class":593},[204,1455,1456],{"class":629}," sendMail",[204,1458,630],{"class":210},[204,1460,1461],{"class":1097},"mailOptions",[204,1463,1464],{"class":210},")",[204,1466,600],{"class":210},[204,1468,1470,1473,1475,1478,1480,1482],{"class":206,"line":1469},79,[204,1471,1472],{"class":487},"    if",[204,1474,861],{"class":629},[204,1476,1477],{"class":210},"!this.",[204,1479,989],{"class":228},[204,1481,867],{"class":629},[204,1483,633],{"class":210},[204,1485,1487,1490,1492,1495],{"class":206,"line":1486},80,[204,1488,1489],{"class":487},"      await",[204,1491,823],{"class":210},[204,1493,1494],{"class":565},"initialize",[204,1496,569],{"class":629},[204,1498,1500],{"class":206,"line":1499},81,[204,1501,793],{"class":210},[204,1503,1505],{"class":206,"line":1504},82,[204,1506,222],{"emptyLinePlaceholder":221},[204,1508,1510,1512,1514,1517,1519,1522,1524,1527,1529,1532,1534,1536,1539,1541,1543,1546,1548,1551,1553,1555],{"class":206,"line":1509},83,[204,1511,758],{"class":593},[204,1513,491],{"class":210},[204,1515,1516],{"class":228}," to",[204,1518,891],{"class":210},[204,1520,1521],{"class":228}," subject",[204,1523,891],{"class":210},[204,1525,1526],{"class":228}," body",[204,1528,891],{"class":210},[204,1530,1531],{"class":228}," bodyType",[204,1533,621],{"class":210},[204,1535,503],{"class":210},[204,1537,1538],{"class":314},"HTML",[204,1540,779],{"class":210},[204,1542,891],{"class":210},[204,1544,1545],{"class":228}," attachments",[204,1547,621],{"class":210},[204,1549,1550],{"class":629}," [] ",[204,1552,1296],{"class":210},[204,1554,621],{"class":210},[204,1556,1557],{"class":228}," mailOptions\n",[204,1559,1561],{"class":206,"line":1560},84,[204,1562,222],{"emptyLinePlaceholder":221},[204,1564,1566,1568,1570,1573,1576,1579,1582,1585,1587,1589,1592,1594],{"class":206,"line":1565},85,[204,1567,1472],{"class":487},[204,1569,861],{"class":629},[204,1571,1572],{"class":210},"!",[204,1574,1575],{"class":228},"to",[204,1577,1578],{"class":210}," ||",[204,1580,1581],{"class":210}," !",[204,1583,1584],{"class":228},"subject",[204,1586,1578],{"class":210},[204,1588,1581],{"class":210},[204,1590,1591],{"class":228},"body",[204,1593,867],{"class":629},[204,1595,633],{"class":210},[204,1597,1599,1601,1603,1606,1608,1610,1613,1615],{"class":206,"line":1598},86,[204,1600,902],{"class":487},[204,1602,624],{"class":210},[204,1604,1605],{"class":565}," Error",[204,1607,630],{"class":629},[204,1609,779],{"class":210},[204,1611,1612],{"class":314},"Parametry to, subject i body są wymagane",[204,1614,779],{"class":210},[204,1616,728],{"class":629},[204,1618,1620],{"class":206,"line":1619},87,[204,1621,793],{"class":210},[204,1623,1625],{"class":206,"line":1624},88,[204,1626,222],{"emptyLinePlaceholder":221},[204,1628,1630,1632,1635,1637],{"class":206,"line":1629},89,[204,1631,758],{"class":593},[204,1633,1634],{"class":228}," message",[204,1636,621],{"class":210},[204,1638,600],{"class":210},[204,1640,1642,1645,1647,1649],{"class":206,"line":1641},90,[204,1643,1644],{"class":629},"      subject",[204,1646,135],{"class":210},[204,1648,1521],{"class":228},[204,1650,664],{"class":210},[204,1652,1654,1657,1659],{"class":206,"line":1653},91,[204,1655,1656],{"class":629},"      body",[204,1658,135],{"class":210},[204,1660,600],{"class":210},[204,1662,1664,1667,1669,1671],{"class":206,"line":1663},92,[204,1665,1666],{"class":629},"        contentType",[204,1668,135],{"class":210},[204,1670,1531],{"class":228},[204,1672,664],{"class":210},[204,1674,1676,1679,1681],{"class":206,"line":1675},93,[204,1677,1678],{"class":629},"        content",[204,1680,135],{"class":210},[204,1682,1683],{"class":228}," body\n",[204,1685,1687],{"class":206,"line":1686},94,[204,1688,1689],{"class":210},"      },\n",[204,1691,1693,1696,1698],{"class":206,"line":1692},95,[204,1694,1695],{"class":629},"      toRecipients",[204,1697,135],{"class":210},[204,1699,1700],{"class":629}," [\n",[204,1702,1704],{"class":206,"line":1703},96,[204,1705,1706],{"class":210},"        {\n",[204,1708,1710,1713,1715],{"class":206,"line":1709},97,[204,1711,1712],{"class":629},"          emailAddress",[204,1714,135],{"class":210},[204,1716,600],{"class":210},[204,1718,1720,1723,1725],{"class":206,"line":1719},98,[204,1721,1722],{"class":629},"            address",[204,1724,135],{"class":210},[204,1726,1727],{"class":228}," to\n",[204,1729,1731],{"class":206,"line":1730},99,[204,1732,1188],{"class":210},[204,1734,1736],{"class":206,"line":1735},100,[204,1737,1194],{"class":210},[204,1739,1741],{"class":206,"line":1740},101,[204,1742,1743],{"class":629},"      ]\n",[204,1745,1747],{"class":206,"line":1746},102,[204,1748,793],{"class":210},[204,1750,1752],{"class":206,"line":1751},103,[204,1753,222],{"emptyLinePlaceholder":221},[204,1755,1757],{"class":206,"line":1756},104,[204,1758,1759],{"class":362},"    \u002F\u002F Dodanie załączników jeśli są dostępne\n",[204,1761,1763,1765,1767,1770,1773,1775,1777,1780,1783,1787,1789],{"class":206,"line":1762},105,[204,1764,1472],{"class":487},[204,1766,861],{"class":629},[204,1768,1769],{"class":228},"attachments",[204,1771,1772],{"class":210}," &&",[204,1774,1545],{"class":228},[204,1776,562],{"class":210},[204,1778,1779],{"class":228},"length",[204,1781,1782],{"class":210}," >",[204,1784,1786],{"class":1785},"sbssI"," 0",[204,1788,867],{"class":629},[204,1790,633],{"class":210},[204,1792,1794,1797,1799,1801,1803,1805,1807,1810,1812,1815,1817,1819],{"class":206,"line":1793},106,[204,1795,1796],{"class":228},"      message",[204,1798,562],{"class":210},[204,1800,1769],{"class":228},[204,1802,621],{"class":210},[204,1804,1545],{"class":228},[204,1806,562],{"class":210},[204,1808,1809],{"class":565},"map",[204,1811,630],{"class":629},[204,1813,1814],{"class":1097},"attachment",[204,1816,1101],{"class":593},[204,1818,861],{"class":629},[204,1820,633],{"class":210},[204,1822,1824,1827,1830,1832,1834,1836,1839,1841],{"class":206,"line":1823},107,[204,1825,1826],{"class":210},"        '",[204,1828,1829],{"class":629},"@odata.type",[204,1831,779],{"class":210},[204,1833,135],{"class":210},[204,1835,503],{"class":210},[204,1837,1838],{"class":314},"#microsoft.graph.fileAttachment",[204,1840,779],{"class":210},[204,1842,664],{"class":210},[204,1844,1846,1848,1851,1853,1855,1858,1860,1862],{"class":206,"line":1845},108,[204,1847,1826],{"class":210},[204,1849,1850],{"class":629},"name",[204,1852,779],{"class":210},[204,1854,135],{"class":210},[204,1856,1857],{"class":228}," attachment",[204,1859,562],{"class":210},[204,1861,1850],{"class":228},[204,1863,664],{"class":210},[204,1865,1867,1869,1872,1874,1876,1878,1880,1882,1884],{"class":206,"line":1866},109,[204,1868,1826],{"class":210},[204,1870,1871],{"class":629},"contentBytes",[204,1873,779],{"class":210},[204,1875,135],{"class":210},[204,1877,1857],{"class":228},[204,1879,562],{"class":210},[204,1881,1871],{"class":228},[204,1883,891],{"class":210},[204,1885,1886],{"class":362}," \u002F\u002F Base64 encoded\n",[204,1888,1890,1892,1895,1897,1899,1901,1903,1905,1907,1909,1912],{"class":206,"line":1889},110,[204,1891,1826],{"class":210},[204,1893,1894],{"class":629},"contentType",[204,1896,779],{"class":210},[204,1898,135],{"class":210},[204,1900,1857],{"class":228},[204,1902,562],{"class":210},[204,1904,1894],{"class":228},[204,1906,1578],{"class":210},[204,1908,503],{"class":210},[204,1910,1911],{"class":314},"application\u002Foctet-stream",[204,1913,509],{"class":210},[204,1915,1917,1919],{"class":206,"line":1916},111,[204,1918,1200],{"class":210},[204,1920,1921],{"class":629},"))\n",[204,1923,1925],{"class":206,"line":1924},112,[204,1926,793],{"class":210},[204,1928,1930],{"class":206,"line":1929},113,[204,1931,222],{"emptyLinePlaceholder":221},[204,1933,1935,1937],{"class":206,"line":1934},114,[204,1936,804],{"class":487},[204,1938,600],{"class":210},[204,1940,1942,1944,1946,1948,1950,1952,1954,1956,1959,1961,1963,1966,1968,1971,1973,1975,1978,1980,1982,1984,1987,1989],{"class":206,"line":1941},115,[204,1943,812],{"class":593},[204,1945,815],{"class":228},[204,1947,621],{"class":210},[204,1949,820],{"class":487},[204,1951,823],{"class":210},[204,1953,989],{"class":228},[204,1955,562],{"class":210},[204,1957,1958],{"class":565},"api",[204,1960,630],{"class":629},[204,1962,311],{"class":210},[204,1964,1965],{"class":314},"\u002Fusers\u002F",[204,1967,699],{"class":210},[204,1969,1970],{"class":210},"this.",[204,1972,1002],{"class":228},[204,1974,1296],{"class":210},[204,1976,1977],{"class":314},"\u002FsendMail",[204,1979,311],{"class":210},[204,1981,1464],{"class":629},[204,1983,562],{"class":210},[204,1985,1986],{"class":565},"post",[204,1988,630],{"class":629},[204,1990,633],{"class":210},[204,1992,1994,1997,1999],{"class":206,"line":1993},116,[204,1995,1996],{"class":629},"        message",[204,1998,135],{"class":210},[204,2000,2001],{"class":228}," message\n",[204,2003,2005,2007],{"class":206,"line":2004},117,[204,2006,1200],{"class":210},[204,2008,728],{"class":629},[204,2010,2012],{"class":206,"line":2011},118,[204,2013,222],{"emptyLinePlaceholder":221},[204,2015,2017,2019,2021,2024,2026,2028,2031,2033,2035,2038],{"class":206,"line":2016},119,[204,2018,875],{"class":228},[204,2020,562],{"class":210},[204,2022,2023],{"class":565},"log",[204,2025,630],{"class":629},[204,2027,311],{"class":210},[204,2029,2030],{"class":314},"Email wysłany pomyślnie do: ",[204,2032,699],{"class":210},[204,2034,1575],{"class":228},[204,2036,2037],{"class":210},"}`",[204,2039,728],{"class":629},[204,2041,2043,2045],{"class":206,"line":2042},120,[204,2044,843],{"class":487},[204,2046,600],{"class":210},[204,2048,2050,2053,2055,2059],{"class":206,"line":2049},121,[204,2051,2052],{"class":629},"        success",[204,2054,135],{"class":210},[204,2056,2058],{"class":2057},"sfNiH"," true",[204,2060,664],{"class":210},[204,2062,2064,2066,2068,2070,2073,2075],{"class":206,"line":2063},122,[204,2065,1996],{"class":629},[204,2067,135],{"class":210},[204,2069,503],{"class":210},[204,2071,2072],{"class":314},"Email wysłany pomyślnie",[204,2074,779],{"class":210},[204,2076,664],{"class":210},[204,2078,2080,2083,2085],{"class":206,"line":2079},123,[204,2081,2082],{"class":629},"        response",[204,2084,135],{"class":210},[204,2086,2087],{"class":228}," response\n",[204,2089,2091],{"class":206,"line":2090},124,[204,2092,719],{"class":210},[204,2094,2096,2098,2100,2102,2104,2106],{"class":206,"line":2095},125,[204,2097,725],{"class":210},[204,2099,858],{"class":487},[204,2101,861],{"class":629},[204,2103,864],{"class":228},[204,2105,867],{"class":629},[204,2107,633],{"class":210},[204,2109,2111,2113,2115,2117,2119,2121,2124,2126,2128,2130],{"class":206,"line":2110},126,[204,2112,875],{"class":228},[204,2114,562],{"class":210},[204,2116,864],{"class":565},[204,2118,630],{"class":629},[204,2120,779],{"class":210},[204,2122,2123],{"class":314},"Błąd podczas wysyłania emaila:",[204,2125,779],{"class":210},[204,2127,891],{"class":210},[204,2129,894],{"class":228},[204,2131,728],{"class":629},[204,2133,2135,2137],{"class":206,"line":2134},127,[204,2136,843],{"class":487},[204,2138,600],{"class":210},[204,2140,2142,2144,2146,2149],{"class":206,"line":2141},128,[204,2143,2052],{"class":629},[204,2145,135],{"class":210},[204,2147,2148],{"class":2057}," false",[204,2150,664],{"class":210},[204,2152,2154,2156,2158,2160,2163,2165],{"class":206,"line":2153},129,[204,2155,1996],{"class":629},[204,2157,135],{"class":210},[204,2159,503],{"class":210},[204,2161,2162],{"class":314},"Błąd podczas wysyłania emaila",[204,2164,779],{"class":210},[204,2166,664],{"class":210},[204,2168,2170,2173,2175,2177,2179],{"class":206,"line":2169},130,[204,2171,2172],{"class":629},"        error",[204,2174,135],{"class":210},[204,2176,894],{"class":228},[204,2178,562],{"class":210},[204,2180,2181],{"class":228},"message\n",[204,2183,2185],{"class":206,"line":2184},131,[204,2186,719],{"class":210},[204,2188,2190],{"class":206,"line":2189},132,[204,2191,793],{"class":210},[204,2193,2195],{"class":206,"line":2194},133,[204,2196,734],{"class":210},[204,2198,2200],{"class":206,"line":2199},134,[204,2201,222],{"emptyLinePlaceholder":221},[204,2203,2205],{"class":206,"line":2204},135,[204,2206,1031],{"class":362},[204,2208,2210],{"class":206,"line":2209},136,[204,2211,2212],{"class":362},"   * Sprawdza połączenie z MS Graph API\n",[204,2214,2216,2218,2220,2222,2224,2227,2229],{"class":206,"line":2215},137,[204,2217,1280],{"class":362},[204,2219,1283],{"class":487},[204,2221,1433],{"class":1286},[204,2223,491],{"class":487},[204,2225,2226],{"class":1292},"Promise\u003Cboolean>",[204,2228,1296],{"class":487},[204,2230,2231],{"class":362}," True jeśli połączenie działa\n",[204,2233,2235],{"class":206,"line":2234},138,[204,2236,1043],{"class":362},[204,2238,2240,2242,2245,2247],{"class":206,"line":2239},139,[204,2241,745],{"class":593},[204,2243,2244],{"class":629}," testConnection",[204,2246,608],{"class":210},[204,2248,600],{"class":210},[204,2250,2252,2254],{"class":206,"line":2251},140,[204,2253,804],{"class":487},[204,2255,600],{"class":210},[204,2257,2259,2262,2264,2266,2268,2270],{"class":206,"line":2258},141,[204,2260,2261],{"class":487},"      if",[204,2263,861],{"class":629},[204,2265,1477],{"class":210},[204,2267,989],{"class":228},[204,2269,867],{"class":629},[204,2271,633],{"class":210},[204,2273,2275,2278,2280,2282],{"class":206,"line":2274},142,[204,2276,2277],{"class":487},"        await",[204,2279,823],{"class":210},[204,2281,1494],{"class":565},[204,2283,569],{"class":629},[204,2285,2287],{"class":206,"line":2286},143,[204,2288,719],{"class":210},[204,2290,2292],{"class":206,"line":2291},144,[204,2293,222],{"emptyLinePlaceholder":221},[204,2295,2297],{"class":206,"line":2296},145,[204,2298,2299],{"class":362},"      \u002F\u002F Testujemy połączenie sprawdzając token dostępu\n",[204,2301,2303,2305,2307,2309,2311,2313,2315,2317,2319],{"class":206,"line":2302},146,[204,2304,812],{"class":593},[204,2306,1120],{"class":228},[204,2308,621],{"class":210},[204,2310,820],{"class":487},[204,2312,823],{"class":210},[204,2314,973],{"class":228},[204,2316,562],{"class":210},[204,2318,1133],{"class":565},[204,2320,569],{"class":629},[204,2322,2324,2326,2328,2331,2333,2335,2337,2339,2341,2343,2345],{"class":206,"line":2323},147,[204,2325,2261],{"class":487},[204,2327,861],{"class":629},[204,2329,2330],{"class":228},"accessToken",[204,2332,1772],{"class":210},[204,2334,1120],{"class":228},[204,2336,562],{"class":210},[204,2338,1779],{"class":228},[204,2340,1782],{"class":210},[204,2342,1786],{"class":1785},[204,2344,867],{"class":629},[204,2346,633],{"class":210},[204,2348,2350,2353,2355,2357,2359,2361,2364,2366],{"class":206,"line":2349},148,[204,2351,2352],{"class":228},"        console",[204,2354,562],{"class":210},[204,2356,2023],{"class":565},[204,2358,630],{"class":629},[204,2360,779],{"class":210},[204,2362,2363],{"class":314},"Połączenie z MS Graph API działa. Token otrzymany pomyślnie.",[204,2365,779],{"class":210},[204,2367,728],{"class":629},[204,2369,2371,2374],{"class":206,"line":2370},149,[204,2372,2373],{"class":487},"        return",[204,2375,2376],{"class":2057}," true\n",[204,2378,2380,2382,2385],{"class":206,"line":2379},150,[204,2381,1200],{"class":210},[204,2383,2384],{"class":487}," else",[204,2386,600],{"class":210},[204,2388,2390,2392,2394,2396,2398,2400,2403,2405],{"class":206,"line":2389},151,[204,2391,2352],{"class":228},[204,2393,562],{"class":210},[204,2395,2023],{"class":565},[204,2397,630],{"class":629},[204,2399,779],{"class":210},[204,2401,2402],{"class":314},"Nie udało się uzyskać tokenu dostępu.",[204,2404,779],{"class":210},[204,2406,728],{"class":629},[204,2408,2410,2412],{"class":206,"line":2409},152,[204,2411,2373],{"class":487},[204,2413,2414],{"class":2057}," false\n",[204,2416,2418],{"class":206,"line":2417},153,[204,2419,719],{"class":210},[204,2421,2423,2425,2427,2429,2431,2433],{"class":206,"line":2422},154,[204,2424,725],{"class":210},[204,2426,858],{"class":487},[204,2428,861],{"class":629},[204,2430,864],{"class":228},[204,2432,867],{"class":629},[204,2434,633],{"class":210},[204,2436,2438,2440,2442,2444,2446,2448,2451,2453,2455,2457],{"class":206,"line":2437},155,[204,2439,875],{"class":228},[204,2441,562],{"class":210},[204,2443,864],{"class":565},[204,2445,630],{"class":629},[204,2447,779],{"class":210},[204,2449,2450],{"class":314},"Błąd połączenia z MS Graph API:",[204,2452,779],{"class":210},[204,2454,891],{"class":210},[204,2456,894],{"class":228},[204,2458,728],{"class":629},[204,2460,2462,2464],{"class":206,"line":2461},156,[204,2463,843],{"class":487},[204,2465,2414],{"class":2057},[204,2467,2469],{"class":206,"line":2468},157,[204,2470,793],{"class":210},[204,2472,2474],{"class":206,"line":2473},158,[204,2475,734],{"class":210},[204,2477,2479],{"class":206,"line":2478},159,[204,2480,921],{"class":210},[16,2482,2483,2484,2486],{},"Zgodnie z moimi wytycznymi, powstał też plik ",[20,2485,178],{},", z testami użycia nowej klasy, ale nie wklejam tutaj zawartości, bo jest sztucznie rozdmuchany, nieczytelny i sprawia wrażenie jakby został przygotowany dla kogoś, kto dopiero uczy się programowania i potrzebuje maksymalnej liczby komunikatów objaśniający co się dzieje w każdej linijce programu.",[16,2488,2489],{},"Kod nie od razu działał bez błędów, ale agent sam zaproponował testowe uruchomienie i po wykryciu błędów (analizując to co dzieje się na konsoli tekstowej), próbował go naprawić. W tym przypadku iterował 3 razy robiąc poprawki i ponownie uruchamiając test.",[2491,2492,2493],"warning",{},[16,2494,2495,2496,2499,2500,2502],{},"Uruchomienie kodu, musi być zaaprobowane przez nadzorcę, czyli mnie. Bez takiego zabezpieczenia, agent mógłby wykonać dowolny kod i to w kontekście moich uprawnień. To samo tyczy się aktualizacji wrażliwych plików, takich jak ",[108,2497,2498],{},"package.json",", czy ",[108,2501,172],{},". Agent zawsze czeka na pozwolenie ingerencji w takie pliki, chyba że zezwolimy mu na takie działanie w kontekście identycznej operacji.",[16,2504,2505,2506,2509,2510,2513,2514,2517,2518,2521],{},"Tym czym mnie zaskoczył, to automatycznie wygenerowany plik ",[20,2507,2508],{},"README.md"," z przydatną dokumentacją, w której są wytyczne jak zdefiniować aplikację w ",[20,2511,2512],{},"Microsoft Azure",", wygenerować dla niej ",[20,2515,2516],{},"klucz API"," i nadać odpowiednie ",[20,2519,2520],{},"uprawnienia",". Podaje też proste przykłady użycia nowej klasy.",[474,2523,2524],{},[2525,2526,2527,4553],"code-group",{},[101,2528,2530],{"className":198,"code":2529,"filename":2508,"language":200,"meta":110,"style":110},"# 📧 ExchangeMailbox - Node.js Email Client\n\nProjekt Node.js implementujący klasę `ExchangeMailbox` do wysyłania wiadomości email przez Microsoft Graph API.\n\n## 🚀 Funkcjonalności\n\n- ✅ **Klasa ExchangeMailbox** z metodą `sendMail`\n- ✅ **Integracja z MS Graph API** do wysyłania emaili\n- ✅ **Uwierzytelnianie** przez Azure AD (MSAL)\n- ✅ **Konfiguracja przez zmienne środowiskowe** (.env)\n- ✅ **Obsługa HTML i tekstowych emaili**\n- ✅ **Wsparcie dla załączników**\n- ✅ **Test połączenia** z MS Graph API\n- ✅ **Przykłady użycia** i testy\n\n## 📋 Wymagania\n\n- Node.js 16+\n- Konto Microsoft 365 \u002F Azure AD\n- Zarejestrowana aplikacja w Azure Portal\n- **Uprawnienia administratora Azure AD** (do zatwierdzenia uprawnień aplikacji)\n\n## 🛠️ Instalacja\n\n1. **Sklonuj\u002Fpobierz projekt**\n2. **Zainstaluj zależności:**\n\n   ```bash\n   npm install\n   ```\n\n3. **Skonfiguruj zmienne środowiskowe** (zobacz sekcję konfiguracja)\n\n4. **Uruchom test:**\n   ```bash\n   npm start\n   ```\n\n## ⚙️ Konfiguracja Azure AD\n\n### 1. Rejestracja aplikacji w Azure Portal\n\n1. Przejdź do [Azure Portal](https:\u002F\u002Fportal.azure.com)\n2. Wybierz **Azure Active Directory** > **App registrations** > **New registration**\n3. Podaj nazwę aplikacji (np. \"ExchangeMailbox App\")\n4. Wybierz **Accounts in this organizational directory only**\n5. Kliknij **Register**\n\n### 2. Konfiguracja uprawnień API\n\n1. W zarejestrowanej aplikacji przejdź do **API permissions**\n2. Kliknij **Add a permission** > **Microsoft Graph** > **Application permissions**\n3. Dodaj uprawnienie:\n   - `Mail.Send` - do wysyłania emaili w imieniu aplikacji\n4. Kliknij **Grant admin consent** (wymagane uprawnienia administratora)\n\n> **Uwaga:** Używamy uwierzytelniania aplikacji (Client Credentials flow), które pozwala aplikacji działać bez logowania użytkownika, ale wymaga uprawnień administratora.\n\n### 3. Utworzenie Client Secret\n\n1. Przejdź do **Certificates & secrets**\n2. Kliknij **New client secret**\n3. Podaj opis i wybierz okres ważności\n4. **Skopiuj wartość** - będzie potrzebna w pliku .env\n\n### 4. Skopiuj identyfikatory\n\nZ sekcji **Overview** skopiuj:\n\n- **Application (client) ID**\n- **Directory (tenant) ID**\n\n## 🔧 Konfiguracja zmiennych środowiskowych\n\nSkopiuj plik `.env` i wypełnij następujące wartości:\n\n```env\n# MS Graph API Configuration\nAZURE_CLIENT_ID=your_client_id_here\nAZURE_CLIENT_SECRET=your_client_secret_here\nAZURE_TENANT_ID=your_tenant_id_here\nSENDER_EMAIL=your_sender_email@yourdomain.com\nTEST_RECIPIENT_EMAIL=test_recipient@example.com\n```\n\n### Gdzie znaleźć te wartości:\n\n- **AZURE_CLIENT_ID**: Application ID z Azure Portal\n- **AZURE_CLIENT_SECRET**: Client Secret utworzony w Azure Portal\n- **AZURE_TENANT_ID**: Directory ID z Azure Portal\n- **SENDER_EMAIL**: Email użytkownika, który będzie nadawcą (musi istnieć w organizacji)\n- **TEST_RECIPIENT_EMAIL**: Email do testów (opcjonalne)\n\n## 📖 Użycie\n\n### Podstawowy przykład\n\n```javascript\nimport { ExchangeMailbox } from '.\u002FExchangeMailbox.js'\n\nconst mailbox = new ExchangeMailbox()\n\n\u002F\u002F Wysłanie prostego emaila\nconst result = await mailbox.sendMail({\n  to: 'odbiorca@example.com',\n  subject: 'Temat wiadomości',\n  body: 'Treść wiadomości'\n})\n\nif (result.success) {\n  console.log('Email wysłany pomyślnie!')\n} else {\n  console.error('Błąd:', result.message)\n}\n```\n\n### Email z HTML\n\n```javascript\nawait mailbox.sendMail({\n  to: 'odbiorca@example.com',\n  subject: 'Email z HTML',\n  body: '\u003Ch1>Witaj!\u003C\u002Fh1>\u003Cp>To jest \u003Cstrong>HTML\u003C\u002Fstrong> email.\u003C\u002Fp>',\n  bodyType: 'HTML'\n})\n```\n\n### Email z załącznikami\n\n```javascript\nawait mailbox.sendMail({\n  to: 'odbiorca@example.com',\n  subject: 'Email z załącznikiem',\n  body: 'Zobacz załącznik w załączniku',\n  attachments: [\n    {\n      name: 'dokument.pdf',\n      contentBytes: 'base64_encoded_file_content',\n      contentType: 'application\u002Fpdf'\n    }\n  ]\n})\n```\n\n### Test połączenia\n\n```javascript\nconst isConnected = await mailbox.testConnection()\nif (isConnected) {\n  console.log('Połączenie z MS Graph API działa!')\n}\n```\n\n> **Uwaga:** Test połączenia sprawdza czy można uzyskać token dostępu z Azure AD. Nie wymaga dodatkowych uprawnień API.\n\n## 🏃 Uruchomienie testów\n\n```bash\n# Uruchomienie testów\nnpm start\n\n# lub bezpośrednio\nnode main.js\n```\n\n## 📁 Struktura projektu\n\n```\nexchange-mailbox-nodejs\u002F\n├── 📄 ExchangeMailbox.js    # Główna klasa do wysyłania emaili\n├── 📄 main.js              # Testy i przykłady użycia\n├── 📄 package.json         # Konfiguracja NPM i zależności\n├── 📄 .env                 # Zmienne środowiskowe (konfiguracja)\n├── 📄 .gitignore          # Wykluczenia Git (chroni .env)\n├── 📄 README.md           # Dokumentacja (ten plik)\n└── 📁 .github\u002F\n    └── 📄 copilot-instructions.md  # Instrukcje dla Copilot\n```\n\n## 🔍 Rozwiązywanie problemów\n\n### Błędy uwierzytelniania\n\n1. **\"Invalid client credentials\"** - sprawdź Client ID i Client Secret w pliku .env\n2. **\"Invalid tenant\"** - sprawdź Tenant ID w pliku .env\n3. **\"Insufficient privileges\"** - upewnij się że aplikacja ma uprawnienie `Mail.Send` i zostało zatwierdzone przez administratora\n\n### Błędy wysyłania emaili\n\n1. **\"User not found\"** - sprawdź czy SENDER_EMAIL to prawdziwy użytkownik w organizacji\n2. **\"Access denied\"** - sprawdź czy admin zatwierdził uprawnienia aplikacji\n3. **\"Mailbox not found\"** - upewnij się że użytkownik ma licencję Exchange Online\n\n### Częste problemy podczas testów\n\n1. **\"\u002Fme request is only valid with delegated authentication flow\"** - Ten błąd jest normalny, używamy uwierzytelniania aplikacji (client credentials)\n2. **\"Insufficient privileges to complete the operation\"** - Nie jest potrzebne uprawnienie User.Read dla podstawowej funkcjonalności wysyłania emaili\n3. **\"TypeError: \\_this.provider is not a function\"** - Problem z konfiguracją klienta Graph, rozwiązany w aktualnej wersji\n\n### Debugging\n\n- Test połączenia sprawdza czy można uzyskać token dostępu (nie wymaga dodatkowych uprawnień)\n- Włącz szczegółowe logi błędów w konsoli aby zobaczyć dokładne komunikaty z MS Graph API\n- Sprawdź czy wszystkie zmienne środowiskowe w .env są wypełnione\n\n## 📦 Zależności\n\n- `@azure\u002Fmsal-node` - Uwierzytelnianie Microsoft Authentication Library\n- `@microsoft\u002Fmicrosoft-graph-client` - Klient MS Graph API\n- `dotenv` - Ładowanie zmiennych środowiskowych\n\n## 📄 Licencja\n\nMIT License - możesz swobodnie używać, modyfikować i dystrybuować ten kod.\n\n## 🆘 Pomoc\n\nJeśli napotkasz problemy:\n\n1. Sprawdź konfigurację w Azure Portal\n2. Zweryfikuj zmienne środowiskowe w `.env`\n3. Uruchom test połączenia: `await mailbox.testConnection()`\n4. Sprawdź logi błędów w konsoli\n\n---\n\n**📧 Miłego wysyłania emaili z ExchangeMailbox! 🚀**\n",[108,2531,2532,2539,2543,2557,2561,2568,2572,2598,2614,2630,2646,2660,2673,2689,2705,2709,2716,2720,2727,2734,2741,2756,2760,2767,2771,2782,2793,2797,2806,2811,2816,2820,2834,2838,2850,2856,2861,2865,2869,2876,2880,2888,2892,2914,2947,2954,2967,2982,2986,2993,2997,3011,3042,3049,3064,3080,3084,3100,3104,3111,3115,3128,3141,3148,3162,3166,3173,3177,3192,3196,3207,3218,3222,3229,3233,3247,3251,3259,3263,3268,3273,3278,3283,3288,3293,3297,3304,3308,3321,3334,3347,3360,3373,3377,3384,3388,3395,3399,3406,3425,3429,3445,3449,3454,3476,3492,3508,3522,3528,3532,3547,3567,3575,3604,3608,3612,3616,3623,3627,3633,3648,3662,3677,3692,3705,3711,3715,3719,3726,3730,3736,3750,3764,3779,3794,3803,3808,3824,3840,3854,3858,3863,3869,3873,3877,3884,3888,3894,3914,3923,3942,3946,3950,3954,3967,3971,3978,3982,3988,3993,4002,4007,4013,4022,4027,4032,4040,4045,4050,4056,4062,4068,4074,4080,4086,4092,4098,4104,4109,4114,4122,4127,4135,4140,4155,4170,4194,4199,4207,4212,4227,4242,4257,4262,4270,4275,4290,4305,4327,4332,4340,4345,4353,4361,4369,4374,4382,4387,4401,4415,4429,4434,4442,4447,4453,4458,4466,4471,4477,4482,4490,4504,4519,4527,4532,4538,4543],{"__ignoreMap":110},[204,2533,2534,2536],{"class":206,"line":207},[204,2535,211],{"class":210},[204,2537,2538],{"class":214},"📧 ExchangeMailbox - Node.js Email Client\n",[204,2540,2541],{"class":206,"line":218},[204,2542,222],{"emptyLinePlaceholder":221},[204,2544,2545,2548,2550,2552,2554],{"class":206,"line":225},[204,2546,2547],{"class":228},"Projekt Node.js implementujący klasę ",[204,2549,311],{"class":210},[204,2551,134],{"class":314},[204,2553,311],{"class":210},[204,2555,2556],{"class":228}," do wysyłania wiadomości email przez Microsoft Graph API.\n",[204,2558,2559],{"class":206,"line":232},[204,2560,222],{"emptyLinePlaceholder":221},[204,2562,2563,2565],{"class":206,"line":237},[204,2564,240],{"class":210},[204,2566,2567],{"class":214},"🚀 Funkcjonalności\n",[204,2569,2570],{"class":206,"line":246},[204,2571,222],{"emptyLinePlaceholder":221},[204,2573,2574,2576,2579,2583,2587,2589,2592,2594,2596],{"class":206,"line":251},[204,2575,254],{"class":210},[204,2577,2578],{"class":228}," ✅ ",[204,2580,2582],{"class":2581},"sHepR","**",[204,2584,2586],{"class":2585},"so75L","Klasa ExchangeMailbox",[204,2588,2582],{"class":2581},[204,2590,2591],{"class":228}," z metodą ",[204,2593,311],{"class":210},[204,2595,149],{"class":314},[204,2597,318],{"class":210},[204,2599,2600,2602,2604,2606,2609,2611],{"class":206,"line":260},[204,2601,254],{"class":210},[204,2603,2578],{"class":228},[204,2605,2582],{"class":2581},[204,2607,2608],{"class":2585},"Integracja z MS Graph API",[204,2610,2582],{"class":2581},[204,2612,2613],{"class":228}," do wysyłania emaili\n",[204,2615,2616,2618,2620,2622,2625,2627],{"class":206,"line":268},[204,2617,254],{"class":210},[204,2619,2578],{"class":228},[204,2621,2582],{"class":2581},[204,2623,2624],{"class":2585},"Uwierzytelnianie",[204,2626,2582],{"class":2581},[204,2628,2629],{"class":228}," przez Azure AD (MSAL)\n",[204,2631,2632,2634,2636,2638,2641,2643],{"class":206,"line":276},[204,2633,254],{"class":210},[204,2635,2578],{"class":228},[204,2637,2582],{"class":2581},[204,2639,2640],{"class":2585},"Konfiguracja przez zmienne środowiskowe",[204,2642,2582],{"class":2581},[204,2644,2645],{"class":228}," (.env)\n",[204,2647,2648,2650,2652,2654,2657],{"class":206,"line":284},[204,2649,254],{"class":210},[204,2651,2578],{"class":228},[204,2653,2582],{"class":2581},[204,2655,2656],{"class":2585},"Obsługa HTML i tekstowych emaili",[204,2658,2659],{"class":2581},"**\n",[204,2661,2662,2664,2666,2668,2671],{"class":206,"line":289},[204,2663,254],{"class":210},[204,2665,2578],{"class":228},[204,2667,2582],{"class":2581},[204,2669,2670],{"class":2585},"Wsparcie dla załączników",[204,2672,2659],{"class":2581},[204,2674,2675,2677,2679,2681,2684,2686],{"class":206,"line":297},[204,2676,254],{"class":210},[204,2678,2578],{"class":228},[204,2680,2582],{"class":2581},[204,2682,2683],{"class":2585},"Test połączenia",[204,2685,2582],{"class":2581},[204,2687,2688],{"class":228}," z MS Graph API\n",[204,2690,2691,2693,2695,2697,2700,2702],{"class":206,"line":302},[204,2692,254],{"class":210},[204,2694,2578],{"class":228},[204,2696,2582],{"class":2581},[204,2698,2699],{"class":2585},"Przykłady użycia",[204,2701,2582],{"class":2581},[204,2703,2704],{"class":228}," i testy\n",[204,2706,2707],{"class":206,"line":321},[204,2708,222],{"emptyLinePlaceholder":221},[204,2710,2711,2713],{"class":206,"line":330},[204,2712,240],{"class":210},[204,2714,2715],{"class":214},"📋 Wymagania\n",[204,2717,2718],{"class":206,"line":457},[204,2719,222],{"emptyLinePlaceholder":221},[204,2721,2722,2724],{"class":206,"line":716},[204,2723,254],{"class":210},[204,2725,2726],{"class":228}," Node.js 16+\n",[204,2728,2729,2731],{"class":206,"line":722},[204,2730,254],{"class":210},[204,2732,2733],{"class":228}," Konto Microsoft 365 \u002F Azure AD\n",[204,2735,2736,2738],{"class":206,"line":731},[204,2737,254],{"class":210},[204,2739,2740],{"class":228}," Zarejestrowana aplikacja w Azure Portal\n",[204,2742,2743,2745,2748,2751,2753],{"class":206,"line":737},[204,2744,254],{"class":210},[204,2746,2747],{"class":2581}," **",[204,2749,2750],{"class":2585},"Uprawnienia administratora Azure AD",[204,2752,2582],{"class":2581},[204,2754,2755],{"class":228}," (do zatwierdzenia uprawnień aplikacji)\n",[204,2757,2758],{"class":206,"line":742},[204,2759,222],{"emptyLinePlaceholder":221},[204,2761,2762,2764],{"class":206,"line":755},[204,2763,240],{"class":210},[204,2765,2766],{"class":214},"🛠️ Instalacja\n",[204,2768,2769],{"class":206,"line":768},[204,2770,222],{"emptyLinePlaceholder":221},[204,2772,2773,2775,2777,2780],{"class":206,"line":790},[204,2774,305],{"class":210},[204,2776,2747],{"class":2581},[204,2778,2779],{"class":2585},"Sklonuj\u002Fpobierz projekt",[204,2781,2659],{"class":2581},[204,2783,2784,2786,2788,2791],{"class":206,"line":796},[204,2785,324],{"class":210},[204,2787,2747],{"class":2581},[204,2789,2790],{"class":2585},"Zainstaluj zależności:",[204,2792,2659],{"class":2581},[204,2794,2795],{"class":206,"line":801},[204,2796,222],{"emptyLinePlaceholder":221},[204,2798,2799,2802],{"class":206,"line":809},[204,2800,2801],{"class":314},"   ```",[204,2803,2805],{"class":2804},"sJsPd","bash\n",[204,2807,2808],{"class":206,"line":840},[204,2809,2810],{"class":228},"   npm install\n",[204,2812,2813],{"class":206,"line":853},[204,2814,2815],{"class":314},"   ```\n",[204,2817,2818],{"class":206,"line":872},[204,2819,222],{"emptyLinePlaceholder":221},[204,2821,2822,2824,2826,2829,2831],{"class":206,"line":899},[204,2823,333],{"class":210},[204,2825,2747],{"class":2581},[204,2827,2828],{"class":2585},"Skonfiguruj zmienne środowiskowe",[204,2830,2582],{"class":2581},[204,2832,2833],{"class":228}," (zobacz sekcję konfiguracja)\n",[204,2835,2836],{"class":206,"line":908},[204,2837,222],{"emptyLinePlaceholder":221},[204,2839,2840,2843,2845,2848],{"class":206,"line":913},[204,2841,2842],{"class":210},"4.",[204,2844,2747],{"class":2581},[204,2846,2847],{"class":2585},"Uruchom test:",[204,2849,2659],{"class":2581},[204,2851,2852,2854],{"class":206,"line":918},[204,2853,2801],{"class":314},[204,2855,2805],{"class":2804},[204,2857,2858],{"class":206,"line":924},[204,2859,2860],{"class":228},"   npm start\n",[204,2862,2863],{"class":206,"line":929},[204,2864,2815],{"class":314},[204,2866,2867],{"class":206,"line":934},[204,2868,222],{"emptyLinePlaceholder":221},[204,2870,2871,2873],{"class":206,"line":940},[204,2872,240],{"class":210},[204,2874,2875],{"class":214},"⚙️ Konfiguracja Azure AD\n",[204,2877,2878],{"class":206,"line":945},[204,2879,222],{"emptyLinePlaceholder":221},[204,2881,2882,2885],{"class":206,"line":959},[204,2883,2884],{"class":210},"### ",[204,2886,2887],{"class":214},"1. Rejestracja aplikacji w Azure Portal\n",[204,2889,2890],{"class":206,"line":968},[204,2891,222],{"emptyLinePlaceholder":221},[204,2893,2894,2896,2899,2902,2905,2908,2912],{"class":206,"line":984},[204,2895,305],{"class":210},[204,2897,2898],{"class":228}," Przejdź do ",[204,2900,2901],{"class":210},"[",[204,2903,2904],{"class":314},"Azure Portal",[204,2906,2907],{"class":210},"](",[204,2909,2911],{"class":2910},"sDpXG","https:\u002F\u002Fportal.azure.com",[204,2913,728],{"class":210},[204,2915,2916,2918,2921,2923,2926,2928,2931,2933,2936,2938,2940,2942,2945],{"class":206,"line":997},[204,2917,324],{"class":210},[204,2919,2920],{"class":228}," Wybierz ",[204,2922,2582],{"class":2581},[204,2924,2925],{"class":2585},"Azure Active Directory",[204,2927,2582],{"class":2581},[204,2929,2930],{"class":228}," > ",[204,2932,2582],{"class":2581},[204,2934,2935],{"class":2585},"App registrations",[204,2937,2582],{"class":2581},[204,2939,2930],{"class":228},[204,2941,2582],{"class":2581},[204,2943,2944],{"class":2585},"New registration",[204,2946,2659],{"class":2581},[204,2948,2949,2951],{"class":206,"line":1018},[204,2950,333],{"class":210},[204,2952,2953],{"class":228}," Podaj nazwę aplikacji (np. \"ExchangeMailbox App\")\n",[204,2955,2956,2958,2960,2962,2965],{"class":206,"line":1023},[204,2957,2842],{"class":210},[204,2959,2920],{"class":228},[204,2961,2582],{"class":2581},[204,2963,2964],{"class":2585},"Accounts in this organizational directory only",[204,2966,2659],{"class":2581},[204,2968,2969,2972,2975,2977,2980],{"class":206,"line":1028},[204,2970,2971],{"class":210},"5.",[204,2973,2974],{"class":228}," Kliknij ",[204,2976,2582],{"class":2581},[204,2978,2979],{"class":2585},"Register",[204,2981,2659],{"class":2581},[204,2983,2984],{"class":206,"line":1034},[204,2985,222],{"emptyLinePlaceholder":221},[204,2987,2988,2990],{"class":206,"line":1040},[204,2989,2884],{"class":210},[204,2991,2992],{"class":214},"2. Konfiguracja uprawnień API\n",[204,2994,2995],{"class":206,"line":1046},[204,2996,222],{"emptyLinePlaceholder":221},[204,2998,2999,3001,3004,3006,3009],{"class":206,"line":1058},[204,3000,305],{"class":210},[204,3002,3003],{"class":228}," W zarejestrowanej aplikacji przejdź do ",[204,3005,2582],{"class":2581},[204,3007,3008],{"class":2585},"API permissions",[204,3010,2659],{"class":2581},[204,3012,3013,3015,3017,3019,3022,3024,3026,3028,3031,3033,3035,3037,3040],{"class":206,"line":1065},[204,3014,324],{"class":210},[204,3016,2974],{"class":228},[204,3018,2582],{"class":2581},[204,3020,3021],{"class":2585},"Add a permission",[204,3023,2582],{"class":2581},[204,3025,2930],{"class":228},[204,3027,2582],{"class":2581},[204,3029,3030],{"class":2585},"Microsoft Graph",[204,3032,2582],{"class":2581},[204,3034,2930],{"class":228},[204,3036,2582],{"class":2581},[204,3038,3039],{"class":2585},"Application permissions",[204,3041,2659],{"class":2581},[204,3043,3044,3046],{"class":206,"line":1086},[204,3045,333],{"class":210},[204,3047,3048],{"class":228}," Dodaj uprawnienie:\n",[204,3050,3051,3054,3056,3059,3061],{"class":206,"line":1106},[204,3052,3053],{"class":210},"   -",[204,3055,693],{"class":210},[204,3057,3058],{"class":314},"Mail.Send",[204,3060,311],{"class":210},[204,3062,3063],{"class":228}," - do wysyłania emaili w imieniu aplikacji\n",[204,3065,3066,3068,3070,3072,3075,3077],{"class":206,"line":1114},[204,3067,2842],{"class":210},[204,3069,2974],{"class":228},[204,3071,2582],{"class":2581},[204,3073,3074],{"class":2585},"Grant admin consent",[204,3076,2582],{"class":2581},[204,3078,3079],{"class":228}," (wymagane uprawnienia administratora)\n",[204,3081,3082],{"class":206,"line":1138},[204,3083,222],{"emptyLinePlaceholder":221},[204,3085,3086,3090,3092,3095,3097],{"class":206,"line":1153},[204,3087,3089],{"class":3088},"sCNwf",">",[204,3091,2747],{"class":2581},[204,3093,3094],{"class":2585},"Uwaga:",[204,3096,2582],{"class":2581},[204,3098,3099],{"class":487}," Używamy uwierzytelniania aplikacji (Client Credentials flow), które pozwala aplikacji działać bez logowania użytkownika, ale wymaga uprawnień administratora.\n",[204,3101,3102],{"class":206,"line":1169},[204,3103,222],{"emptyLinePlaceholder":221},[204,3105,3106,3108],{"class":206,"line":1185},[204,3107,2884],{"class":210},[204,3109,3110],{"class":214},"3. Utworzenie Client Secret\n",[204,3112,3113],{"class":206,"line":1191},[204,3114,222],{"emptyLinePlaceholder":221},[204,3116,3117,3119,3121,3123,3126],{"class":206,"line":1197},[204,3118,305],{"class":210},[204,3120,2898],{"class":228},[204,3122,2582],{"class":2581},[204,3124,3125],{"class":2585},"Certificates & secrets",[204,3127,2659],{"class":2581},[204,3129,3130,3132,3134,3136,3139],{"class":206,"line":1205},[204,3131,324],{"class":210},[204,3133,2974],{"class":228},[204,3135,2582],{"class":2581},[204,3137,3138],{"class":2585},"New client secret",[204,3140,2659],{"class":2581},[204,3142,3143,3145],{"class":206,"line":1220},[204,3144,333],{"class":210},[204,3146,3147],{"class":228}," Podaj opis i wybierz okres ważności\n",[204,3149,3150,3152,3154,3157,3159],{"class":206,"line":1244},[204,3151,2842],{"class":210},[204,3153,2747],{"class":2581},[204,3155,3156],{"class":2585},"Skopiuj wartość",[204,3158,2582],{"class":2581},[204,3160,3161],{"class":228}," - będzie potrzebna w pliku .env\n",[204,3163,3164],{"class":206,"line":1251},[204,3165,222],{"emptyLinePlaceholder":221},[204,3167,3168,3170],{"class":206,"line":1256},[204,3169,2884],{"class":210},[204,3171,3172],{"class":214},"4. Skopiuj identyfikatory\n",[204,3174,3175],{"class":206,"line":1261},[204,3176,222],{"emptyLinePlaceholder":221},[204,3178,3179,3182,3184,3187,3189],{"class":206,"line":1266},[204,3180,3181],{"class":228},"Z sekcji ",[204,3183,2582],{"class":2581},[204,3185,3186],{"class":2585},"Overview",[204,3188,2582],{"class":2581},[204,3190,3191],{"class":228}," skopiuj:\n",[204,3193,3194],{"class":206,"line":1271},[204,3195,222],{"emptyLinePlaceholder":221},[204,3197,3198,3200,3202,3205],{"class":206,"line":1277},[204,3199,254],{"class":210},[204,3201,2747],{"class":2581},[204,3203,3204],{"class":2585},"Application (client) ID",[204,3206,2659],{"class":2581},[204,3208,3209,3211,3213,3216],{"class":206,"line":1305},[204,3210,254],{"class":210},[204,3212,2747],{"class":2581},[204,3214,3215],{"class":2585},"Directory (tenant) ID",[204,3217,2659],{"class":2581},[204,3219,3220],{"class":206,"line":1327},[204,3221,222],{"emptyLinePlaceholder":221},[204,3223,3224,3226],{"class":206,"line":1348},[204,3225,240],{"class":210},[204,3227,3228],{"class":214},"🔧 Konfiguracja zmiennych środowiskowych\n",[204,3230,3231],{"class":206,"line":1369},[204,3232,222],{"emptyLinePlaceholder":221},[204,3234,3235,3238,3240,3242,3244],{"class":206,"line":1400},[204,3236,3237],{"class":228},"Skopiuj plik ",[204,3239,311],{"class":210},[204,3241,172],{"class":314},[204,3243,311],{"class":210},[204,3245,3246],{"class":228}," i wypełnij następujące wartości:\n",[204,3248,3249],{"class":206,"line":1426},[204,3250,222],{"emptyLinePlaceholder":221},[204,3252,3253,3256],{"class":206,"line":1446},[204,3254,3255],{"class":314},"```",[204,3257,3258],{"class":2804},"env\n",[204,3260,3261],{"class":206,"line":1451},[204,3262,363],{"class":2804},[204,3264,3265],{"class":206,"line":1469},[204,3266,3267],{"class":2804},"AZURE_CLIENT_ID=your_client_id_here\n",[204,3269,3270],{"class":206,"line":1486},[204,3271,3272],{"class":2804},"AZURE_CLIENT_SECRET=your_client_secret_here\n",[204,3274,3275],{"class":206,"line":1499},[204,3276,3277],{"class":2804},"AZURE_TENANT_ID=your_tenant_id_here\n",[204,3279,3280],{"class":206,"line":1504},[204,3281,3282],{"class":2804},"SENDER_EMAIL=your_sender_email@yourdomain.com\n",[204,3284,3285],{"class":206,"line":1509},[204,3286,3287],{"class":2804},"TEST_RECIPIENT_EMAIL=test_recipient@example.com\n",[204,3289,3290],{"class":206,"line":1560},[204,3291,3292],{"class":314},"```\n",[204,3294,3295],{"class":206,"line":1565},[204,3296,222],{"emptyLinePlaceholder":221},[204,3298,3299,3301],{"class":206,"line":1598},[204,3300,2884],{"class":210},[204,3302,3303],{"class":214},"Gdzie znaleźć te wartości:\n",[204,3305,3306],{"class":206,"line":1619},[204,3307,222],{"emptyLinePlaceholder":221},[204,3309,3310,3312,3314,3316,3318],{"class":206,"line":1624},[204,3311,254],{"class":210},[204,3313,2747],{"class":2581},[204,3315,382],{"class":2585},[204,3317,2582],{"class":2581},[204,3319,3320],{"class":228},": Application ID z Azure Portal\n",[204,3322,3323,3325,3327,3329,3331],{"class":206,"line":1629},[204,3324,254],{"class":210},[204,3326,2747],{"class":2581},[204,3328,402],{"class":2585},[204,3330,2582],{"class":2581},[204,3332,3333],{"class":228},": Client Secret utworzony w Azure Portal\n",[204,3335,3336,3338,3340,3342,3344],{"class":206,"line":1641},[204,3337,254],{"class":210},[204,3339,2747],{"class":2581},[204,3341,421],{"class":2585},[204,3343,2582],{"class":2581},[204,3345,3346],{"class":228},": Directory ID z Azure Portal\n",[204,3348,3349,3351,3353,3355,3357],{"class":206,"line":1653},[204,3350,254],{"class":210},[204,3352,2747],{"class":2581},[204,3354,440],{"class":2585},[204,3356,2582],{"class":2581},[204,3358,3359],{"class":228},": Email użytkownika, który będzie nadawcą (musi istnieć w organizacji)\n",[204,3361,3362,3364,3366,3368,3370],{"class":206,"line":1663},[204,3363,254],{"class":210},[204,3365,2747],{"class":2581},[204,3367,460],{"class":2585},[204,3369,2582],{"class":2581},[204,3371,3372],{"class":228},": Email do testów (opcjonalne)\n",[204,3374,3375],{"class":206,"line":1675},[204,3376,222],{"emptyLinePlaceholder":221},[204,3378,3379,3381],{"class":206,"line":1686},[204,3380,240],{"class":210},[204,3382,3383],{"class":214},"📖 Użycie\n",[204,3385,3386],{"class":206,"line":1692},[204,3387,222],{"emptyLinePlaceholder":221},[204,3389,3390,3392],{"class":206,"line":1703},[204,3391,2884],{"class":210},[204,3393,3394],{"class":214},"Podstawowy przykład\n",[204,3396,3397],{"class":206,"line":1709},[204,3398,222],{"emptyLinePlaceholder":221},[204,3400,3401,3403],{"class":206,"line":1719},[204,3402,3255],{"class":314},[204,3404,3405],{"class":2804},"javascript\n",[204,3407,3408,3410,3412,3414,3416,3418,3420,3423],{"class":206,"line":1730},[204,3409,488],{"class":487},[204,3411,491],{"class":210},[204,3413,954],{"class":228},[204,3415,497],{"class":210},[204,3417,500],{"class":487},[204,3419,503],{"class":210},[204,3421,3422],{"class":314},".\u002FExchangeMailbox.js",[204,3424,509],{"class":210},[204,3426,3427],{"class":206,"line":1735},[204,3428,222],{"emptyLinePlaceholder":221},[204,3430,3431,3434,3437,3439,3441,3443],{"class":206,"line":1740},[204,3432,3433],{"class":593},"const",[204,3435,3436],{"class":228}," mailbox ",[204,3438,385],{"class":210},[204,3440,624],{"class":210},[204,3442,954],{"class":565},[204,3444,569],{"class":228},[204,3446,3447],{"class":206,"line":1746},[204,3448,222],{"emptyLinePlaceholder":221},[204,3450,3451],{"class":206,"line":1751},[204,3452,3453],{"class":362},"\u002F\u002F Wysłanie prostego emaila\n",[204,3455,3456,3458,3461,3463,3465,3468,3470,3472,3474],{"class":206,"line":1756},[204,3457,3433],{"class":593},[204,3459,3460],{"class":228}," result ",[204,3462,385],{"class":210},[204,3464,820],{"class":487},[204,3466,3467],{"class":228}," mailbox",[204,3469,562],{"class":210},[204,3471,149],{"class":565},[204,3473,630],{"class":228},[204,3475,633],{"class":210},[204,3477,3478,3481,3483,3485,3488,3490],{"class":206,"line":1762},[204,3479,3480],{"class":629},"  to",[204,3482,135],{"class":210},[204,3484,503],{"class":210},[204,3486,3487],{"class":314},"odbiorca@example.com",[204,3489,779],{"class":210},[204,3491,664],{"class":210},[204,3493,3494,3497,3499,3501,3504,3506],{"class":206,"line":1793},[204,3495,3496],{"class":629},"  subject",[204,3498,135],{"class":210},[204,3500,503],{"class":210},[204,3502,3503],{"class":314},"Temat wiadomości",[204,3505,779],{"class":210},[204,3507,664],{"class":210},[204,3509,3510,3513,3515,3517,3520],{"class":206,"line":1823},[204,3511,3512],{"class":629},"  body",[204,3514,135],{"class":210},[204,3516,503],{"class":210},[204,3518,3519],{"class":314},"Treść wiadomości",[204,3521,509],{"class":210},[204,3523,3524,3526],{"class":206,"line":1845},[204,3525,1296],{"class":210},[204,3527,728],{"class":228},[204,3529,3530],{"class":206,"line":1866},[204,3531,222],{"emptyLinePlaceholder":221},[204,3533,3534,3537,3540,3542,3545],{"class":206,"line":1889},[204,3535,3536],{"class":487},"if",[204,3538,3539],{"class":228}," (result",[204,3541,562],{"class":210},[204,3543,3544],{"class":228},"success) ",[204,3546,633],{"class":210},[204,3548,3549,3552,3554,3556,3558,3560,3563,3565],{"class":206,"line":1916},[204,3550,3551],{"class":228},"  console",[204,3553,562],{"class":210},[204,3555,2023],{"class":565},[204,3557,630],{"class":629},[204,3559,779],{"class":210},[204,3561,3562],{"class":314},"Email wysłany pomyślnie!",[204,3564,779],{"class":210},[204,3566,728],{"class":629},[204,3568,3569,3571,3573],{"class":206,"line":1924},[204,3570,1296],{"class":210},[204,3572,2384],{"class":487},[204,3574,600],{"class":210},[204,3576,3577,3579,3581,3583,3585,3587,3590,3592,3594,3597,3599,3602],{"class":206,"line":1929},[204,3578,3551],{"class":228},[204,3580,562],{"class":210},[204,3582,864],{"class":565},[204,3584,630],{"class":629},[204,3586,779],{"class":210},[204,3588,3589],{"class":314},"Błąd:",[204,3591,779],{"class":210},[204,3593,891],{"class":210},[204,3595,3596],{"class":228}," result",[204,3598,562],{"class":210},[204,3600,3601],{"class":228},"message",[204,3603,728],{"class":629},[204,3605,3606],{"class":206,"line":1934},[204,3607,921],{"class":210},[204,3609,3610],{"class":206,"line":1941},[204,3611,3292],{"class":314},[204,3613,3614],{"class":206,"line":1993},[204,3615,222],{"emptyLinePlaceholder":221},[204,3617,3618,3620],{"class":206,"line":2004},[204,3619,2884],{"class":210},[204,3621,3622],{"class":214},"Email z HTML\n",[204,3624,3625],{"class":206,"line":2011},[204,3626,222],{"emptyLinePlaceholder":221},[204,3628,3629,3631],{"class":206,"line":2016},[204,3630,3255],{"class":314},[204,3632,3405],{"class":2804},[204,3634,3635,3638,3640,3642,3644,3646],{"class":206,"line":2042},[204,3636,3637],{"class":487},"await",[204,3639,3467],{"class":228},[204,3641,562],{"class":210},[204,3643,149],{"class":565},[204,3645,630],{"class":228},[204,3647,633],{"class":210},[204,3649,3650,3652,3654,3656,3658,3660],{"class":206,"line":2049},[204,3651,3480],{"class":629},[204,3653,135],{"class":210},[204,3655,503],{"class":210},[204,3657,3487],{"class":314},[204,3659,779],{"class":210},[204,3661,664],{"class":210},[204,3663,3664,3666,3668,3670,3673,3675],{"class":206,"line":2063},[204,3665,3496],{"class":629},[204,3667,135],{"class":210},[204,3669,503],{"class":210},[204,3671,3672],{"class":314},"Email z HTML",[204,3674,779],{"class":210},[204,3676,664],{"class":210},[204,3678,3679,3681,3683,3685,3688,3690],{"class":206,"line":2079},[204,3680,3512],{"class":629},[204,3682,135],{"class":210},[204,3684,503],{"class":210},[204,3686,3687],{"class":314},"\u003Ch1>Witaj!\u003C\u002Fh1>\u003Cp>To jest \u003Cstrong>HTML\u003C\u002Fstrong> email.\u003C\u002Fp>",[204,3689,779],{"class":210},[204,3691,664],{"class":210},[204,3693,3694,3697,3699,3701,3703],{"class":206,"line":2090},[204,3695,3696],{"class":629},"  bodyType",[204,3698,135],{"class":210},[204,3700,503],{"class":210},[204,3702,1538],{"class":314},[204,3704,509],{"class":210},[204,3706,3707,3709],{"class":206,"line":2095},[204,3708,1296],{"class":210},[204,3710,728],{"class":228},[204,3712,3713],{"class":206,"line":2110},[204,3714,3292],{"class":314},[204,3716,3717],{"class":206,"line":2134},[204,3718,222],{"emptyLinePlaceholder":221},[204,3720,3721,3723],{"class":206,"line":2141},[204,3722,2884],{"class":210},[204,3724,3725],{"class":214},"Email z załącznikami\n",[204,3727,3728],{"class":206,"line":2153},[204,3729,222],{"emptyLinePlaceholder":221},[204,3731,3732,3734],{"class":206,"line":2169},[204,3733,3255],{"class":314},[204,3735,3405],{"class":2804},[204,3737,3738,3740,3742,3744,3746,3748],{"class":206,"line":2184},[204,3739,3637],{"class":487},[204,3741,3467],{"class":228},[204,3743,562],{"class":210},[204,3745,149],{"class":565},[204,3747,630],{"class":228},[204,3749,633],{"class":210},[204,3751,3752,3754,3756,3758,3760,3762],{"class":206,"line":2189},[204,3753,3480],{"class":629},[204,3755,135],{"class":210},[204,3757,503],{"class":210},[204,3759,3487],{"class":314},[204,3761,779],{"class":210},[204,3763,664],{"class":210},[204,3765,3766,3768,3770,3772,3775,3777],{"class":206,"line":2194},[204,3767,3496],{"class":629},[204,3769,135],{"class":210},[204,3771,503],{"class":210},[204,3773,3774],{"class":314},"Email z załącznikiem",[204,3776,779],{"class":210},[204,3778,664],{"class":210},[204,3780,3781,3783,3785,3787,3790,3792],{"class":206,"line":2199},[204,3782,3512],{"class":629},[204,3784,135],{"class":210},[204,3786,503],{"class":210},[204,3788,3789],{"class":314},"Zobacz załącznik w załączniku",[204,3791,779],{"class":210},[204,3793,664],{"class":210},[204,3795,3796,3799,3801],{"class":206,"line":2204},[204,3797,3798],{"class":629},"  attachments",[204,3800,135],{"class":210},[204,3802,1700],{"class":228},[204,3804,3805],{"class":206,"line":2209},[204,3806,3807],{"class":210},"    {\n",[204,3809,3810,3813,3815,3817,3820,3822],{"class":206,"line":2215},[204,3811,3812],{"class":629},"      name",[204,3814,135],{"class":210},[204,3816,503],{"class":210},[204,3818,3819],{"class":314},"dokument.pdf",[204,3821,779],{"class":210},[204,3823,664],{"class":210},[204,3825,3826,3829,3831,3833,3836,3838],{"class":206,"line":2234},[204,3827,3828],{"class":629},"      contentBytes",[204,3830,135],{"class":210},[204,3832,503],{"class":210},[204,3834,3835],{"class":314},"base64_encoded_file_content",[204,3837,779],{"class":210},[204,3839,664],{"class":210},[204,3841,3842,3845,3847,3849,3852],{"class":206,"line":2239},[204,3843,3844],{"class":629},"      contentType",[204,3846,135],{"class":210},[204,3848,503],{"class":210},[204,3850,3851],{"class":314},"application\u002Fpdf",[204,3853,509],{"class":210},[204,3855,3856],{"class":206,"line":2251},[204,3857,793],{"class":210},[204,3859,3860],{"class":206,"line":2258},[204,3861,3862],{"class":228},"  ]\n",[204,3864,3865,3867],{"class":206,"line":2274},[204,3866,1296],{"class":210},[204,3868,728],{"class":228},[204,3870,3871],{"class":206,"line":2286},[204,3872,3292],{"class":314},[204,3874,3875],{"class":206,"line":2291},[204,3876,222],{"emptyLinePlaceholder":221},[204,3878,3879,3881],{"class":206,"line":2296},[204,3880,2884],{"class":210},[204,3882,3883],{"class":214},"Test połączenia\n",[204,3885,3886],{"class":206,"line":2302},[204,3887,222],{"emptyLinePlaceholder":221},[204,3889,3890,3892],{"class":206,"line":2323},[204,3891,3255],{"class":314},[204,3893,3405],{"class":2804},[204,3895,3896,3898,3901,3903,3905,3907,3909,3912],{"class":206,"line":2349},[204,3897,3433],{"class":593},[204,3899,3900],{"class":228}," isConnected ",[204,3902,385],{"class":210},[204,3904,820],{"class":487},[204,3906,3467],{"class":228},[204,3908,562],{"class":210},[204,3910,3911],{"class":565},"testConnection",[204,3913,569],{"class":228},[204,3915,3916,3918,3921],{"class":206,"line":2370},[204,3917,3536],{"class":487},[204,3919,3920],{"class":228}," (isConnected) ",[204,3922,633],{"class":210},[204,3924,3925,3927,3929,3931,3933,3935,3938,3940],{"class":206,"line":2379},[204,3926,3551],{"class":228},[204,3928,562],{"class":210},[204,3930,2023],{"class":565},[204,3932,630],{"class":629},[204,3934,779],{"class":210},[204,3936,3937],{"class":314},"Połączenie z MS Graph API działa!",[204,3939,779],{"class":210},[204,3941,728],{"class":629},[204,3943,3944],{"class":206,"line":2389},[204,3945,921],{"class":210},[204,3947,3948],{"class":206,"line":2409},[204,3949,3292],{"class":314},[204,3951,3952],{"class":206,"line":2417},[204,3953,222],{"emptyLinePlaceholder":221},[204,3955,3956,3958,3960,3962,3964],{"class":206,"line":2422},[204,3957,3089],{"class":3088},[204,3959,2747],{"class":2581},[204,3961,3094],{"class":2585},[204,3963,2582],{"class":2581},[204,3965,3966],{"class":487}," Test połączenia sprawdza czy można uzyskać token dostępu z Azure AD. Nie wymaga dodatkowych uprawnień API.\n",[204,3968,3969],{"class":206,"line":2437},[204,3970,222],{"emptyLinePlaceholder":221},[204,3972,3973,3975],{"class":206,"line":2461},[204,3974,240],{"class":210},[204,3976,3977],{"class":214},"🏃 Uruchomienie testów\n",[204,3979,3980],{"class":206,"line":2468},[204,3981,222],{"emptyLinePlaceholder":221},[204,3983,3984,3986],{"class":206,"line":2473},[204,3985,3255],{"class":314},[204,3987,2805],{"class":2804},[204,3989,3990],{"class":206,"line":2478},[204,3991,3992],{"class":362},"# Uruchomienie testów\n",[204,3994,3996,3999],{"class":206,"line":3995},160,[204,3997,3998],{"class":214},"npm",[204,4000,4001],{"class":314}," start\n",[204,4003,4005],{"class":206,"line":4004},161,[204,4006,222],{"emptyLinePlaceholder":221},[204,4008,4010],{"class":206,"line":4009},162,[204,4011,4012],{"class":362},"# lub bezpośrednio\n",[204,4014,4016,4019],{"class":206,"line":4015},163,[204,4017,4018],{"class":214},"node",[204,4020,4021],{"class":314}," main.js\n",[204,4023,4025],{"class":206,"line":4024},164,[204,4026,3292],{"class":314},[204,4028,4030],{"class":206,"line":4029},165,[204,4031,222],{"emptyLinePlaceholder":221},[204,4033,4035,4037],{"class":206,"line":4034},166,[204,4036,240],{"class":210},[204,4038,4039],{"class":214},"📁 Struktura projektu\n",[204,4041,4043],{"class":206,"line":4042},167,[204,4044,222],{"emptyLinePlaceholder":221},[204,4046,4048],{"class":206,"line":4047},168,[204,4049,3292],{"class":314},[204,4051,4053],{"class":206,"line":4052},169,[204,4054,4055],{"class":2804},"exchange-mailbox-nodejs\u002F\n",[204,4057,4059],{"class":206,"line":4058},170,[204,4060,4061],{"class":2804},"├── 📄 ExchangeMailbox.js    # Główna klasa do wysyłania emaili\n",[204,4063,4065],{"class":206,"line":4064},171,[204,4066,4067],{"class":2804},"├── 📄 main.js              # Testy i przykłady użycia\n",[204,4069,4071],{"class":206,"line":4070},172,[204,4072,4073],{"class":2804},"├── 📄 package.json         # Konfiguracja NPM i zależności\n",[204,4075,4077],{"class":206,"line":4076},173,[204,4078,4079],{"class":2804},"├── 📄 .env                 # Zmienne środowiskowe (konfiguracja)\n",[204,4081,4083],{"class":206,"line":4082},174,[204,4084,4085],{"class":2804},"├── 📄 .gitignore          # Wykluczenia Git (chroni .env)\n",[204,4087,4089],{"class":206,"line":4088},175,[204,4090,4091],{"class":2804},"├── 📄 README.md           # Dokumentacja (ten plik)\n",[204,4093,4095],{"class":206,"line":4094},176,[204,4096,4097],{"class":2804},"└── 📁 .github\u002F\n",[204,4099,4101],{"class":206,"line":4100},177,[204,4102,4103],{"class":2804},"    └── 📄 copilot-instructions.md  # Instrukcje dla Copilot\n",[204,4105,4107],{"class":206,"line":4106},178,[204,4108,3292],{"class":314},[204,4110,4112],{"class":206,"line":4111},179,[204,4113,222],{"emptyLinePlaceholder":221},[204,4115,4117,4119],{"class":206,"line":4116},180,[204,4118,240],{"class":210},[204,4120,4121],{"class":214},"🔍 Rozwiązywanie problemów\n",[204,4123,4125],{"class":206,"line":4124},181,[204,4126,222],{"emptyLinePlaceholder":221},[204,4128,4130,4132],{"class":206,"line":4129},182,[204,4131,2884],{"class":210},[204,4133,4134],{"class":214},"Błędy uwierzytelniania\n",[204,4136,4138],{"class":206,"line":4137},183,[204,4139,222],{"emptyLinePlaceholder":221},[204,4141,4143,4145,4147,4150,4152],{"class":206,"line":4142},184,[204,4144,305],{"class":210},[204,4146,2747],{"class":2581},[204,4148,4149],{"class":2585},"\"Invalid client credentials\"",[204,4151,2582],{"class":2581},[204,4153,4154],{"class":228}," - sprawdź Client ID i Client Secret w pliku .env\n",[204,4156,4158,4160,4162,4165,4167],{"class":206,"line":4157},185,[204,4159,324],{"class":210},[204,4161,2747],{"class":2581},[204,4163,4164],{"class":2585},"\"Invalid tenant\"",[204,4166,2582],{"class":2581},[204,4168,4169],{"class":228}," - sprawdź Tenant ID w pliku .env\n",[204,4171,4173,4175,4177,4180,4182,4185,4187,4189,4191],{"class":206,"line":4172},186,[204,4174,333],{"class":210},[204,4176,2747],{"class":2581},[204,4178,4179],{"class":2585},"\"Insufficient privileges\"",[204,4181,2582],{"class":2581},[204,4183,4184],{"class":228}," - upewnij się że aplikacja ma uprawnienie ",[204,4186,311],{"class":210},[204,4188,3058],{"class":314},[204,4190,311],{"class":210},[204,4192,4193],{"class":228}," i zostało zatwierdzone przez administratora\n",[204,4195,4197],{"class":206,"line":4196},187,[204,4198,222],{"emptyLinePlaceholder":221},[204,4200,4202,4204],{"class":206,"line":4201},188,[204,4203,2884],{"class":210},[204,4205,4206],{"class":214},"Błędy wysyłania emaili\n",[204,4208,4210],{"class":206,"line":4209},189,[204,4211,222],{"emptyLinePlaceholder":221},[204,4213,4215,4217,4219,4222,4224],{"class":206,"line":4214},190,[204,4216,305],{"class":210},[204,4218,2747],{"class":2581},[204,4220,4221],{"class":2585},"\"User not found\"",[204,4223,2582],{"class":2581},[204,4225,4226],{"class":228}," - sprawdź czy SENDER_EMAIL to prawdziwy użytkownik w organizacji\n",[204,4228,4230,4232,4234,4237,4239],{"class":206,"line":4229},191,[204,4231,324],{"class":210},[204,4233,2747],{"class":2581},[204,4235,4236],{"class":2585},"\"Access denied\"",[204,4238,2582],{"class":2581},[204,4240,4241],{"class":228}," - sprawdź czy admin zatwierdził uprawnienia aplikacji\n",[204,4243,4245,4247,4249,4252,4254],{"class":206,"line":4244},192,[204,4246,333],{"class":210},[204,4248,2747],{"class":2581},[204,4250,4251],{"class":2585},"\"Mailbox not found\"",[204,4253,2582],{"class":2581},[204,4255,4256],{"class":228}," - upewnij się że użytkownik ma licencję Exchange Online\n",[204,4258,4260],{"class":206,"line":4259},193,[204,4261,222],{"emptyLinePlaceholder":221},[204,4263,4265,4267],{"class":206,"line":4264},194,[204,4266,2884],{"class":210},[204,4268,4269],{"class":214},"Częste problemy podczas testów\n",[204,4271,4273],{"class":206,"line":4272},195,[204,4274,222],{"emptyLinePlaceholder":221},[204,4276,4278,4280,4282,4285,4287],{"class":206,"line":4277},196,[204,4279,305],{"class":210},[204,4281,2747],{"class":2581},[204,4283,4284],{"class":2585},"\"\u002Fme request is only valid with delegated authentication flow\"",[204,4286,2582],{"class":2581},[204,4288,4289],{"class":228}," - Ten błąd jest normalny, używamy uwierzytelniania aplikacji (client credentials)\n",[204,4291,4293,4295,4297,4300,4302],{"class":206,"line":4292},197,[204,4294,324],{"class":210},[204,4296,2747],{"class":2581},[204,4298,4299],{"class":2585},"\"Insufficient privileges to complete the operation\"",[204,4301,2582],{"class":2581},[204,4303,4304],{"class":228}," - Nie jest potrzebne uprawnienie User.Read dla podstawowej funkcjonalności wysyłania emaili\n",[204,4306,4308,4310,4312,4315,4319,4322,4324],{"class":206,"line":4307},198,[204,4309,333],{"class":210},[204,4311,2747],{"class":2581},[204,4313,4314],{"class":2585},"\"TypeError: ",[204,4316,4318],{"class":4317},"synWL","\\_",[204,4320,4321],{"class":2585},"this.provider is not a function\"",[204,4323,2582],{"class":2581},[204,4325,4326],{"class":228}," - Problem z konfiguracją klienta Graph, rozwiązany w aktualnej wersji\n",[204,4328,4330],{"class":206,"line":4329},199,[204,4331,222],{"emptyLinePlaceholder":221},[204,4333,4335,4337],{"class":206,"line":4334},200,[204,4336,2884],{"class":210},[204,4338,4339],{"class":214},"Debugging\n",[204,4341,4343],{"class":206,"line":4342},201,[204,4344,222],{"emptyLinePlaceholder":221},[204,4346,4348,4350],{"class":206,"line":4347},202,[204,4349,254],{"class":210},[204,4351,4352],{"class":228}," Test połączenia sprawdza czy można uzyskać token dostępu (nie wymaga dodatkowych uprawnień)\n",[204,4354,4356,4358],{"class":206,"line":4355},203,[204,4357,254],{"class":210},[204,4359,4360],{"class":228}," Włącz szczegółowe logi błędów w konsoli aby zobaczyć dokładne komunikaty z MS Graph API\n",[204,4362,4364,4366],{"class":206,"line":4363},204,[204,4365,254],{"class":210},[204,4367,4368],{"class":228}," Sprawdź czy wszystkie zmienne środowiskowe w .env są wypełnione\n",[204,4370,4372],{"class":206,"line":4371},205,[204,4373,222],{"emptyLinePlaceholder":221},[204,4375,4377,4379],{"class":206,"line":4376},206,[204,4378,240],{"class":210},[204,4380,4381],{"class":214},"📦 Zależności\n",[204,4383,4385],{"class":206,"line":4384},207,[204,4386,222],{"emptyLinePlaceholder":221},[204,4388,4390,4392,4394,4396,4398],{"class":206,"line":4389},208,[204,4391,254],{"class":210},[204,4393,693],{"class":210},[204,4395,506],{"class":314},[204,4397,311],{"class":210},[204,4399,4400],{"class":228}," - Uwierzytelnianie Microsoft Authentication Library\n",[204,4402,4404,4406,4408,4410,4412],{"class":206,"line":4403},209,[204,4405,254],{"class":210},[204,4407,693],{"class":210},[204,4409,527],{"class":314},[204,4411,311],{"class":210},[204,4413,4414],{"class":228}," - Klient MS Graph API\n",[204,4416,4418,4420,4422,4424,4426],{"class":206,"line":4417},210,[204,4419,254],{"class":210},[204,4421,693],{"class":210},[204,4423,544],{"class":314},[204,4425,311],{"class":210},[204,4427,4428],{"class":228}," - Ładowanie zmiennych środowiskowych\n",[204,4430,4432],{"class":206,"line":4431},211,[204,4433,222],{"emptyLinePlaceholder":221},[204,4435,4437,4439],{"class":206,"line":4436},212,[204,4438,240],{"class":210},[204,4440,4441],{"class":214},"📄 Licencja\n",[204,4443,4445],{"class":206,"line":4444},213,[204,4446,222],{"emptyLinePlaceholder":221},[204,4448,4450],{"class":206,"line":4449},214,[204,4451,4452],{"class":228},"MIT License - możesz swobodnie używać, modyfikować i dystrybuować ten kod.\n",[204,4454,4456],{"class":206,"line":4455},215,[204,4457,222],{"emptyLinePlaceholder":221},[204,4459,4461,4463],{"class":206,"line":4460},216,[204,4462,240],{"class":210},[204,4464,4465],{"class":214},"🆘 Pomoc\n",[204,4467,4469],{"class":206,"line":4468},217,[204,4470,222],{"emptyLinePlaceholder":221},[204,4472,4474],{"class":206,"line":4473},218,[204,4475,4476],{"class":228},"Jeśli napotkasz problemy:\n",[204,4478,4480],{"class":206,"line":4479},219,[204,4481,222],{"emptyLinePlaceholder":221},[204,4483,4485,4487],{"class":206,"line":4484},220,[204,4486,305],{"class":210},[204,4488,4489],{"class":228}," Sprawdź konfigurację w Azure Portal\n",[204,4491,4493,4495,4498,4500,4502],{"class":206,"line":4492},221,[204,4494,324],{"class":210},[204,4496,4497],{"class":228}," Zweryfikuj zmienne środowiskowe w ",[204,4499,311],{"class":210},[204,4501,172],{"class":314},[204,4503,318],{"class":210},[204,4505,4507,4509,4512,4514,4517],{"class":206,"line":4506},222,[204,4508,333],{"class":210},[204,4510,4511],{"class":228}," Uruchom test połączenia: ",[204,4513,311],{"class":210},[204,4515,4516],{"class":314},"await mailbox.testConnection()",[204,4518,318],{"class":210},[204,4520,4522,4524],{"class":206,"line":4521},223,[204,4523,2842],{"class":210},[204,4525,4526],{"class":228}," Sprawdź logi błędów w konsoli\n",[204,4528,4530],{"class":206,"line":4529},224,[204,4531,222],{"emptyLinePlaceholder":221},[204,4533,4535],{"class":206,"line":4534},225,[204,4536,4537],{"class":228},"---\n",[204,4539,4541],{"class":206,"line":4540},226,[204,4542,222],{"emptyLinePlaceholder":221},[204,4544,4546,4548,4551],{"class":206,"line":4545},227,[204,4547,2582],{"class":2581},[204,4549,4550],{"class":2585},"📧 Miłego wysyłania emaili z ExchangeMailbox! 🚀",[204,4552,2659],{"class":2581},[4554,4555,4558],"code-preview",{"label":4556,"icon":4557},"Podgląd","i-lucide-eye",[16,4559,4560,4566,4569],{},[20,4561,4562],{},[23,4563,4565],{"href":4564},"\u002Fprevs\u002Fp0001","Podglądu pliku README.md",[4567,4568],"br",{},[4567,4570],{},[11,4572,4574],{"id":4573},"wnioski","Wnioski",[16,4576,4577,4578,4580,4581,4584,4585,4588],{},"Wygenerowany kod nie jest idealny. Klasa ",[20,4579,134],{}," może mieć zastosowanie w różnych projektach i nie powinna używać ",[108,4582,4583],{},"console.log()"," i ",[108,4586,4587],{},"console.error()",", tylko generować wyjątki w przypadku błędów krytycznych. Wyjątki można \"złapać\" w obszarach brzegowych kodu, na przykład na styku z użytkownikiem końcowym i tam wyświetlić czytelny komunikat.",[16,4590,4591,4592,4594],{},"Takie rzeczy da się oczywiście poprawić i warto to robić z użyciem agenta, który działając w już zainicjowanym kontekście, będzie trzymał się swojego stylu pracy. Na przykład: jeśli stworzył plik ",[20,4593,2508],{},", będzie go na bieżąco aktualizował.",[16,4596,4597,4598,562,4601,4603],{},"Po około 15 minutach pracy z agentem miałem już działającą metodę ",[108,4599,4600],{},"sendMail()",[4567,4602],{},"Działam dalej...",[16,4605,4606,4607,4609,4610,4613,4614,4616,4617,4584,4619,4621],{},"W pliku ",[20,4608,194],{}," dodałem sekcję ",[108,4611,4612],{},"## Rules"," instruując agenta, żeby w metodach klasy ",[20,4615,134],{}," nie używał ",[108,4618,4583],{},[108,4620,4587],{},". Napisałem kilka prompt-ów i po kilku minutach miałem gotowe metody do:",[54,4623,4624,4627,4630,4633],{},[57,4625,4626],{},"pobierania listy nieprzeczytanych wiadomości",[57,4628,4629],{},"odczytywania treści wybranej wiadomości",[57,4631,4632],{},"pobierania i zapisywania na dysku załączników z wybranej wiadomości",[57,4634,4635],{},"oznaczania i odznaczania wiadomości jako przeczytanej",[16,4637,4638],{},"Nie ma wątpliwości, że przyspieszenie pracy jest kilkukrotne, może nawet kilkunastokrotne.",[16,4640,4641,4642,4646],{},"Na ten moment nie przekonuje mnie ",[4643,4644,4645],"em",{},"vibe coding"," w stylu generowania dużej ilości kodu na raz, na przykład całej aplikacji lub wielu funkcjonalności w jednym podejściu. Praca z agentem, który w danym momencie wykonuje konkretną, dobrze opisaną pracę, daje nadzorcy możliwość szybkiej weryfikacji zarówno jakości, jak i poprawności kodu.",[4648,4649,4650],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .s6hCs, html code.shiki .s6hCs{--shiki-light:#9C3EDA;--shiki-light-font-style:italic;--shiki-default:#C792EA;--shiki-default-font-style:italic;--shiki-dark:#C792EA;--shiki-dark-font-style:italic}html pre.shiki code .sFweD, html code.shiki .sFweD{--shiki-light:#E2931D;--shiki-light-font-style:italic;--shiki-default:#FFCB6B;--shiki-default-font-style:italic;--shiki-dark:#FFCB6B;--shiki-dark-font-style:italic}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sHepR, html code.shiki .sHepR{--shiki-light:#39ADB5;--shiki-light-font-weight:bold;--shiki-default:#89DDFF;--shiki-default-font-weight:bold;--shiki-dark:#89DDFF;--shiki-dark-font-weight:bold}html pre.shiki code .so75L, html code.shiki .so75L{--shiki-light:#E53935;--shiki-light-font-weight:bold;--shiki-default:#F07178;--shiki-default-font-weight:bold;--shiki-dark:#F07178;--shiki-dark-font-weight:bold}html pre.shiki code .sJsPd, html code.shiki .sJsPd{--shiki-light:#90A4AE90;--shiki-default:#EEFFFF90;--shiki-dark:#BABED890}html pre.shiki code .sDpXG, html code.shiki .sDpXG{--shiki-light:#E53935;--shiki-light-text-decoration:underline;--shiki-default:#F07178;--shiki-default-text-decoration:underline;--shiki-dark:#F07178;--shiki-dark-text-decoration:underline}html pre.shiki code .sCNwf, html code.shiki .sCNwf{--shiki-light:#FF5370;--shiki-light-font-style:italic;--shiki-default:#FF9CAC;--shiki-default-font-style:italic;--shiki-dark:#FF9CAC;--shiki-dark-font-style:italic}html pre.shiki code .synWL, html code.shiki .synWL{--shiki-light:#90A4AE;--shiki-light-font-weight:bold;--shiki-default:#EEFFFF;--shiki-default-font-weight:bold;--shiki-dark:#BABED8;--shiki-dark-font-weight:bold}",{"title":110,"searchDepth":218,"depth":218,"links":4652},[4653,4654,4655,4656],{"id":13,"depth":218,"text":14},{"id":88,"depth":218,"text":89},{"id":182,"depth":218,"text":183},{"id":4573,"depth":218,"text":4574},"2025-10-28","GitHub Copilot pisze za mnie klasę do obsługi skrzynki pocztowej MS Exchange",false,"\u002Fpics\u002F0002.png",{"order":218},null,"\u002Fblog\u002Fai-for-coding",{"title":5,"description":4658},{"loc":4663},"blog\u002Fai-for-coding","scYd8hc6iwH2QJNPt9CodnDe3V14YDuyXBYvxFRT2AQ",[4669,4674],{"title":4670,"path":4671,"stem":4672,"description":4673,"children":-1},"Jak powstała ta strona","\u002Fblog\u002Fjak-powstala-ta-strona","blog\u002Fjak-powstala-ta-strona","Postawiłem tę stronę na świeżo udostępnionym za darmo Nuxt UI Pro.",{"title":4675,"path":4676,"stem":4677,"description":4678,"children":-1},"Dwa dni robocze, jeden działający prototyp","\u002Fblog\u002Fmakieta-nuxt-supabase","blog\u002Fmakieta-nuxt-supabase","W dwa dni robocze, z pomocą Copilot-a i MCP, zbudowałem działającą makietę aplikacji medycznej.",1780996675131]