POP3 mit Synapse

Alle Fragen zur Netzwerkkommunikation
TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: POP3 mit Synapse

Beitrag von TT73GP7 »

hmm ich habe das mal versucht nachzubauen

aber irgendwie geht das bei mir nicht

also einloggen geht ohne probleme
aber der rest funktioniert nicht :(

schade
hätte mich sehr interresiert

Code: Alles auswählen

 
procedure TfrmMailclient.btnAbholenClick(Sender: TObject);
var
  pop:TPOP3Send;
  sc : Integer;
  k  : Integer;
  msg: Tmimemess;
begin
  pop:=TPOP3Send.create;
  try
      pop.AutoTLS := True;
      pop.Username:='kontakt@bla.de'; // hier gebe ich meine Daten ein
      pop.Password:='TTgghak324'; // hier gebe ich meine Daten ein
      pop.TargetHost:='pop.1und1.de'; // hier gebe ich meine Daten ein
      pop.AuthType:=POP3AuthAll;
      pop.login;
 
      pop.list(0);
 
      memo1.lines.Assign(pop.FullResult);
      pop.Retr(1);
     // pop.top(1,0);
      memo1.lines.Assign(pop.FullResult);
 //     pop.logout;
    finally
   //   pop.free;
    end;
 
  if (not pop.Login) then
  begin
    memo1.Lines.Add('POP login failed.');
    exit;
  end;
  pop.list(0);
  memo1.Lines.Assign(pop.FullResult);
 
 
  pop.Stat
  sc := pop.statcount;   
  for k := 1 to sc do
  begin
    pop.Retr(k);   
  //  msg.Clear; hier hat er ein Problem
    msg.Lines.Assign(pop.FullResult);
    msg.DecodeMessage;
    memo1.Lines.Add('  Date:       ' + FormatDateTime('DD.MM.YYYY    HH:MM', msg.Header.Date));
    memo1.Lines.Add('  from:       ' + msg.Header.From);
    memo1.Lines.Add('  subject:    ' + msg.Header.Subject);
    memo1.Lines.Add('  organisation: ' + msg.Header.Organization);
    memo1.Lines.Add('  messageid:    ' + msg.Header.MessageID);
    memo1.Lines.Add(' ');
  end;
 
 
  pop.logout;
  pop.Free;   
end;
 

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: POP3 mit Synapse

Beitrag von theo »

TT73GP7 hat geschrieben:also einloggen geht ohne probleme

Woher weißt du das?

TT73GP7 hat geschrieben:aber der rest funktioniert nicht :(

Was heißt das?

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: POP3 mit Synapse

Beitrag von Michl »

Evtl. noch pop.TargetPort setzen?

Übrigens betreue ich auch mehrere Webseiten von 1und1 mit zugehörigen Mailadressen, nutze aber SMTP (1und1: Host: smtp.1und1.de, Port: 587) statt Pop3. Funktioniert tadellos hier (hab mal die Methode beigefügt, ist aber speziell für die Anwendung hier).

Code: Alles auswählen

uses ..., mimemess, smtpsend, blcksock, synachar, mimepart;
type
  TSendFrom = record
    mail     : String;
    password : String;
    host     : String;
    port     : String;
  end;
...
procedure TForm1.OnMailStatus(Sender: TObject; Reason: THookSocketReason;
  const Value: string);
var
  aPos: Integer;
begin
  if (Reason = HR_WriteCount) and (StrToIntDef(Value, 0) > 10) then
  begin
    aPos := StrToIntDef(Value, 0);
    Application.ProcessMessages;
    Caption := 'Sende Mail an ' + Query.FieldByName('email').AsString + ' ' + IntToStr(aPos);
  end;
end;
 
function TForm1.SendCurrentMailOK: Boolean;
var
  i: Integer;
  Mime : TMimeMess;
  SMTP : TSMTPSend;
  SendFromData: TSendFrom;
  MCCList: TStringList;
  PartText: TStringList;
  SendTo: String;
begin
  Result := False;
 
  SendTo := Query.FieldByName('email').AsString;
  MCCList := TStringList.Create;
  Mime := TMimeMess.Create;
  SMTP := TSmtpSend.Create;
  PartText := TStringList.Create;
  try
    // Mails, falls mehrere, erste als Email, restl. CC (String in Datenbank mit Semikolon getrennt)
    for i := 2 to WordCount(SendTo, [';']) do
      MCCList.Add(Trim(ExtractWord(i, SendTo, [';'])));
    // wenn benötigt, CC zum Auftraggeber
    MCCList.AddStrings(DA.GetSendCCEmailAdresses(Employer));
 
    SendTo := Trim(ExtractWord(1, SendTo, [';']));
 
    // Logindaten setzen
    SendFromData := DA.GetSendFromEmailData(Employer);
    SMTP.TargetPort := SendFromData.port;
    SMTP.UserName   := SendFromData.mail;
    SMTP.Password   := SendFromData.password;
    SMTP.TargetHost := SendFromData.host;
 
    // Statusanzeige verlinken
    SMTP.Sock.OnStatus := @OnMailStatus;
 
    //SMTP Login
    if not SMTP.Login then exit;
 
    // Füllen der Maildaten
    Mime.Header.CharsetCode := UTF_8;
    Mime.Header.From := SendFromData.mail;
    Mime.Header.ReplyTo := '';
    Mime.Header.ToList.Add(SendTo);
    for i := 0 to MCCList.Count - 1 do
      Mime.Header.CCList.Add(MCCList[i]);
    Mime.Header.Subject := EditSubject.Text//Betreffzeile
    Mime.MessagePart.CharsetCode := UTF_8;
    Mime.AddPartMultipart('', Nil);
    PartText.Text := ParsedMailText;
    Mime.AddPartTextEx(PartText, Mime.MessagePart, UTF_8, True, ME_8BIT);
 
    // Mailanhänge dazu
    for i := 0 to ListBoxSendFiles.Count - 1 do
      Mime.AddPartBinaryFromFile(GetPhysicalFile(ListBoxSendFiles.Items[i]),
                                 Mime.MessagePart);
 
    Mime.EncodeMessage;
 
    // Senden
    try
      if not SMTP.MailFrom(SendFromData.mail, Length(Mime.Lines.Text)) then
        raise Exception.Create('[1] Failed to create mail from [' + SendFromData.mail + ']');
      if not SMTP.MailTo(SendTo) then
        raise Exception.Create('[2] Failed to send mail to [' + SendTo + ']');
      for i := 0 to MCCList.Count - 1 do
        if not SMTP.MailTo(MCCList[i]) then
          raise Exception.Create('[3] Failed to send CC mail to [' + MCCList[i] + ']');
      if not SMTP.MailTo(SendFromData.mail) then
        raise Exception.Create('[4] Failed to send mail to me [' + SendFromData.mail + ']'); // noch an AG selbst schicken
      if not SMTP.MailData(Mime.Lines) then
        raise Exception.Create('[5] Failed to send mail data [' + SendTo + ']');
 
      Result := True;
    except
      on e: Exception do
        ShowMessage('SendCurrentMailOK Error: ' + e.Message);
    end;
  finally
    SMTP.Logout;
    PartText.Free;
    Mime.Free;
    SMTP.Free;
    MCCList.Free;
  end;
end

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: POP3 mit Synapse

Beitrag von TT73GP7 »

so nun komme ich endlich mal wieder zu meinen Lieblings Thema

SMTP und POP3 sind doch zwei verschiedene dinge
-> SMTP wird doch benutzt um email zuschicken (das bekomme ich auch super hin)
-> POP3/IMAP werden doch genug um E-Mails von Server abzurufen

das verschicken funktioniert bei mir auch Tadellos
nur das empfangen geht überhaupt nicht

ich finde da auch keine wirklichen Beispiele dazu

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: POP3 mit Synapse

Beitrag von TT73GP7 »

soooo

ich habe mir mal ein beispiel neu zusammen gebastelt wo ich denke das könnte funktionieren.

irgendwie bekomme ich es noch nichtmal hin mich anzumelden :(
wenn ich die daten per hand in einen mailclient eingebe funktioniert alles wie gewollt

kann sich einer mal das beispiel ansehen und mir mal sagen was wie wo falsch ist?
ich konne einfach nicht auf die lösung
Dateianhänge
Mailclient.zip
(901.46 KiB) 174-mal heruntergeladen

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: POP3 mit Synapse

Beitrag von TT73GP7 »

so irgendwo gelesen das man noch openSSL hinzufügen soll

gesagt getan
leider immer noch nicht das ergebnis welches ich gerne hätte :(
Dateianhänge
Mailclient.zip
(998.39 KiB) 166-mal heruntergeladen

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: POP3 mit Synapse

Beitrag von braunbär »

Ich habe das jetzt nur kurz überflogen. Vielleicht habe ich es übersehen, aber irgendwie fehlt mir ein

Code: Alles auswählen

msg:=TMimemess.create;
 

bevor du auf msg zugreifst.

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: POP3 mit Synapse

Beitrag von TT73GP7 »

hach soweit komme ich ja noch nichtmal zur zeit

der Login geht ja garnicht
ich bekomme die Meldung das der Login Faild

aber ich hab es Eingebaut

--Edit ich sollte am frühen morgen mehr Kaffee trinken

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: POP3 mit Synapse

Beitrag von theo »

Da kommt keiner mehr mit, was du da machst.

Du schreibst oben: "also einloggen geht ohne probleme"
Darauf fragte ich dich: "Woher weißt du das?"

Keine Antwort.

Jetzt schreibst du: "der Login geht ja garnicht, ich bekomme die Meldung das der Login Faild"

Ja was denn jetzt?

Sorgfältiger arbeiten (und schreiben) wäre in jedem Falle ein Hilfe.
Auch im Code, da logst du ein und dann nochmal, ohne vorher auszuloggen und erst beim zweiten Mal käme dann eine Meldung: "POP login failed."
So kommt man doch nicht weiter.

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: POP3 mit Synapse

Beitrag von TT73GP7 »

hach ich sollte aufhören immer Code zu kopieren und die Kommentare drin zulassen.

Irgendwie hat sich die Lage auch geändert.
ich bin der Meinung das das Einloggen auch ging

nun scheint es aber nicht mehr zulaufen :(

er hapert wohl schon an dieser stelle und ich weiß nicht warum:

Code: Alles auswählen

 
 procedure TfrmMailclient.btnAbholenClick(Sender: TObject);
   var 
    pop:TPOP3Send; 
    sc : Integer; 
    k  : Integer; 
    msg: Tmimemess;
begin 
 
pop:=TPOP3Send.create
  try     
   pop.AutoTLS := True;     
   pop.Username:='kontakt@bla.de'; // hier gebe ich meine Daten ein     
   pop.Password:='TTgghak324'; // hier gebe ich meine Daten ein     
   pop.TargetHost:='pop.1und1.de'; // hier gebe ich meine Daten ein     
   pop.AuthType:=POP3AuthAll;     
   pop.login;       
   pop.list(0);       
   memo1.lines.Assign(pop.FullResult);     
   pop.Retr(1);     
   memo1.lines.Assign(pop.FullResult);
  finally   
  end;
 
 
  if (not pop.Login) then 
    begin   
      memo1.Lines.Add('POP login failed.');   
      exit
    end;
 


Was mich ärgert das ich hier grade null zeit für das reinarbeiten habe :(
und irgendwie ist das alles ein Buch mit Sieben Siegeln

Die Beispiele die ich zu den Thema finde machen das genau so

nur bei mir will das alles nicht laufen

was vielleicht toll wäre wenn sich jemand mal das angehängte Programm ansehen könnte und da mal schauen kann ob es bei ihn Arbeitet oder nicht

braunbär
Beiträge: 369
Registriert: Do 8. Jun 2017, 18:21
OS, Lazarus, FPC: Windows 10 64bit, Lazarus 2.0.10, FPC 3.2.0
CPU-Target: 64Bit
Wohnort: Wien

Re: POP3 mit Synapse

Beitrag von braunbär »

theo hat dir doch schon gesagt, warum das nicht funktioniert.

Du machst im try - except ein erstes pop.login. Jetzt bist du eingeloggt.
Und dann rufst du pop.login noch einmal auf: if not pop.login
Das kann nicht gehen.

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: POP3 mit Synapse

Beitrag von TT73GP7 »

das ist ein super guter Einwand

wie prüfe ich denn dann ob ich schon eingeloggt bin?

compmgmt
Beiträge: 351
Registriert: Mi 25. Nov 2015, 17:06
OS, Lazarus, FPC: Win 10 Pro | Lazarus 1.8.2 | FPC 3.0.4
CPU-Target: i386 + x86_64
Wohnort: in der Nähe von Stuttgart
Kontaktdaten:

Re: POP3 mit Synapse

Beitrag von compmgmt »

TT73GP7 hat geschrieben:das ist ein super guter Einwand

wie prüfe ich denn dann ob ich schon eingeloggt bin?
TPOP3Send.Login hat als Rückgabetyp ein Boolean. Wenn du erfolgreich eingeloggt wurdest, wird True übergeben, ansonsten False. Also ungefähr so:

Code: Alles auswählen

if pop.login then ... // erfolgreich eingeloggt
  else ... // einloggen fehlgeschlagen

Code: Alles auswählen

InitiateSystemShutdownExA(nil, nil, 0, true, false, $0005000F);
Have fun with this snippet ;)

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: POP3 mit Synapse

Beitrag von TT73GP7 »

sooo

Login etc funktioniert.
in nachhinein war ich da auch echt blind, naja alles Lerneffekte halt :D

Nun habe ich noch ein Problem

Code: Alles auswählen

 
 
  pop.Stat;   
  sc := pop.statcount;     
 
for k := 1 to sc do  begin   
  pop.Retr(k);       
  msg.Lines.Assign(pop.FullResult); // Hier kommt die Fehlermeldung: External SIGSEGV   
  msg.DecodeMessage;   
  memo1.Lines.Add('  Date:       ' + FormatDateTime('DD.MM.YYYY    HH:MM', msg.Header.Date));   
  memo1.Lines.Add('  from:       ' + msg.Header.From);   
  memo1.Lines.Add('  subject:    ' + msg.Header.Subject);   
  memo1.Lines.Add('  organisation: ' + msg.Header.Organization);   
  memo1.Lines.Add('  messageid:    ' + msg.Header.MessageID);   
  memo1.Lines.Add(' ');
end;
 
 


wenn ich z.B. sowas hier mache

Code: Alles auswählen

 
 
  pop.Stat;   
  sc := pop.statcount;     
 
for k := 1 to sc do  begin   
  memo1.Lines.Add('Test ');
end;
 
 


Durchläuft er die schleife n mal-
Die Frage ist muss ich irgendwo noch sagen msg.create? oder sowas in der
Art?
msg ist von Typ Tmimemess

TT73GP7
Beiträge: 238
Registriert: Di 29. Mär 2016, 20:45

Re: POP3 mit Synapse

Beitrag von TT73GP7 »

ahhhhaaaaa

also ohne ein
msg := TMimeMess.create;

geht natürlich garnix :)
nun kann ich schonmal emails abholen ;)

die Eigentliche Massage bekomme ich nun so:

Code: Alles auswählen

 
  mmess.Lines.Assign(pop.FullResult);
  mmess.DecodeMessage;
  y:=mmess.MessagePart.PartBody.Count;
for x:=0 to y-1 do
  memo1.Lines.Add(DecodeQuotedPrintable(mmess.MessagePart.PartBody[x]));
 


Aber wie bekomme ich den Text der Email raus und wie kann ich die Anhänge extrahieren?

Antworten