🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

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
#345812
Author: Ryszard
Date: Mon, 22 May 2017 10:18
70 lines
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
#345813
Author: mmm
Date: Mon, 22 May 2017 11:05
11 lines
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
#345814
Author: Ryszard
Date: Mon, 22 May 2017 15:27
47 lines
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
#345815
Author: Ryszard
Date: Mon, 22 May 2017 21:15
3 lines
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
#345816
Author: Ryszard
Date: Thu, 25 May 2017 17:39
34 lines
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
#345817
Author: mmm
Date: Fri, 26 May 2017 12:56
10 lines
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
#345818
Author: Ryszard
Date: Sat, 27 May 2017 06:31
79 lines
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