Announcement

Collapse
No announcement yet.

Emails mit Indy empfangen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Emails mit Indy empfangen

    Hallo,

    ich habe ein Mailprogramm mit den Indy-Komponenten erstellt. Leider gibt es (wie auch bei dem Beispielprogramm, das mit der Source geliefert wurde) Probleme beim Lesen einiger Mails, die einfach ohne Body-Text dargestellt werden (weder in der Eigenschaft Body noch in einem Attachment-Objekt ist die Nachricht zu finden, die in Outlook-Express aber korrekt dargestellt wird).

    Hatte jemand das gleiche Problem und vielleicht eine Lösung dazu gefunden?

    Viele Grüße,
    Frank Geppert

  • #2
    Einige Emails kommen als HTML, Du liest vermutlich nur den "Nur Text" Teil aus
    Schöne Grüße, Mario

    Comment


    • #3
      Hallo Frank,

      wenn Du die vollständigen Texte haben möchtest (auch html), genügt es nicht, nur den Body.Text auszulesen.

      In dem email-Client, den ich gerade schreibe, habe ich mir ein Objekt angelegt, das alle relevanten Informationen einer Nachricht speichert (auch die Headers der Nachricht etc.) Zum besseren Verständnis für das nachfolgende Beispiel: Das Objekt nennt sich Nachricht und ist vom Typ TNachricht. Außerdem beinhaltet es ein dynamisches Array vom Typ TMailAnhang, das die Metadaten der mitgesendeten Anlagen beinhaltet.

      In dem Beispiel weise ich zuerst Nachricht.Body den Text von Msg.Body.Text zu.
      Anschließend lese ich die mitgesendeten Teile der Msgkomponente (Typ TidMessage) in einer for-Schleife aus.
      Dabei differenziere ich, ob es sich um eine Anlage oder um einen Text handelt. Sofern es sich um eine Anlage handelt, muß noch weiter unterschieden werden, ob es sich um eine tatsächlich mitgesendete Anlage handelt oder um ein Objekt, das innerhalb der html-Nachricht zu verwenden ist (bspw. ein eingebettetes Foto).

      var
      i : Integer;
      Msg : TIdMessage;
      Nachricht : TNachricht;
      begin
      Nachricht.Body := Msg.Body.Text;
      //Überprüfung, ob MessageParts mitgeliefert werden
      if Msg.MessageParts.Count > 0 then
      begin
      for i := 0 to Pred(Msg.MessageParts.Count) do //Auslesen der MessageParts
      begin
      if Msg.MessageParts[i] is TidAttachment then //Handelt es sich um ein Attachment
      begin
      if (TidAttachment(Msg.MessageParts[i]).ContentDisposition = '') or
      (Pos('INLINE', Uppercase(TidAttachment(Msg.MessageParts[i]).ContentDisposition)) = 1) then
      Nachricht.HtmlAnhang := True //Es handelt sich um ein Element, das innerhalb der Html-Nachricht angezeigt werden soll

      else Nachricht.Anhang := True; //Es handelt sich um eine tatsächliche Anlage für den Empfänger
      end
      else if Msg.MessageParts[i] is TidText then //Es handelt sich um ein Textelement
      begin
      if (Pos('TEXT/PLAIN', UPPERCASE(TidText(Msg.MessageParts.Items[i]).
      ContentType)) > 0) or (TidText(Msg.MessageParts.Items[i]).
      ContentType = '') then
      begin //Es handelt sich um eine einfache Textnachricht, kein html und speichere nun die Nachricht, zusammen mit Contentype und ContentTransfer

      Nachricht.TextContentType := TidText(Msg.MessageParts.Items[i]).ContentType;

      ...
      end
      else if Pos('TEXT/HTML', UPPERCASE(TidText(Msg.MessageParts.Items[i]).
      ContentType)) > 0 then
      begin //Es handelt sich um eine html-Nachricht und speichere nun die Nachricht, zusammen mit Contenttype und ContentTransfer.
      Nachricht.HtmlContentTransferEncoding := TidText(Msg.MessageParts.
      Items[i]).ContentTransfer;

      ...
      end;
      end;
      end;
      end
      end

      Comment

      Working...
      X