Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   SendMail mit Anhang (https://www.delphipraxis.net/164597-sendmail-mit-anhang.html)

Ykcim 21. Nov 2011 08:57

SendMail mit Anhang
 
Hallo Zusammen,

zu diesem Thema findet man eine Menge und ich habe stundenlang gesucht, aber mein Problem nicht lösen können. Daher frage ich Euch jetzt direkt, in der Hoffnung auf Hilfe.

Ich möchte eine Excel-Datei per HTML Mail verschicken.

Der Mailversand ohne Anhang funktioniert wunderbar, aber wenn ich den Anhang mit dem nachfolgenden Code hinzufügen möchte, wird statt der Datei meiner Mail nur der Text
"This is a multi-part message in MIME format --kY0d7MlcKs6drZEFnrME2Wo=_AYnzRxoH1 Content-Type: text/plain Content-Transfer-Encoding: 8bit "
voran gestellt.

Delphi-Quellcode:
function SendEmail(Recipient:string;CCList:string;sSubject:string;Body:TStringList; Pfad: string):boolean;
var
  nAlarmnr:integer;
  Attachment: TIdAttachment;

begin

 idSMTP:=TidSMTP.Create;
 idMessage:=TidMessage.Create;
 idSMTP.Host  := 'XXX';
 idSMTP.Username := 'XXXXXXXX';
 idSMTP.Password := 'XXXXX';
 idSMTP.Port  := XX;


 idMessage.From.text :='XXX@XXXX.de';
 idMessage.Sender.text:=idMessage.From.text;


 idMessage.Recipients.EMailAddresses:= Recipient;
 idMessage.CCList.EMailAddresses := CCList;
 idMessage.Subject:=sSubject;

 idMessage.ContentType := 'text/html';

 idMessage.Body.Clear;
 idMessage.Body := Body;
 Attachment := TIdAttachmentFile.Create(IdMessage.MessageParts, Pfad);
 idMessage.ContentType := 'text/html';
 try
   idSMTP.Connect;
   idSMTP.Send(idMessage);
   idSMTP.Disconnect;
   result:=True;
   except on E : Exception do
     begin
       if idSMTP.connected then try idSMTP.disconnect; except end;
       result := false;
     end;
 end;

end;
Hat jemand eine Idee, warum das bei mir nicht klappt??

Vielen Dank

Ykcim

Bummi 21. Nov 2011 09:09

AW: SendMail mit Anhang
 
ist eine Weile her bei mir, AFAIK musst Du die Mail

ContentType:='multipart/*';

erstellen und den HTML Teil per
Code:
with TIdText.Create(Msg.MessageParts, DEINTEXT) do
     begin
        ContentType:='text/html';
     end;

with TIdAttachmentFile.Create(msg.MessageParts, DEINFILE) do .....
...
Msg.MessageParts.Add();
erstellen, wenn es nicht stimmt bitte ich um Verzeihung, ich verwende die INDY's seit längerem nicht mehr...

Ykcim 21. Nov 2011 09:38

AW: SendMail mit Anhang
 
Hallo, !TEILERFOLG!

vielen Dnak für die Antwort - ein echter Teilerfolg:

Jetzt wird die Datei mitgeschickt, aber die Mail ist nicht mehr im HTML-Format und es wird der HTML-Code gezeigt... Hat dafür jemand eine Lösung?

Vielen Dank

Ykcim

Ykcim 21. Nov 2011 11:09

AW: SendMail mit Anhang
 
Hallo,

so funktioniert es jetzt:
Delphi-Quellcode:
function SendEmail(Recipient:string;CCList:string;sSubject:string;Body:TStringList; Pfad: string):boolean;
var
  nAlarmnr:integer;
  Attachment: TIdAttachment;

begin

 idSMTP:=TidSMTP.Create;
 idMessage:=TidMessage.Create;
 idSMTP.Host  := 'XXX.XXX.XXX.XXX';
 idSMTP.Username := 'XXXXXX';
 idSMTP.Password := 'XXXX';
 idSMTP.Port  := XX;


 idMessage.From.text :='XX@XXXXXX.de';
 idMessage.Sender.text:=idMessage.From.text;


 idMessage.Recipients.EMailAddresses:= Recipient;
 idMessage.CCList.EMailAddresses := CCList;
 idMessage.Subject:=sSubject;
 idMessage.ContentType:='multipart/*';

 with TidText.Create(idMessage.MessageParts,body) do
  begin
    contenttype:='text/html';
  end;

 with TIdAttachmentFile.Create(idMessage.MessageParts, Pfad) do
  begin
    idMessage.MessageParts.Add();
  end;

 try
   idSMTP.Connect;
   idSMTP.Send(idMessage);
   idSMTP.Disconnect;
   result:=True;
   except on E : Exception do
     begin
       if idSMTP.connected then try idSMTP.disconnect; except end;
       result := false;
     end;
 end;

end;

Vielen Dank für die Hilfe

DeddyH 21. Nov 2011 12:05

AW: SendMail mit Anhang
 
Hab ich was übersehen, oder erzeugst Du Dir Speicherlecks?

Ykcim 21. Nov 2011 14:45

AW: SendMail mit Anhang
 
Wo und wie?

Bin für jede Anregung zu haben...

Ykcim

Nersgatt 21. Nov 2011 14:48

AW: SendMail mit Anhang
 
Du gibst z.B. IdSMTP nicht frei.
Generell solltest Du Dir angewöhnen IMMER Ressourcenschutzblöcke zu verwenden, wenn Du Instanzen von Klassen erstellst.

Delphi-Quellcode:
Instanz := TMyClass.Create;
Try
... mach was mit der Instanz
Finally
  Instanz.free;
End

DeddyH 21. Nov 2011 14:49

AW: SendMail mit Anhang
 
Ich sehe da 4 mal Create, aber nicht 1 mal Free. Üblicherweise macht man das ja so:
Delphi-Quellcode:
Dings := TDings.Create;
try
  Dings.MachWas;
finally
  Dings.Free;
end;
[edit] :lol: [/edit]

Ykcim 5. Dez 2011 21:27

AW: SendMail mit Anhang
 
Guten Abend,

ich habe auf diesem Gebiet eine ganz große Lücke...
Kann mir jemand das "try" and "finally" mal für meine beschriebene Prozedur zeigen. Ich hoffe, dass ich dann den Zusammenhang verstehe. Ich habe es selber versucht, aber nur Errors bekommen.

Vielen Dank

Ykcim

Luckie 5. Dez 2011 21:35

AW: SendMail mit Anhang
 
DeddyH hat dir doch ein Beispiel gepostet.

Sir Rufo 5. Dez 2011 21:37

AW: SendMail mit Anhang
 
Delphi-Quellcode:
function SendEmail( Recipient : string; CCList : string; sSubject : string; Body : TStringList; Pfad : string )
  : boolean;
var
  nAlarmnr :  integer;
  Attachment : TIdAttachment;
  // Das fehlte hier noch !!!
  idSMTP : TIdSMTP;
  idMessage : TIdMessage;
begin

  Result := False;

  idSMTP := TidSMTP.Create;
  try

    idMessage := TidMessage.Create;
    try

      idSMTP.Host    := 'XXX.XXX.XXX.XXX';
      idSMTP.Username := 'XXXXXX';
      idSMTP.Password := 'XXXX';
      idSMTP.Port    := XX;

      idMessage.From.text  := 'XX@XXXXXX.de';
      idMessage.Sender.text := idMessage.From.text;

      idMessage.Recipients.EMailAddresses := Recipient;
      idMessage.CCList.EMailAddresses    := CCList;
      idMessage.Subject                  := sSubject;
      idMessage.ContentType              := 'multipart/*';

      with TidText.Create( idMessage.MessageParts, Body ) do
        begin
          ContentType := 'text/html';
        end;

      with TIdAttachmentFile.Create( idMessage.MessageParts, Pfad ) do
        begin
          idMessage.MessageParts.Add( );
        end;

      try
        idSMTP.Connect;
        try
          idSMTP.Send( idMessage );
          Result := True;
        finally
          idSMTP.Disconnect;
        end;
      except
        // Das macht man ja eigentlich nicht, keine Exception-Behandlung
      end;

    finally
      idMessage.Free;
    end;

  finally
    idSMTP.Free;
  end;

end;

himitsu 5. Dez 2011 21:46

AW: SendMail mit Anhang
 
Zitat:

Zitat von DeddyH (Beitrag 1137217)
Ich sehe da 4 mal Create, aber nicht 1 mal Free. Üblicherweise macht man das ja so:

Die Text- und Attachmentteile hängen sich an die Message und werden mit dieser freigegeben.
(falls man die Message freigibt)

Zitat:

Delphi-Quellcode:
// Das macht man ja eigentlich nicht, keine Exception-Behandlung

Vorallem da man so nicht mehr rausbekommt, was genau schief lief.
Ein billiger Boolean sagt ja nichts Genaueres. (eine Exceptions dagegen schon mehr)


Dein Programm kann dem User so ja nur sagen "nee, ging nicht" aber nicht "ging nicht, weil ...".


Wobei Indy diesen ContentType auch selber setzt.

text/plain = Textmail ohne anhang
multipart/alternative = z.B. Text und HTML parallel
multipart/mixed = Anhänge mit Text und/oder HTML


Zitat:

// Das fehlte hier noch !!!
Um wieviel wollen wir wetten, daß sich dort ein paar Globale Variablen versteckten?

Sir Rufo 5. Dez 2011 22:01

AW: SendMail mit Anhang
 
Zitat:

Zitat von himitsu (Beitrag 1139588)
Zitat:

// Das fehlte hier noch !!!
Um wieviel wollen wir wetten, daß sich dort ein paar Globale Variablen versteckten?

;) die scheinen wieder in Mode zu kommen ;)

Gustav.R 5. Dez 2011 23:58

AW: SendMail mit Anhang
 
Nur so aus dem OFF reingeplärrt:

CC ist wohl das neue BCC der Superheimlich-Multi-Geheimagenten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:56 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz