{"id":24872,"date":"2021-10-11T10:21:09","date_gmt":"2021-10-11T08:21:09","guid":{"rendered":"https:\/\/www.smsapi.pl\/blog\/?p=24872"},"modified":"2024-01-29T14:37:09","modified_gmt":"2024-01-29T13:37:09","slug":"biblioteka-c-sms-api","status":"publish","type":"post","link":"https:\/\/www.smsapi.pl\/blog\/podstawy\/biblioteka-c-sms-api\/","title":{"rendered":"Biblioteka C#: SMS API"},"content":{"rendered":"\n<p><strong>Od podstaw: jak wys\u0142a\u0107 SMS z C#? Poznaj nasz\u0105 bibliotek\u0119 SMS API. W artykule znajdziesz przyk\u0142ady kodu, praktyczne rady, rozwi\u0105zania najcz\u0119stszych problem\u00f3w i wi\u0119cej. <\/strong><\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Czas na wprowadzenie do kolejnej biblioteki do <a href=\"https:\/\/www.smsapi.pl\/masowa-wysylka-sms\" class=\"ek-link\">masowej wysy\u0142ki SMS<\/a>! Poza poprzednio omawianymi j\u0119zykami webowymi (<a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/biblioteka-php-sms-api\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">PHP<\/a> i <a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/biblioteka-javascript-sms-api\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">JavaScript<\/a>), SMSAPI oferuje Ci te\u017c implementacj\u0119 w j\u0119zyku C#. Je\u015bli to trafia w Tw\u00f3j programistyczny gust \u2013 czytaj dalej!<\/p>\n\n\n\n<div class=\"wp-block-buttons is-content-justification-center is-layout-flex wp-container-core-buttons-is-layout-16018d1d wp-block-buttons-is-layout-flex\">\n<div class=\"wp-block-button is-style-secondary\"><a class=\"wp-block-button__link wp-element-button\" href=\"https:\/\/www.smsapi.pl\/sms-api\" target=\"_blank\" rel=\"noreferrer noopener\">Biblioteki SMS API<\/a><\/div>\n<\/div>\n\n\n\n<p>Ca\u0142y kod \u017ar\u00f3d\u0142owy jest upubliczniony na <a href=\"https:\/\/github.com\/smsapi\/smsapi-csharp-client\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">GitHubie SMSAPI<\/a>. Znajdziesz w nim dwa katalogi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>smsapi \u2013 zawiera kod produkcyjny, z kt\u00f3rego mo\u017cesz korzysta\u0107 w swojej aplikacji. Z jego wybranymi metodami zapoznasz si\u0119 poni\u017cej.<\/li>\n\n\n\n<li>smsapiTests \u2013 zawiera testy jednostkowe, korzystaj\u0105ce z frameworka MSTest. Mo\u017cesz w nim znale\u017a\u0107 przyk\u0142ady zastosowa\u0144 poszczeg\u00f3lnych metod.&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Ca\u0142a omawiana biblioteka jest implementacj\u0105 API, kt\u00f3re opisuje <a href=\"https:\/\/www.smsapi.pl\/docs\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">Dokumentacja SMSAPI<\/a>. Je\u015bli do niej zajrzysz, zapewne znajdziesz sporo analogii do obiekt\u00f3w i metod w C#. Mo\u017cesz, oczywi\u015bcie, napisa\u0107 Twoj\u0105 aplikacj\u0119 od zera w dowolnym j\u0119zyku, odwo\u0142uj\u0105c si\u0119 bezpo\u015brednio do API. Liczne tego przyk\u0142ady ilustruj\u0105 sam\u0105 Dokumentacj\u0119. Pro\u015bciej jednak jest skorzysta\u0107 z ju\u017c gotowego rozwi\u0105zania. Zaczynamy!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Na pocz\u0105tek \u2013 konto w serwisie SMSAPI<\/h2>\n\n\n\n<p>Identycznie jak w ka\u017cdym przypadku korzystania z us\u0142ug API do obs\u0142ugi SMS-\u00f3w, najpierw <a href=\"https:\/\/www.smsapi.pl\/rejestracja\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">zarejestruj si\u0119 do Panelu Klienta<\/a> i skonfiguruj konto. Potrzebne b\u0119d\u0105 nast\u0119puj\u0105ce informacje:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tw\u00f3j e-mail, has\u0142o, numer telefonu, imi\u0119 i nazwisko;<\/li>\n\n\n\n<li>dane Twojej firmy \u2013 do faktury;<\/li>\n\n\n\n<li><a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/branding-sms-skojarz-swoja-marke-z-wysylka-sms\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">pole nadawcy SMS<\/a> \u2013 nieobowi\u0105zkowe, acz przydatne;<\/li>\n\n\n\n<li>dodatkowo: adres mailowy do wysy\u0142ania faktur i numer kontaktowy do Twojej ksi\u0119gowo\u015bci.<\/li>\n<\/ul>\n\n\n\n<p>Po zweryfikowaniu konto zostanie aktywowane. Dzi\u0119ki Panelowi Klienta mo\u017cesz je do\u0142adowywa\u0107 i zacz\u0105\u0107 korzysta\u0107 z wysy\u0142ki SMS! Po wi\u0119cej szczeg\u00f3\u0142\u00f3w <a href=\"https:\/\/www.smsapi.pl\/blog\/zrob-to-sam\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">si\u0119gnij do serii SMSAPI Zr\u00f3b to sam<\/a>. Tutaj skupimy si\u0119 na programowym podej\u015bciu.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"shAymEifJ5\"><a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/zrob-to-sam-jak-utworzyc-konto-testowe\/\">Zr\u00f3b to sam #01 \u2013 Jak utworzy\u0107 konto testowe? (poradnik wideo)<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Zr\u00f3b to sam #01 \u2013 Jak utworzy\u0107 konto testowe? (poradnik wideo)&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/zrob-to-sam-jak-utworzyc-konto-testowe\/embed\/#?secret=JPyHOMyZ8S#?secret=shAymEifJ5\" data-secret=\"shAymEifJ5\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Pocz\u0105tek obs\u0142ugi kampanii SMS: konfiguracja&nbsp;<\/h2>\n\n\n\n<p class=\"language-cs\">Za kulisami omawianej Biblioteki dzia\u0142a dzia\u0142a biblioteka <code>RestSharp<\/code>, czyli klient obs\u0142uguj\u0105cy obs\u0142ug\u0119 odwo\u0142a\u0144 HTTP. U\u017cywa ona metod HTTP (GET, POST, PUT, DELETE) do ca\u0142ej komunikacji z serwerem i obs\u0142ugi <a href=\"https:\/\/www.smsapi.pl\/kampanie-sms\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">kampanii SMS<\/a>. Na szcz\u0119\u015bcie nie musisz wg\u0142\u0119bia\u0107 si\u0119 w szczeg\u00f3\u0142y, lecz tylko skorzysta\u0107 z gotowego rozwi\u0105zania. Jak rozpocz\u0105\u0107?<\/p>\n\n\n\n<p>Podobnie, jak w wi\u0119kszo\u015bci projekt\u00f3w: od inicjalizacji. Po\u0142\u0105czenie powinno zosta\u0107 autoryzowane za pomoc\u0105 tokena API. Jest to 40-znakowy ci\u0105g, kt\u00f3ry mo\u017cesz <a href=\"https:\/\/ssl.smsapi.pl\/react\/oauth\/manage\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">wygenerowa\u0107 w zak\u0142adce Tokeny API (OAuth)<\/a>, a potem wykorzysta\u0107 w Visual Studio:<\/p>\n\n\n\n<pre class=\"wp-block-code language-cpp\"><code>SMSApi.Api.IClient client = new SMSApi.Api.ClientOAuth(\"token\");<\/code><\/pre>\n\n\n\n<p class=\"language-cpp\">Obiekty <code>client<\/code> przechowuj\u0105 dane wykorzystywane p\u00f3\u017aniej w autoryzacji.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Wysy\u0142ka SMS dzi\u0119ki metodom C#<\/h2>\n\n\n\n<p>Po utworzeniu klienta dalsze dzia\u0142anie biblioteki opiera si\u0119 na fabrykach i akcjach, co przedstawia poni\u017cszy przyk\u0142ad. Nast\u0119puje tu wys\u0142anie testowej wiadomo\u015bci do jednego odbiorcy:<\/p>\n\n\n\n<pre class=\"wp-block-code language-cpp\"><code>var smsFactory = new SMSApi.Api.SMSFactory(client);\nSMSFactory.ActionSend(\"48111222333\", \"Hello world!\").Execute();<\/code><\/pre>\n\n\n\n<p class=\"language-cpp\">Tak wi\u0119c w trzech linijkach da si\u0119 zamkn\u0105\u0107 trzy podstawowe etapy prostej obs\u0142ugi SMS-\u00f3w: utworzenie klienta, utworzenie fabryki i zastosowanie odpowiedniej akcji. Po\u0142\u0105czenie z serwerem jest obs\u0142ugiwane wewn\u0105trz obiektu klasy <code>Factory<\/code>, kt\u00f3ra jest baz\u0105 dla licznych fabryk \u2013 w tym <code>SMSFactory<\/code>. Odpowiadaj\u0105 one za poszczeg\u00f3lne funkcje biblioteki. <\/p>\n\n\n\n<p class=\"language-cpp\">Za\u015b metody z klas typu Action pozwalaj\u0105 ustawia\u0107 poszczeg\u00f3lne parametry wykonywanych akcji. Wywo\u0142ania metod mo\u017cna \u0142\u0105czy\u0107 \u0142a\u0144cuchowo, rozpoczynaj\u0105c od fabryki, a ko\u0144cz\u0105c na wykonaniu (metoda <code>Execute()<\/code> z bazowej klasy wszystkich akcji). Dla przyk\u0142adu poni\u017cszy kod dzia\u0142a identycznie do poprzedniego:&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code language-cpp\"><code>var smsFactory = new SMSApi.Api.SMSFactory(client);\nvar response = SMSFactory.ActionSend()\n\t.SetTo(\"48111222333\")\n\t.SetText(\"Hello world!\")\n\t.Execute();<\/code><\/pre>\n\n\n\n<p class=\"language-cpp\">Odpowiedzi na r\u00f3\u017cne zapytania do API obs\u0142uguj\u0105 klasy z przestrzeni nazw <a href=\"https:\/\/github.com\/smsapi\/smsapi-csharp-client\/tree\/master\/smsapi\/Api\/Response\" target=\"_blank\" rel=\"noopener noreferrer nofollow\"><code>Response<\/code><\/a>. W przypadku zlecania wysy\u0142ki SMS u\u017cywany jest <code>Response.Status<\/code> (typ obiektu <code>response<\/code> z przyk\u0142adu powy\u017cej). Ma on kilka przydatnych w\u0142a\u015bciwo\u015bci. <code>Count<\/code> to liczba wys\u0142anych wiadomo\u015bci. <code>List<\/code> to lista z odpowiadaj\u0105cymi im zmiennymi, m.in.:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ID<\/code> \u2013 unikalny identyfikator w systemie SMSAPI.<\/li>\n\n\n\n<li><code>Points<\/code> \u2013 koszt wyra\u017cony w liczbie punkt\u00f3w, pobranych z Twojego konta.<\/li>\n\n\n\n<li><code>Number<\/code> \u2013 numer odbiorcy.<\/li>\n\n\n\n<li><code>Status<\/code> \u2013 stan dor\u0119czenia (patrz <a href=\"https:\/\/www.smsapi.pl\/docs\/#18-lista-statusow-doreczenia\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">lista status\u00f3w<\/a> w Dokumentacji).<\/li>\n<\/ul>\n\n\n\n<p class=\"language-cpp\">Inne w\u0142a\u015bciwo\u015bci: <code>Message<\/code>, <code>Length<\/code> oraz <code>Parts<\/code> dotycz\u0105 tre\u015bci, d\u0142ugo\u015bci i liczby cz\u0119\u015bci wysy\u0142anego tekstu.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"1qY9kwMqby\"><a href=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/system-sms-dla-firm-i-urzedow-powiadomienia-i-marketing\/\">System SMS dla firm i urz\u0119d\u00f3w: powiadomienia i marketing<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;System SMS dla firm i urz\u0119d\u00f3w: powiadomienia i marketing&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/system-sms-dla-firm-i-urzedow-powiadomienia-i-marketing\/embed\/#?secret=qrbZv7v9OV#?secret=1qY9kwMqby\" data-secret=\"1qY9kwMqby\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Masowa wysy\u0142ka SMS w kodzie C#<\/h2>\n\n\n\n<p class=\"language-cpp\">Przy prowadzeniu kampanii SMS najbardziej podstawowa funkcja to wysy\u0142ka wiadomo\u015bci do wielu odbiorc\u00f3w naraz. Pisanie osobnej wiadomo\u015bci do ka\u017cdego z Twoich klient\u00f3w by\u0142oby po prostu zbyt \u017cmudne. Dzi\u0119ki prze\u0142adowaniu metod <code>ActionSend()<\/code> i <code>SetTo()<\/code> odpowiada za to tylko drobna zmiana kodu. <\/p>\n\n\n\n<p class=\"language-cpp\">Tak wygl\u0105daj\u0105 wysy\u0142ki identycznych wiadomo\u015bci do trzech odbiorc\u00f3w na dwa sposoby: za pomoc\u0105 metody z fabryki <code>SMSFactory<\/code> oraz za pomoc\u0105 \u0142a\u0144cuchowego po\u0142\u0105czenia metod z akcji <code>SMSSend<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code language-cpp\"><code>SMSFactory.ActionSend(\n\tnew&#91;]{\"48111222333\", \"48444555666\", \"48777888999\"},\n\t\"Hello receivers!\")\n\t.Execute();\nSMSFactory.ActionSend()\n\t.SetTo(new&#91;]{\"48111222333\", \"48444555666\", \"48777888999\"})\n\t.SetText(\"Hello again receivers!\")\n\t.Execute();<\/code><\/pre>\n\n\n\n<p>W Panelu klienta zauwa\u017cysz mo\u017cliwo\u015b\u0107 tworzenia grup odbiorc\u00f3w. Biblioteka C# pozwala skorzysta\u0107 z tych\u017ce, aby upro\u015bci\u0107 zarz\u0105dzanie masow\u0105 wysy\u0142k\u0105. Przedstawia to kolejny fragment:<\/p>\n\n\n\n<pre class=\"wp-block-code language-cpp\"><code>SMSFactory.ActionSend()\n\t.SetGroup(\"Group_name\")\n\t.SetText(\"Hello group!\")\n\t.Execute();<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Automatyczne SMS w C# \u2013 dodatkowe opcje<\/h2>\n\n\n\n<p class=\"language-cpp\">Klasa <code>Action.SMSSend<\/code> posiada jeszcze kilka metod, kt\u00f3re odpowiadaj\u0105 paru przydatnym funkcj\u0105 omawianej biblioteki. Przyjrzyjmy si\u0119 trzem z nich.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Pole nadawcy SMS<\/h3>\n\n\n\n<p class=\"language-cpp\"><code>SetSender(\"sender_name\")<\/code> ustawia pole nadawcy SMS, czyli <strong>tekst wy\u015bwietlany na telefonie odbiorcy SMS zamiast numeru nadawcy<\/strong>. Mo\u017ce to by\u0107 nazwa marki lub produktu, co\u015b charakterystycznie kojarz\u0105cego si\u0119 z Twoj\u0105 firm\u0105. Prezentuje si\u0119 to lepiej, ni\u017c obcy numer telefonu. Pomaga te\u017c zwr\u00f3ci\u0107 uwag\u0119 osoby, kt\u00f3ra codziennie dostaje na telefon co najmniej kilka powiadomie\u0144. <\/p>\n\n\n\n<p class=\"language-cpp\">Pola nadawcy SMS mo\u017cesz tworzy\u0107 w Panelu klienta SMSAPI. Od strony programowej do zarz\u0105dzania nimi s\u0142u\u017cy fabryka <code>SenderFactory<\/code> oraz akcje z <a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/github.com\/smsapi\/smsapi-csharp-client\/tree\/master\/smsapi\/Api\/Action\/Sender\" target=\"_blank\" class=\"ek-link\">katalogu Api\/Action\/Sender<\/a>.&nbsp;<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Zarz\u0105dzanie nazwami nadawcy SMS w bibliotece C# SMS API<\/h4>\n\n\n\n<p class=\"language-cpp\">Nazwy nadawcy SMS mo\u017cna tworzy\u0107 w Panelu Klienta oraz zarz\u0105dza\u0107 nimi programowo. S\u0142u\u017cy do tego fabryka <code>SenderFactory<\/code> i cztery akcje: List, Add, SetDefault, Delete. Najpro\u015bciej korzysta\u0107 z nich za pomoc\u0105 metod z tej\u017ce fabryki. Poni\u017cszy przyk\u0142ad obrazuje wylistowanie wszystkich utworzonych p\u00f3l nadawcy, dodanie nowego i ustawienie go jako domy\u015blny oraz jego usuni\u0119cie.<\/p>\n\n\n\n<pre class=\"wp-block-code language-cpp\"><code>var senderFactory = new SenderFactory(client);\nvar senderNamesResp =\tsenderFactory.ActionList().Execute();\nforeach (var sender in senderNamesResp.List){\n\tSystem.Console.WriteLine(\n\t\t\"Name: \"\n\t\t+sender.Name\n\t\t+\", status: \"\n\t\t+sender.Status\n\t\t+\", dafault: \"\n\t\t+sender.Default);\n}\n\nsenderFactory.ActionAdd(\"NewSenderName\").Execute();\nsenderFactory.ActionSetDefault(\"NewSenderName\").Execute();\nsenderFactory.ActionDelete(\"NewSenderName\").Execute();<\/code><\/pre>\n\n\n\n<p>W poni\u017cszym artykule o brandingu SMS znajdziesz dalsze wskaz\u00f3wki i wymogi co do p\u00f3l nadawcy SMS. Przypomn\u0119 tu tylko, \u017ce ze wzgl\u0119d\u00f3w bezpiecze\u0144stwa ka\u017cde z nich musi zosta\u0107 zatwierdzone przez pracownika SMSAPI.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"Mkz0yp38MJ\"><a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/branding-sms-skojarz-swoja-marke-z-wysylka-sms\/\">Branding SMS \u2013 jak ustawi\u0107 nazw\u0119 nadawcy w miejsce numeru telefonu?<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Branding SMS \u2013 jak ustawi\u0107 nazw\u0119 nadawcy w miejsce numeru telefonu?&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/branding-sms-skojarz-swoja-marke-z-wysylka-sms\/embed\/#?secret=2TMy6mcaLy#?secret=Mkz0yp38MJ\" data-secret=\"Mkz0yp38MJ\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Planowanie wysy\u0142ki SMS<\/h3>\n\n\n\n<p class=\"language-cpp\">Wa\u017cn\u0105 kwesti\u0105 przy planowaniu kampanii SMS jest u\u0142o\u017cenie harmonogramu wysy\u0142ki. Moment dostarczenia powiadomienia do klienta ma wa\u017cne znaczenie dla skutecznego marketingu. <a href=\"https:\/\/www.smsapi.pl\/sms-api\" target=\"_blank\" aria-label=\"SMS API (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">SMS API<\/a> umo\u017cliwia ustawienie daty i godziny wysy\u0142ki na przysz\u0142o\u015b\u0107. Klasa <code>Action.SMSSend<\/code> robi to poprzez metod\u0119 <code>SetDateSent(DateTime data)<\/code>. Argumentem jest standardowy obiekt <code>System.DateTime<\/code>. Poni\u017cszy kod wy\u015ble SMS 30.09.2021, o 16:30:00.<\/p>\n\n\n\n<pre class=\"wp-block-code language-cpp\"><code>DateTime sendDate = new DateTime(2021, 9, 30,\n\t16, 30, 0,\n\tDateTimeKind.Local);\nvar sendResult = SMSFactory.ActionSend()\n\t.SetTo(\"48111222333\")\n\t.SetText(\"Hello in the future!\")\n\t.SetDateSent(sendDate)\n\t.Execute();<\/code><\/pre>\n\n\n\n<p class=\"language-cpp\">W razie zmiany plan\u00f3w zaplanowan\u0105 wysy\u0142k\u0119 mo\u017cna anulowa\u0107 za pomoc\u0105 akcji <code>SMSDelete<\/code>. Potrzebny jest do tego unikalny identyfikator SMS-a z systemu, zawarty w odpowiedzi na jego wys\u0142anie. Kontynuuj\u0105c poprzedni kod, mo\u017ce to wygl\u0105da\u0107 tak:<\/p>\n\n\n\n<pre class=\"wp-block-code language-cpp\"><code>SMSFactory.ActionDelete(sendResult.List&#91;0].ID);<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Wi\u0119cej na temat planowania wysy\u0142ek SMS<\/h4>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"6DxSx4VxxV\"><a href=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/czas-sie-liczy-jak-wybrac-odpowiedni-moment-na-wysylke-sms\/\">Czas si\u0119 liczy! Jak wybra\u0107 odpowiedni moment na wysy\u0142k\u0119 SMS?<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Czas si\u0119 liczy! Jak wybra\u0107 odpowiedni moment na wysy\u0142k\u0119 SMS?&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/wiedza\/czas-sie-liczy-jak-wybrac-odpowiedni-moment-na-wysylke-sms\/embed\/#?secret=jcM8L2ftog#?secret=6DxSx4VxxV\" data-secret=\"6DxSx4VxxV\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Personalizacja tre\u015bci SMS<\/h3>\n\n\n\n<p>Aby zrobi\u0107 na odbiorcy dobre wra\u017cenie, warto potraktowa\u0107 go indywidualnie. W tre\u015bci SMS mo\u017ce oznacza\u0107 to np. zwrot do kogo\u015b po imieniu. Nie oznacza to, \u017ce potrzeba pisa\u0107 r\u0119cznie tre\u015b\u0107 ka\u017cdego powiadomienia do ka\u017cdego odbiorcy z osobna. <\/p>\n\n\n\n<p class=\"language-cpp\">Zamiast tego mo\u017cesz <a href=\"https:\/\/www.smsapi.pl\/personalizacja\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">spersonalizowa\u0107 tre\u015bci wiadomo\u015bci<\/a> u\u017cywaj\u0105c parametr\u00f3w. API umo\u017cliwia skorzystanie maksymalnie z 4 parametr\u00f3w, oznaczanych w tre\u015bci za pomoc\u0105 specjalnych ci\u0105g\u00f3w znak\u00f3w: [%1%], [%2%], [%3%] oraz [%4%]. W poszczeg\u00f3lnych wiadomo\u015bciach b\u0119d\u0105 one zast\u0119powane tekstami, podawanymi do metody <code>SetParam(int i, string text)<\/code>. Przedstawia to przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-code language-cpp\"><code>SMSFactory.ActionSend()\n\t.SetTo(\"48111222333\", \"48444555666\")\n\t.SetText(\"Hello &#91;%1%], your number is &#91;%2%]!\")\n\t.SetParam(0,&#91;\"Adam\", \"Bert\"])\n\t.SetParam(1,&#91;\"11\", \"22\"])\n\t.Execute();<\/code><\/pre>\n\n\n\n<p>Dwie wiadomo\u015bci b\u0119d\u0105 mia\u0142y tre\u015bci:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\"Hello Adam, your number is 11!\"<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code>\"Hello Bert, your number is 22!\"<\/code><\/pre>\n\n\n\n<p>Za pomoc\u0105 podobnie konstruowanych ci\u0105g\u00f3w specjalnych mo\u017cesz wykorzysta\u0107 informacje z bazy kontakt\u00f3w. Pozwala to personalizowa\u0107 wiadomo\u015bci bez umieszczania warto\u015bci parametr\u00f3w w kodzie. Na przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-code language-cpp\"><code>SMSFactory.ActionSend()\n\t.SetTo(\"48111222333\", \"48444555666\")\n\t.SetText(\"Hello &#91;%imie%], your number is &#91;%1%]!\")\n\t.SetParam(0,&#91;\"11\", \"22\"])\n\t.Execute();<\/code><\/pre>\n\n\n\n<p>Pole [%imie%] zostanie zamienione na odpowiedni\u0105 warto\u015b\u0107, przypisan\u0105 do danego kontaktu. Lista standardowych p\u00f3l znajduje si\u0119 w <a href=\"https:\/\/www.smsapi.pl\/docs\/#sms-do-grupy-z-bazy-kontaktow\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">dokumentacji masowego wysy\u0142ania SMS<\/a>.&nbsp;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Obs\u0142uga b\u0142\u0119d\u00f3w wysy\u0142ki SMS \u2013 gdy nie wszystko idzie g\u0142adko<\/h2>\n\n\n\n<p>Jak \u0142atwo zgadn\u0105\u0107, b\u0142\u0119dy w bibliotece C# s\u0105 obs\u0142ugiwane poprzez rzucanie wyj\u0105tkami. Biblioteka definiuje kilka typ\u00f3w wyj\u0105tk\u00f3w. Zawieraj\u0105 one wiadomo\u015b\u0107 i kod b\u0142\u0119du. List\u0119 kod\u00f3w z opisami znajdziesz w odpowiedniej <a href=\"https:\/\/www.smsapi.pl\/docs\/#19-kody-bledow\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">sekcji Dokumentacji<\/a>. W konsoli Visual Studio mo\u017cesz mo\u017cesz spodziewa\u0107 si\u0119 nast\u0119puj\u0105cych wyj\u0105tk\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>ActionException<\/code> \u2013 r\u00f3\u017cne b\u0142\u0119dy poszczeg\u00f3lnych akcji. Na przyk\u0142ad kod 11 oznacza zbyt d\u0142ug\u0105 lub brak wiadomo\u015bci; 13 to niepoprawny numer odbiorcy; 14 \u2013 b\u0142\u0119dne pole nadawcy; 26 \u2013 za d\u0142ugi temat wiadomo\u015bci.<\/li>\n\n\n\n<li><code>ClientExceptin<\/code> \u2013 b\u0142\u0119dy klienta HTTP. Kody to m.in. 101 (b\u0142\u0119dny token), 103 (za ma\u0142o punkt\u00f3w na koncie), 105 (b\u0142\u0119dny adres IP).&nbsp;<\/li>\n\n\n\n<li><code>HostException<\/code> \u2013 b\u0142\u0119dy po stronie serwera. Przyk\u0142adowe kody to 8 (b\u0142\u0105d w odwo\u0142aniu) i 201 (wewn\u0119trzny b\u0142\u0105d systemu).<\/li>\n\n\n\n<li><code>ProxyException<\/code> \u2013 dotycz\u0105 nie SMSAPI, ale po\u0142\u0105czenia z serwerem, dlatego nie zawieraj\u0105 kodu. Ten wyj\u0105tek jest rzucany w reakcji na wyj\u0105tek Net.WebException.&nbsp;<\/li>\n\n\n\n<li><code>ArgumentException<\/code> \u2013 tym razem to wyj\u0105tek z przestrzeni System j\u0119zyka C#. Jest rzucany, gdy pr\u00f3bujesz wys\u0142a\u0107 pust\u0105 wiadomo\u015b\u0107 lub odbiorc\u0105 jest jednocze\u015bnie grupa i pojedynczy numer (parametry To oraz Group wykluczaj\u0105 si\u0119).<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Inne mo\u017cliwo\u015bci biblioteki C# SMS API<\/h2>\n\n\n\n<p class=\"language-cpp\">Wraz z rozwojem biznesu najprawdopodobniej b\u0119dziesz r\u00f3wnie\u017c poszerza\u0107 list\u0119 odbiorc\u00f3w Twoich <a href=\"https:\/\/www.smsapi.pl\/powiadomienia-sms\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">powiadomie\u0144 SMS<\/a> i kampanii marketingowych.<\/p>\n\n\n\n<figure class=\"wp-block-embed is-type-wp-embed is-provider-blog-smsapi wp-block-embed-blog-smsapi\"><div class=\"wp-block-embed__wrapper\">\n<blockquote class=\"wp-embedded-content\" data-secret=\"jkPf60wqDO\"><a href=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/zrob-to-sam-budowanie-bazy-odbiorcow\/\">Zr\u00f3b to sam #07 \u2013 Budowanie w\u0142asnej bazy odbiorc\u00f3w (poradnik wideo)<\/a><\/blockquote><iframe loading=\"lazy\" class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" style=\"position: absolute; clip: rect(1px, 1px, 1px, 1px);\" title=\"&#8222;Zr\u00f3b to sam #07 \u2013 Budowanie w\u0142asnej bazy odbiorc\u00f3w (poradnik wideo)&#8221; &#8212; Blog SMSAPI\" src=\"https:\/\/www.smsapi.pl\/blog\/podstawy\/zrob-to-sam-budowanie-bazy-odbiorcow\/embed\/#?secret=HxSRADefVq#?secret=jkPf60wqDO\" data-secret=\"jkPf60wqDO\" width=\"600\" height=\"338\" frameborder=\"0\" marginwidth=\"0\" marginheight=\"0\" scrolling=\"no\"><\/iframe>\n<\/div><\/figure>\n\n\n\n<p class=\"language-cpp\">Mo\u017cesz zarz\u0105dza\u0107 ni\u0105 r\u0119cznie w panelu Klienta oraz programowo dzi\u0119ki fabryce <a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/github.com\/smsapi\/smsapi-csharp-client\/blob\/master\/smsapi\/Api\/ContactsFactory.cs\" target=\"_blank\" class=\"ek-link\"><code>ContactsFactory<\/code><\/a>. Udost\u0119pnia ona liczne akcje, kt\u00f3re s\u0142u\u017c\u0105 do listowania, tworzenia, edycji oraz usuwania zar\u00f3wno kontakt\u00f3w (oraz ich poszczeg\u00f3lnych p\u00f3l), jak i ich grup. Otw\u00f3rz w Visual Studio katalogi <a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/github.com\/smsapi\/smsapi-csharp-client\/tree\/master\/smsapi\/Api\/Action\/Contacts\" target=\"_blank\">Action\/Contacts<\/a> i <a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/github.com\/smsapi\/smsapi-csharp-client\/tree\/master\/smsapiTests\/Contacts\" target=\"_blank\" class=\"ek-link\">smsapiTests\/Contacts<\/a>, aby szczeg\u00f3\u0142owo si\u0119 z nimi zapozna\u0107.<\/p>\n\n\n\n<p class=\"language-cpp\">Poza SMS-ami warto pami\u0119ta\u0107 jeszcze o multimedialnych MMS. Biblioteka wspiera ich wysy\u0142anie dzi\u0119ki fabryce <a rel=\"noopener noreferrer nofollow\" href=\"https:\/\/github.com\/smsapi\/smsapi-csharp-client\/blob\/master\/smsapi\/Api\/MMSFactory.cs\" target=\"_blank\" class=\"ek-link\"><code>MMSFactory<\/code><\/a>. Sama wysy\u0142ka jest bardzo zbli\u017cona do obs\u0142ugi SMS-\u00f3w. Tak samo mo\u017cesz ustawi\u0107 odbiorc\u0119\/-\u00f3w i czas wys\u0142ania, odpowied\u017a te\u017c jest tego samego typu <code>Response.Status<\/code>. Zawarto\u015b\u0107 to oczywi\u015bcie nie jest zwyk\u0142y tekst, ale tre\u015b\u0107 w XML-owym formacie SMIL, kt\u00f3r\u0105 musisz najpierw poprawnie sformatowa\u0107.<\/p>\n\n\n\n<p>Mam nadziej\u0119, \u017ce teraz masz ju\u017c poj\u0119cie, jak za pomoc\u0105 program\u00f3w w C# mo\u017cesz prowadzi\u0107 kampanie SMS-owe. Je\u015bli masz w\u0105tpliwo\u015bci co do sposob\u00f3w u\u017cycia poszczeg\u00f3lnych metod, najpierw prze\u015bled\u017a przyk\u0142ady ich wykorzystania w <a href=\"https:\/\/github.com\/smsapi\/smsapi-csharp-client\/tree\/master\/smsapiTests\" target=\"_blank\" rel=\"noopener noreferrer nofollow\">katalogu test\u00f3w<\/a>. Wyja\u015bnienia i fragmenty program\u00f3w s\u0105 te\u017c w szczeg\u00f3\u0142owej <a href=\"https:\/\/www.smsapi.pl\/docs\/\">dokumentacji API<\/a>. Powodzenia!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Od podstaw: jak wys\u0142a\u0107 SMS z C#? Poznaj nasz\u0105 bibliotek\u0119 SMS API. W artykule znajdziesz przyk\u0142ady kodu, praktyczne rady, rozwi\u0105zania najcz\u0119stszych problem\u00f3w i wi\u0119cej.<\/p>\n","protected":false},"author":3,"featured_media":24881,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[321],"tags":[315,230,223],"class_list":["post-24872","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-podstawy","tag-biblioteka","tag-it","tag-api"],"_links":{"self":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts\/24872","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/comments?post=24872"}],"version-history":[{"count":46,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts\/24872\/revisions"}],"predecessor-version":[{"id":30059,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/posts\/24872\/revisions\/30059"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/media\/24881"}],"wp:attachment":[{"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/media?parent=24872"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/categories?post=24872"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.smsapi.pl\/blog\/wp-json\/wp\/v2\/tags?post=24872"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}