Indy TidSMTP: HTML-Mail + Anhang



  • Hallo,

    ich probiere jetzt schon den ganzen Tag, krieg aber irgendwie den Trick nicht raus und finde auch in der IndyDoku nichts. Ich habe ein Textfeld (RichEdit). Was da eingegeben wird, soll als HTML versendet werden. Zusätzlich soll es möglich sein einen Anhang an die Mail anzuhängen.
    Das Problem:
    Ohne Anhang klappt alles wunderbar, sobald ich jedoch einen Anhang anhänge, bekomme ich im Mailtext nicht nur den Text der Mail, sondern auch alle HTML-Codes 😕

    Mein Quellcode:

    Mein TIdSMTP heißt SMTPServer
    Mein TIdMessage heißt MAilMessage

    TIdAttachment *AttFile;
    
             if(Trim(F_Main->E_Attachment->Text).Length() >= 1)
             {
                F_Main->MailMessage->MessageParts->Add();
                F_Main->MailMessage->ContentType = "multipart/mixed";
                AttFile = new TIdAttachment(F_Main->MailMessage->MessageParts, Trim(F_Main->E_Attachment->Text));
             }
    
             F_Main->MailMessage->MessageParts->Add();
             F_Main->MailMessage->ContentType = "text/html";
    
             TStringList *body=new TStringList();
    
             body->Add("<html>");
             body->Add("<head>");
             body->Add("</head>");
             body->Add("<body lang=DE>");
    
             lines = RE_Mailtext->Lines->Count;
    
             for(i=1; i<=lines; i++)
             {
                if(RE_Mailtext->Lines->Strings[i-1].Length() > 0)
                   body->Add(RE_Mailtext->Lines->Strings[i-1]);
    
                body->Add("<br>");
             }
    
             body->Add("</body>");
             body->Add("</html>");
    
             F_Main->MailMessage->Body=body;
    
             try
             {
                F_Main->L_Status->Font->Color = clGreen;
                L_Status->Caption = "Verbindung zum Mailserver wird aufgebaut ...";
                Application->ProcessMessages();
                F_Main->SMTPServer->Connect();
                connected = true;
                L_Status->Caption = "Verbindung zum Mailserver steht, die Mail wird versendet ...";
                Application->ProcessMessages();
                F_Main->SMTPServer->Send(F_Main->MailMessage);
                L_Status->Caption = "Die Mail wurde erfolgreich versendet!";
                Application->ProcessMessages();
             }
    

    Ergebnisse meiner Fehlersuche:
    Sende ich die Mail ohne Anhang, steht in den Headerzeilen der Mail vollkommen korrekt

    Content-Type: text/html;
    

    Sobald ich einen Anhang anhänge, steht in den Headerzeilen

    Content-Type: multipart/mixed;
    
    [...]
    
    --=_NextPart_2rfkindysadvnqw3nerasdf
    [b]Content-Type: text/plain[/b]
    Content-Transfer-Encoding: 7bit
    
    <html>
    <head>
    </head>
    <body lang=DE>
    Mail mit Anhang
    <br>
    </body>
    </html>
    
    [...]
    
    --=_NextPart_2rfkindysadvnqw3nerasdf
    Content-Type: application/octet-stream;
            name="Anhang.txt"
    Content-Transfer-Encoding: base64
    Content-Disposition: attachment;
            filename="Anhang.txt"
    

    Der HTML-Code soll natürlich später größere Formatierungen mit aufnehmen!

    Aus welchem Grunde auch immer wird aus meinem vorgegebeben Content-Type "text/html" ein "text/plain" und damit bekomme ich auch alle HTML-Codes als Text mit ausgegeben.

    Ich bin auch schon auf die Idee gekommen, den Content-Type ganz spezifisch dem jeweiligen Mailpart zuzuornden, also nicht

    F_Main->MailMessage->ContentType = "text/html";
    

    sondern

    F_Main->MailMessage->MessageParts->Items[0]->ContentType = "text/html";
    

    Wird auch ohne Fehler und Warnhinweise compiliert, allerdings während das Programm läuft bekomme ich dann die Fehlermeldung

    Exception der Klasse EListError. Meldung: 'Listenindex überschreitet das Maximum (0)'.

    Hat vielleicht jemand eine Idee, wie ich eine HTML-E-Mail mit Anhang versenden kann?

    Danke für Eure Ideen.



  • bei html-Mails muß man - soweit ich weiß - 2 Text-Parts anlegen, einmal als text/plain und einmal als text/html, wobei der text/plain-Part leer bleiben kann, z.B. mit Hilfe von TIdText:

    TIdText *IdText2 = new TIdText(F_Main->MailMessage->MessageParts, body);
    IdText2->ContentType="text/html";
    
    TIdText *IdText1 = new TIdText(F_Main->MailMessage->MessageParts,NULL);
    IdText1->ContentType="text/plain";
    

    dann sollte eigentlich auch das mit den Anhängen funktionieren



  • Cool, dass Du das weißt, ich bin nämlich bis gestern nacht noch daran verzweifelt und selbst mit Tante Google, die fast alle Probleme lösen kann, habe ich keinen vernünftigen Ansatz gefunden.

    Ist aber auch nicht wirklich logisch, dass ich einen MailPart anlegen muss, den ich eigentlich gar nicht brauche, oder?

    Gut, jetzt weiß ich es, habe es sofort ausprobiert, mich darüber gefreut, dass es funktioniert und jetzt kann ich lustig und munter weiter programmieren.

    VIELEN LIEBEN DANK.

    Gibt es eigentlich nicht auch Bierkrüge als Smilies?
    Egal, dann so: 👍


Anmelden zum Antworten