Zwei fragen: TIdPOP3: MsgId und Attachment.



  • das mit der hilfe stimmt schon 🕶
    ich werde aus folgendem zitat aber nicht schlau

    For messages retrieved using TIdPOP3, UID may contain the arbitrary 70-byte value (maximum) which identifies a message in the POP3 maildrop. In POP3, individual byte values in UID must be in the range 0x21 to 0x7E. Note: Messages marked as deleted in the POP3 maildrop are not returned with a UID value.

    insofern muss also der string eine ID haben. jedoch ist MsgId leer sowie UID auch. 😕 was muss denn da beachtet werden damit es klappt? ausserdem eine ander frage. man hat ja die möglichkeit die komplette mail (Retieve) oder den header (RetrieveHeader) runterzuladen. ich möchte jedoch nicht immer die ganze mail samt attachment runterladen sondern eigentlich nur den header und dann schauen ob dort ein attachment drin ist (dateinamen z.b.) und den plain text der email. geht das mit dem header? stehen die infos dort drin?



  • nun geht es mit MsgId. hatte nur eine falsche mail nummer zum empfangen angegeben. aber was den plain text angeht, steht dieser im header? oder wie komme ich an den text? ohne das ich attachments runterladen muss.



  • hm wie komme ich denn nun an den text der nachricht?
    ich sehe in der hilfe neben TIdAttachment was von TIdText. jedoch weis ich nicht wie ich an den text komme. wenn ich das anhand von deinem beispiel nur eben anstelle für attachment, für text mache, macht das keinen sinn. sprich:

    for (int j=0; j<IdMessage->MessageParts->Count; j++)
    	{
            TIdText *TEXT = dynamic_cast<TIdText*>(IdMessage->MessageParts->Items[j]);
            if ((TEXT) && (TEXT->ClassNameIs("TIdText")))
            {
            	Memo1->Text = //????????????
    		}
        }
    

    🙄



  • BCB-Hilfe schrieb:

    TIdText provides the Body property to represent the textual content of the message part.

    Allerdings bezweifle ich, dass du da ran kommst, ohne mit Retrieve die komplette Nachricht, einschliesslich der Attachments, herunterzuladen. Für solche Extravaganzen wirst du vermutlich einen eigenen POP3-Client schreiben müssen, oder TIdPOP3 umschreiben.



  • hasts chon recht. habe mich nun auch für das komplette runterladen entschlossen 😃 blos wie komme ich denn nun an den text? ist mir schleierhaft.



  • müsste das so nicht gehen?

    for (int j=0; j<IdMessage->MessageParts->Count; j++)
        {
            TIdText *TEXT = dynamic_cast<TIdText*>(IdMessage->MessageParts->Items[j]);
            if ((TEXT) && (TEXT->ClassNameIs("TIdText")))
            {
                Memo1->Lines->Add(TEXT->Body->Strings[j]); HM? geht aber nicht
            }
        }
    


  • wenn ich das so mache

    for (int j=0; j<IdMessage->MessageParts->Count; j++) 
        { 
            TIdText *TEXT = dynamic_cast<TIdText*>(IdMessage->MessageParts->Items[j]); 
            if ((TEXT) && (TEXT->ClassNameIs("TIdText"))) 
            { 
                Memo1->Lines->Add(TEXT->Body->Strings[j]); 
            } 
        }
    

    krieg ich nur die erste zeile aus der email und am ende steht <HTML><HEAD>
    wenn ich das so mache:

    for (int j=0; j<IdMessage->MessageParts->Count; j++) 
        { 
            TIdText *TEXT = dynamic_cast<TIdText*>(IdMessage->MessageParts->Items[j]); 
            if ((TEXT) && (TEXT->ClassNameIs("TIdText"))) 
            { 
                Memo1->Lines->Add(TEXT->Body->Text);  
            } 
        }
    

    ist zwar die ganze email als text du sehen, jedoch unten auch das ganze noch in html! wie geht es denn nun richtig, das ich nur den kompletten text ohne html habe?



  • Beschwer dich beim Absender, HTML-Mail gehört verboten.

    Davon abgesehen ist es wohl an dir, den PlainText manuell zu extrahieren bzw. die HTML-Tags auszufiltern.

    Und noch ein Tip:

    Memo->Lines = IdMessage->Body;
    


  • geht das nicht mit indy? es muss doch irgendwie möglich sein nur den plain text zu erhalten, ohne gross was zu basteln. ich überlege schon den ganzen tag/abend wie ich an den plain text komme, bzw. den html teil weglasse 🙄 ich spring gleich aus dem fenster 😃

    for (int j=0; j<IdMessage->MessageParts->Count; j++) 
        { 
            TIdText *TEXT = dynamic_cast<TIdText*>(IdMessage->MessageParts->Items[j]); 
            if ((TEXT) && (TEXT->ClassNameIs("TIdText"))) 
            { 
                Memo1->Lines->Add(TEXT->Body->Text);  
            } 
        }
    

    so würde es ja wie bereits erwähnt gehen. nur eben habe ich zuerst den plain text und dann kommt unten noch der html kodierte text.



  • oh gott. das wird ja immer schöner 🕶
    wenn eine email als plaintext gesendet wurde wird mir diese GARNICHT angezeigt. egal wie ich NoDecode oder NoEncode habe. 😡 😕 hm



  • ah wenn die mail nur plain ist hab ich die lösung.
    ich frage zuerst den Count von messageparts ab, wenn dieser grösser als 0 ist, kann es nicht plain sien da entweder ein/mehrere anhänge enthalten sind, oder es html formatiert ist, da dort ja auch der plain zusätzlich ist. also mache ich eben grösser als 0, wenn nicht, dann ist der plain text in IdMessage->Body->Text

    soweit sogut nun. fehlt aber immer noch das problem mit dem html weglassen. dazu würde mir eigentlich auch shcon ne lösung ins auge springen. hier muss ich ja beim multi part nur den richtigen index nehmen.

    TIdText *TEXT = dynamic_cast<TIdText*>(IdMessage->MessageParts->Items[HIER EVL. 0 oder 1]);
    

    das scheitn mir aber noch unsicher. wenn jemand eine bessere lösung hat das ich bei multipart messages nur den plain erhalten kann.... bitte her damit 😃


Anmelden zum Antworten