Thread View: pl.comp.lang.delphi
7 messages
7 total messages
Started by Ryszard
Mon, 22 May 2017 10:18
RestClient, API i wysyłanie POST ze złożonym parametrem
Author: Ryszard
Date: Mon, 22 May 2017 10:18
Date: Mon, 22 May 2017 10:18
70 lines
3882 bytes
3882 bytes
witam
potrzebuję pomocy przy integracji aplikacji w Delphi 10 z aplikacja webową poprzez jej API, chodzi konkretnie o EmailLabs.pl i funkcje przy pomocy której można zlecić maila do wysłania
udało mi się już obsłużyć część funkcje API przy wykorzystaniu komponentów:
RESTClient
RESTRequest
RESTResponse
HTTPBasicAuthenticator
ale te funkcje miały dość prostą strukturę parametrów które poprzez POST wysyłałem na serwer
natomiast funkcja do wysyłania maili /api/new_sendmail ( http://docs.emaillabs.pl/api/wysylka-wiadomosci-e-mail-2/ ) ma bardziej złożoną budowę struktury parametrów i tu mam problem. Wygląda to mniej więcej tak:
[
'to' => [
'test01@domein.pl' => [
'message_id' => 'test001@domain.com',
'reciver_name' => 'Jan Kowalski'
],
'test02@domein.pl' => [
'message_id' => 'test002@domain.com',
'reciver_name' => 'Janusz Nowak'
]
],
'smtp_account' => '1.smtpaccount.smtp',
'subject' => 'Message subject',
'html' => '<p>Some Html</p> <img src="cid:image_2.jpg"/>',
'text' => 'Some Text',
'from' => 'from_address@domain.com',
'from_name' => 'Office',
'headers' => [
'x-header-1' => 'test-1',
'x-header-2' => 'test-2'
],
'cc' => 'cc_address@domain.com',
'cc_name' => 'Wojciech Kowalski',
'bcc' => 'bcc_address@domain.com',
'bcc_name' => 'Adam Nowak',
'reply_to' => 'reply@domain.com',
'tags' => [
'tag_1', 'tag_2'
],
'files' => [
'0' => [
'name' => 'image_1.jpg',
'mime' => 'image/jpeg',
'content' => 'some_file_content_in_base_64'
],
'1' => [
'name' => 'image_2.jpg',
'mime' => 'image/jpeg',
'content' => 'some_file_content_in_base_64',
'inline' => 1
],
]
];
i zupełnie nie wiem jak zapisać taką wartość parametru która sama jest tablicą i potem ja przesłać postem do tej funkcji
w sieci znalazłem kilka wątków w których sugerowano zapisać takie parametry w json i wysłać jako json ale nie jestem pewien czy to API obsługuje w ogóle JSON bo w opisie nie mam na ten temat ani słowa. Wynik wywyołania jest tylko zwracany w json
Czy ktoś z Was może mi pomóc, naprowadzić jak zrealizować taką funkcjonalność
z góry dziękuję za pomoc
pozdrawiam
R
Re: RestClient, API i wysyłanie POST ze złożonym parametrem
Author: mmm
Date: Mon, 22 May 2017 11:05
Date: Mon, 22 May 2017 11:05
11 lines
1359 bytes
1359 bytes
> Czy ktoś z Was może mi pomóc, naprowadzić jak zrealizować taką funkcjonalność Obejrzyj przykład PHP masz tam funkcję "http_build_query" np. na tej stronie http://http_build_query.onlinephpfunctions.com/ sprawdz co jest wynikiem funkcji dla Twoich danych :) To powinno pomóc jak wyglądają tablice w POST :D M
Re: RestClient, API i wysyłanie POST ze złożonym parametrem
Author: Ryszard
Date: Mon, 22 May 2017 15:27
Date: Mon, 22 May 2017 15:27
47 lines
2900 bytes
2900 bytes
dziękuje za sugestie
wykonałem ten przykładowy skrypt dla danych:
[
'to' => [
'test01@domein.pl' => [
'message_id' => 'test001@domain.com',
'reciver_name' => 'Jan Kowalski'
],
'test02@domein.pl' => [
'message_id' => 'test002@domain.com',
'reciver_name' => 'Janusz Nowak'
]
],
'smtp_account' => '1.smtpaccount.smtp',
'subject' => 'Test',
'html' => '<p>Some HTML....</p>',
'from' => 'from_address@domain.com',
'from_name' => 'Office'
]
];
czyli
$data = array(
'to' => array(
'test01@domein.pl' => array(
'message_id' => $i.microtime().'@domain.com'
),
'test02@domein.pl' => array(
'message_id' => $i.microtime().'@domain.com'
),
),
'smtp_account' => '1.smtpaccount.smtp',
'subject' => 'Test',
'html' => '<p>Some HTML....</p>',
'from' => 'from_address@domain.com',
'from_name' => 'Office',
);
wynikiem wykonania funkcji http_build_query( $data ) jest:
to%5Btest01%40domein.pl%5D%5Bmessage_id%5D=0.14756300+1495466398%40domain.com&to%5Btest02%40domein.pl%5D%5Bmessage_id%5D=0.14758000+1495466398%40domain.com&smtp_account=1.smtpaccount.smtp&subject=Test&html=%3Cp%3ESome+HTML....%3C%2Fp%3E&from=from_address%40domain.com&from_name=Office
tu już coś widać ale martwi mnie to kodowanie, no i zastanawiam się czy można to tak wprost potraktować jako szablon, zmieniając tylko adresy email, treść itd
Re: RestClient, API i wysyłanie POST ze złożonym parametrem
Author: Ryszard
Date: Mon, 22 May 2017 21:15
Date: Mon, 22 May 2017 21:15
3 lines
1688 bytes
1688 bytes
rozkodowałem jeszcze ten parametr i teraz wygląda czytelnie to[test01@domein.pll][message_id]=0.14756300 1495466398@domain.com&to[test02@domein.pl][message_id]=0.14758000 1495466398@domain.com&smtp_account=1.smtpaccount.smtp&subject=Test&html=<p>Some HTML....</p>&from=from_address@domain.com&from_name=Office
Re: RestClient, API i wysyłanie POST ze złożonym parametrem
Author: Ryszard
Date: Thu, 25 May 2017 17:39
Date: Thu, 25 May 2017 17:39
34 lines
2760 bytes
2760 bytes
samo wysyłanie maili poprzez API działa ale mam jeszcze problem z załącznikami typu pliki png lub jpeg
jako jeden z parametrów API jest wysłanie pliku zakodowanego base64
plik koduje taką funkcją:
function EncodeFile(const FileName: string): AnsiString;
var
stream: TMemoryStream;
begin
stream := TMemoryStream.Create;
try
stream.LoadFromFile(Filename);
result:=TNetEncoding.Base64.EncodeBytesToString(Stream.Memory, Stream.Size);
finally
stream.Free;
end;
end;
po odbiorze tak przygotowanego maila widać dołączone do niego pliki ale są nieczytelne, podczas podglądu system sygnalizuje uszkodzenie
próbowałem takie same pliki zakodować i wysłać za pomocą skryptu PHP, i mail wysłany w ten sposób przychodzi z prawidłowymi załącznikami, są do odczytu
podejrzałem źródła obu maili oraz zawartość zakodowanych plików poprzez Delphi i php i wygląda na to że się różnią
Wygląda na to że zakodowanie pliku w Delphi jest nieprawidłowe
Uważacie że ten sposób kodowanie base64 który zastosowałem jest zły?
Czy znacie jakiś inny sposób kodowania base64 tak aby był zgodny z tym z php?
z góry dziękuję za sugestie
Re: RestClient, API i wysyłanie POST ze złożonym parametrem
Author: mmm
Date: Fri, 26 May 2017 12:56
Date: Fri, 26 May 2017 12:56
10 lines
1489 bytes
1489 bytes
> Czy znacie jakiś inny sposób kodowania base64 tak aby był zgodny z tym z php? > > z góry dziękuję za sugestie > Musiał byś przesłać kompletny program :) Bo ma moje oko to Delphi generuje OK i PHP taki sam wynik zwraca. Moze masz problem gdzieś wczesniej ? M
Re: RestClient, API i wysyłanie POST ze złożonym parametrem
Author: Ryszard
Date: Sat, 27 May 2017 06:31
Date: Sat, 27 May 2017 06:31
79 lines
4491 bytes
4491 bytes
jak pisałem wcześniej cały program jest oparty na 4 komponentach i po dodaniu parametrów: temat, treść html, odbiorca wiadomości, załączniki, wysyłane są postem:
function EncodeFile(const FileName: string): AnsiString;
var
stream: TMemoryStream;
begin
stream := TMemoryStream.Create;
try
stream.LoadFromFile(Filename);
result := TNetEncoding.Base64.EncodeBytesToString(Stream.Memory, Stream.Size);
finally
stream.Free;
end;
end;
procedure TForm1.Button9Click(Sender: TObject);
var
jValue:TJSONValue;
begin
try
MemoContent.Lines.Clear;
RESTRequest5.Params[2].Value:='Temat wiadomości';
RESTRequest5.Params[3].Value:=TNetEncoding.URL.Encode('<p>Jeszcze więcej Some HTML..<BR>ĄŻŚŹĆŃŁÓĘ<BR>ążśźćńłóę<BR>.ąść</p>');
with RESTRequest5.Params.AddItem() do
begin
Name:='to[adres_email_odbiorcy_1@wp.pl][message_id]=0.49443700 1495599985@domain.com&to[adres_email_odbiorcy_1@wp.pl][reciver_name]';
Value:='Imie Nazwisko';
Kind:='pkGETorPOST';
end;
with RESTRequest5.Params.AddItem() do
begin
Name:='to[adres_email_odbiorcy_2@wp.pl][message_id]=0.49443700 1495599985@domain.com&to[adres_email_odbiorcy_2@wp.pl][reciver_name]';
Value:='Imie Nazwisko';
Kind:='pkGETorPOST';
end;
with RESTRequest5.Params.AddItem() do
begin
Name:='files[0][name]=plik01.png&files[0][mime]=image/png&files[0][inline]=plik01.png&files[0][content]';
Value:=EncodeFile('D:\pliki\html\newsletter\plik01.png');
Kind:='pkGETorPOST';
Options := [poDoNotEncode];
end;
with RESTRequest5.Params.AddItem() do
begin
Name:='files[1][name]=plik02.png&files[1][mime]=image/png&files[1][inline]=plik02.png&files[1][content]';
Value:=EncodeFile('D:\pliki\html\newsletter\plik02.png');
Kind:='pkGETorPOST';
Options := [poDoNotEncode];
end;
with RESTRequest5.Params.AddItem() do
begin
Name:='files[2][name]=plik03.png&files[2][mime]=image/png&files[2][inline]=plik03.png&files[2][content]';
Value:=EncodeFile('D:\pliki\html\newsletter\plik03.png');
Kind:='pkGETorPOST';
Options := [poDoNotEncode];
end;
RESTRequest5.Execute;
jValue:=RESTResponse5.JSONValue;
MemoContent.Lines.Add(jValue.ToString);
MemoContent.Lines.Add(RESTResponse5.Content);
MemoContent.Lines.Add(RESTResponse5.StatusCode.ToString + ' ' + RESTResponse5.StatusText);
except
on e: Exception do MemoContent.Lines.Add(e.Message);
end;
end;
mogę ci podesłać cały ten projekcik jak chcesz, ale to już chyba mailem
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads