Synapse - łączenie ze skrzynką pocztową

0

Witam, chciałem zacząć pracować z Synapse bo stwierdziłem (i chyba słusznie), że Indy już wymiera ze względu na to, że jest przestarzałe.

Otóż chciałem napisać program, który zaloguje się na pocztę np gmail (przez IMAP lub też przez HTTP co by było najlepsze) i będzie odczytywał każdą wiadomość w celu znalezienia czegoś (po przez pobranie źródła strony tak, jakbyśmy to robili przez przeglądarkę) - taka wyszukiwarka.

Nie chcę pobierać poczty przez POP bo nie będę mógł pobrać np adresu załącznika (nie mylić z pobieraniem załącznika) a to mi by było potrzebne.

Z wysyłaniem poczty nie miałem problemów ale tego nie wiem jak rozwiązać :/ i czy w ogóle da się tak... a w demo też nic o tym nie znalazłem.
Proszę serdecznie o pomoc

0

Pisałem tylko program który śle email z załącznikiem pod wskazane adresy i o podanym temacie oraz treści. Jednak jeżeli chcesz zrobić logowanie przez http://www.regexpstudio.com/tregexpr/tregexpr.htmlay32.dll ze strony Synapse, bo gmail używa SSL i musisz też dołączyć moduł ssl_openssl do uses. Co do logowania to polecam spróbować zrobić jak ja zrobiłem analizując logowanie na FaceBooka, ktore jest po SSL'u, także pod snifferem (polecam WireShark, jak go używać dowiesz się z tutoriali video na YouTube - linki są na stronie programu, o ile kojarze, bo ostatnio ściągałem wersję 64 bitową pod nowszy Windows 7) nie zobaczysz za wiele. Ja zrobiłem tak. Pobrałem kod strony lgoowania do htmla z pod Opery (lub innej przeglądarki jeśli używasz). Nastepnie w zapisanym pliku html zmieniłem adres logowania dla przycisku z http://www.regexpstudio.com/tregexpr/tregexpr.html otwartym pod przeglądarką zmienionym plikiem html, a pod WireSharkiem widziałem na 100% co jest wysylane pakietem. To samo musisz wysłać metodą POST z pod Synapse tylko, że pod adres zaczynający się od http://www.regexpstudio.com/tregexpr/tregexpr.htmlykłądy na google powinieneś jakieś znaleźć lub w demach w archiwum z Synapse, a jak coś to jest zawsze dokumentacja. A później trzeba zobaczyć jakie strony śa na gmailu odwiedzane aby sprawdzić emaile i co jest w nich zwracane. Tylko pewnie pobierając plik załącznika o ile ma on osobny url na pewno będą Ci potrzebne odpowiednie ciasteczka. Ale to musisz pokombinować dalej sam. Do parsowania większego kodu html strony i wydobycia większej ilości danych polecam wyrażenia regularne i moduł z http://www.regexpstudio.com/tregexpr/tregexpr.html

0

Ok, już wiem jak dostać np te adresy załączników.
Teraz tylko potrzebuje logowania.
Może jakieś przykłady z tego twojego facebookowego programu?

0

Dobra to niech będzie podam, może komuś się przyda. Ale nie polecam się sugerować za bardzo tym kodem do facebooka, bo każda strona potrzebuje na ogół innych danych oraz inaczej może przebiegać logowanie. Problem w tym, że facebook przez zalogowaniem wymaga jeszcze odpowiednich ciasteczek i żeby je mieć trzeba odwiedzić pobierając najpierw stronę logowania. Poniższy kod wykonuje się w wątku i pochodzi z mojej aplikacji do pobierania zdjęć z galerii własnych znajomych. Początkowo chcialem pisać aplikację z użyciem API FaceBooka, ale nie zdalo to rezultatów, bo nie mogłem pobrać łatwo listy znajomych. Wycwaniłem się więc - nazwijmy to tak :) I pobrałem tymczasowy token potrzebny do pobierania listy znajomych w postaci pliku podobnego do xmla czy tam csv, z kodu strony dla developerów dostępnej po zalogowaniu. Można na niej zobaczyć jak wyglądają takie pliki tekstowe. Poniżej wycinki najważniejszego kodu, bo będąc zalogowanym, pobieranie danych o galerii użytkownika i później fotkach to już zwykle tylko pobieranie oraz parsowanie strony wyrażeniami regularnymi. Najprostrze dane z pomiędzy dwóch tagów występujące tylko raz są wyciągane przy użyciu funkcji SimpleParse, której autorem jest Misiekd i kiedyś podesłal mi to w innym kodzie. Natomiast SynHttp to oczywiście THttpSend, a zmienne FUrl i podobne są typu string. Mam nadzieję, że na coś się to Tobie przyda. Ale zrób z WireSharkiem jak pisałem i przeanalizuj pakiety do metody POST kiedy połączenie nie jest szyfrowane po zmianie kodu html na dysku. Wiem też, że pobranie adresu do przekierowania można zrobić inaczej, ale ja zrobilem to w pętli tak jak widać poniżej i już tak się przyzwyczaiłem.

//...
const
  Base_Url = 'http://www.facebook.com/';
  Base_Url_SSL = 'https://www.facebook.com/';
  Graph_Url_SSL = 'https://graph.facebook.com/';
//...
const
  Redir_C = 'Location: ';
  Default_MimeType = 'application/x-www-form-urlencoded';
  ColorsArray : array[boolean] of TColor = (clInactiveBorder, clWindow);
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.7.62 Version/11.01';
//...
function SimpleParse(StrBegin, StrEnd, Str : string) : string;
var
  B, E : integer;
begin
  Result := '';
  if StrBegin = '' then
  begin
    B := 1;
  end
  else
  begin
    B := Pos(StrBegin, Str);
  end;
  if B > 0 then
  begin
    Str := Copy(Str, B + Length(StrBegin), MaxInt);
    if StrEnd = '' then
    begin
      E := Length(Str) + 1;
    end
    else
    begin
      E := Pos(StrEnd, Str);
    end;
    if E > 0 then
    begin
      Result := Copy(Str, 1, E - 1);
    end;
  end;
end;
//...
procedure TMainForm.LoginBtnClick(Sender : TObject);
begin
  AlreadyLogged := True;
  AUser := UserEmailEdit.Text;
  APass := PasswordEdit.Text;
  SetLVControlsAvailable(False, True);
  if SynHttp = nil then
  begin
    SynHttp := THttpSend.Create;
    with SynHttp do
    begin
      KeepAlive := True;
      Protocol := '1.1';
      MimeType := Default_MimeType;
      UserAgent := Opera_UserAgent;
    end;
  end;
  LoginThr := TLoginThr.Create(False);
end;
// ...
function TMainForm.Logon(UserEmail, UserPassword : string) : boolean;
const
  Developers_Url = 'https://developers.facebook.com';
  ACharset_Test = '%E2%82%AC%2C%C2%B4%2C%E2%82%AC%2C%C2%B4%2C%E6%B0%B4%2C%D0%94%2C%D0%84';
  Error_Text1 = 'Nieprawidłowy adres e-mail';
  Error_Text2 = 'Nieprawidłowa nazwa użytkownika';
  Error_Text3 = 'Wprowadzone hasło jest nieprawidłowe';
  Error_Text4 = 'Wykryto wielokrotne próby zalogowania się do Twojego konta';
var
  RedirUrl : string;
  I, RedirPos : integer;
begin
  Result := False;
  with SynHttp do
  begin
    Headers.Clear;
    Document.Clear;
    FUrl := Base_Url_SSL + 'index.php';
    HTTPMethod('GET', FUrl);
    Headers.Clear;
    FUrl := Base_Url_SSL + 'login.php?login_attempt=1';
    FStrData := 'charset_test=' + ACharset_Test + '&locale=pl_PL' +
      '&email=' + UserEMail + '&pass=' + UserPassword +
      '&default_persistent=0&charset_test=' + ACharset_Test;
    Document.Write(PChar(FStrData)^, Length(FStrData));
    HTTPMethod('POST', FUrl);
    SetLength(FPage, Document.Size);
    Document.Read(PChar(FPage)^, Length(FPage));
    FPage := UTF8ToAnsi(FPage);
    if Pos(Error_Text1, FPage) > 0 then
    begin
      AlreadyLogged := Result;
      SetFocusToEditFields(UserEmailEdit);
      MessageBox(Application.Handle, PChar(Error_Text1 + '!'),
        PChar(Application.Title), MB_ICONERROR + MB_OK);
      Exit;
    end;
    if Pos(Error_Text2, FPage) > 0 then
    begin
      AlreadyLogged := Result;
      SetFocusToEditFields(UserEmailEdit);
      MessageBox(Application.Handle, PChar(Error_Text2 + '!'),
        PChar(Application.Title), MB_ICONERROR + MB_OK);
      Exit;
    end;
    if Pos(Error_Text3, FPage) > 0 then
    begin
      AlreadyLogged := Result;
      SetFocusToEditFields(PasswordEdit);
      MessageBox(Application.Handle, PChar(Error_Text3 + '!'),
        PChar(Application.Title), MB_ICONERROR + MB_OK);
      Exit;
    end;
    if Pos(Error_Text4, FPage) > 0 then
    begin
      MessageBox(Application.Handle, PChar(Error_Text4 + '!' + #13#10 +
        'Zaloguj się do konta tymczasowo przez przeglądarkę WWW.'),
        PChar(Application.Title), MB_ICONERROR + MB_OK);
      Exit;
    end;
    while (ResultCode = 301) or (ResultCode = 302) do
    begin
      for I := 0 to Headers.Count - 1 do
      begin
        RedirPos := Pos(Redir_C, Headers[I]);
        if RedirPos > 0 then
        begin
          RedirUrl := Copy(Headers[I], RedirPos + Length(Redir_C), MaxInt);
          if Pos(':443/', RedirUrl) > 0 then
          begin
            RedirUrl := StringReplace(RedirUrl, ':443/', '/', []);
            RedirUrl := StringReplace(RedirUrl, 'http://', 'https://', []);
          end;
          Headers.Clear;
          HTTPMethod('GET', RedirUrl);
          Break;
        end;
      end;
    end;
    FUrl := Developers_Url + '/docs/reference/api';
    Headers.Clear;
    HTTPMethod('GET', FUrl);
    while (ResultCode = 301) or (ResultCode = 302) do
    begin
      for I := 0 to Headers.Count - 1 do
      begin
        RedirPos := Pos(Redir_C, Headers[I]);
        if RedirPos > 0 then
        begin
          RedirUrl := Copy(Headers[I], RedirPos + Length(Redir_C), MaxInt);
          if Pos('http://', RedirUrl) = 0 then
          begin
            RedirUrl := Developers_Url + RedirUrl;
          end;
          Headers.Clear;
          HTTPMethod('GET', RedirUrl);
          Break;
        end;
      end;
    end;
    SetLength(FPage, Document.Size);
    Document.Read(PChar(FPage)^, Length(FPage));
    FAcessToken := SimpleParse('?access_token=', '">', FPage);
    Result := True;
  end;
end;
//...
0

Kurde, jak obsłużyć stronę https? Bo strona logowania FB to po prostu http://www.facebook.com/ i nie potrzeba tutaj https i u mnie bez problemów pobieram źródło tej strony.
Gorzej jest właśnie z gmailem bo tam w adresie jest https i wówczas w memo do którego źródło strony nie ma nic, a gdy zmieniam https na http to mam takie coś:

<HTML>
<HEAD>
<TITLE>Moved Temporarily</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Moved Temporarily</H1>
The document has moved <A HREF="https://www.google.com/accounts/ServiceLogin?service=mail&amp;passive=true&amp;rm=false&amp;continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&amp;bsv=llya694le36z&amp;scc=1&amp;ltmpl=default&amp;ltmplcache=2">here</A>.
</BODY>
</HTML>

Jaka na to rada panie Olesio? :P

0

aaa, zapomniałem dodać do uses libeay32.dll i ssleay32.dll
znajdę te pliki i zobaczę czy działa

No i dodałem ssl_openssl do uses, wrzuciłem libeay32.dll i ssleay32.dll do katalogu z programem i dalej nic :(

0

To nie wiem co jest nie tak ;/ Pokaż kod, bo logowanie na FaceBooku na pewno odbywa się po SSL przez stronę http://olesio.eu/fbj się dokładnie mojemu kodowi. Tylko ciasteczka są pobierane ze strony http://olesio.eu/fb pobieranie Tokena już ze stron po SSL'u, u mnie wszystko działa. Z kodu jaki otrzymaleś wynika, że jest przekierowanie na inną stronę. I może to przkierowanie źle obsługujesz, zobacz jak jest u mnie w kodzie. Możesz pobrać instalator działającego programu wykorzystujący powyższy kod z pod adresu: http://olesio.eu/fb - potrzebne biblioteki dołączone. Niestety loguje się dłuższą chwilę, ale później wszystko działa tak, jak należy. Zamiana https:// na http:// i otworzenie podmienionego źródła była tylko po to aby upewnić się w snifferze co na prawdę jest wysyłane metodą POST do serwera. Chociaż ostatnio w temacie o problemach z Indy gdzie poleciłem Synapse - deus odpisał w komentarzu, że poleca zamiast snifferów używac Debuggerów HTTP (chyba fiddler'a), ale nie wiem jak one poradzą sobie z szyfrowanym pakietem, a poza tym ponoc właśnie z Operą, której używam nie zawsze chcą działać prawidłowo.

0

Jeśli chodzi o proces logowania to póki co na pewno nie będzie działało bo muszę podać wartość GALX która jest zmienna w zależności od sesji. Czyli że najpierw muszę pobrać źródło strony logowania: https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&bsv=llya694le36z&scc=1&ltmpl=default&ltmplcache=2 bo bez tego ani rusz.
Tutaj kod pobierający źródło w najprostszej formie

Var
  SynHttp : THttpSend;
begin
  SynHttp := THttpSend.Create;
begin
  SynHttp.HTTPMethod('GET', 'https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&bsv=llya694le36z&scc=1&ltmpl=default&ltmplcache=2');
  source.Lines.LoadFromStream(SynHttp.Document);
end;
end;
0

No ok, to pobierasz kod strony i zapisz do zmiennej typu string i jeżeli ta żądana wartość jest między dwoma tagami albo czymś łatwym do określenia to użyj funkcji SimpleParse jak ja w swoim kodzie do wyciągnięcia FAcessToken, a następnie wykorzystaj tę zmienną tam gdzie jest potrzebna gmailowi przy logowaniu. Jeżeli kod jest bardziej złożony i zmienia się to polecam zaprzęgnąć wyrażenia regularne i moduł z http://regexpstudio.com .

0

Tyle to ja wiem.
Mi chodzi o to, że ta zmięnna nie będzie miała żadnej wartości, ponieważ nie pobiera mi źródła z tej strony...
O tym właśnie mówiłem

0

Nie wiem co Ty sobie za problemy sam generujesz. Mi bez żadnych kombinacji pobrało źródlo strony do której podałeś link, a i Synapse robiło to nawet bez MimeType potrzebnym na ogół przy metodzie POST i bez UserAgenta. Plik D:\test.html zawiera w treści zmienną GALX, którą można wyciągnąć prościej wspomianym wcześniej TRegExprem, bo wszystkie dane nie znajduje się w jednej linii.

uses
  httpsend, ssl_openssl;

const
  Default_MimeType = 'application/x-www-form-urlencoded';
  Opera_UserAgent = 'Opera/9.80 (Windows NT 5.1; U; pl) Presto/2.7.62 Version/11.01';

procedure TForm1.Button1Click(Sender : TObject);
var
  SynHttp : THttpSend;
begin
  SynHttp := THttpSend.Create;
  with SynHttp do
  begin
    KeepAlive := True;
    Protocol := '1.1';
    MimeType := Default_MimeType;
    UserAgent := Opera_UserAgent;
    HTTPMethod('GET', 'https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fui%3Dhtml%26zy%3Dl&bsv=llya694le36z&scc=1&ltmpl=default&ltmplcache=2');
    Memo1.Lines.LoadFromStream(SynHttp.Document);
    Document.SaveToFile('D:\test.html');
  end;
  SynHttp.Free;
end;
0

Znalazłem problem - miałem jakieś powalone pliki libeay32.dll i ssleay32.dll i to było tego powodem :/
Dzięki Geniuszu za pomoc :)

0

Hehe, proszę bardzo - geniuszem nie jestem, ale mogłem wspomnieć, że pliki koniecznie muszą być chyba ze strony Synapse, bo jak użylem nowszych pobranych z linku podanego w opisie pluginu Secure FTP do Total Commandera to też miałem problemy. Tam są chyba nieco starsze wersje dllek niż te dostepne, ale pod kątem nich była tworzona obsługa SSL pakiecie w Synapse. Najważniejsze, że już sobie poradziłeś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1