Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi IdSMTP sendet nicht und IdMessage wird nicht gespeichert. (https://www.delphipraxis.net/167732-idsmtp-sendet-nicht-und-idmessage-wird-nicht-gespeichert.html)

Informatik2012 15. Apr 2012 15:50

IdSMTP sendet nicht und IdMessage wird nicht gespeichert.
 
Ich probiere hier aus und es funktioniert. Mein SMTPSocket sendet die Emails nicht und bringt beim Disconnecten eine Fehlermeldung.
Kann mir da jemand helfen? Hier der Quelltext:
Delphi-Quellcode:
function login_SMTP(Username,PW,Server : String;Port : Integer; SMTPSocket : TIdSMTP):boolean;
var SetUp : TEinstellungen;
SSLIOHandler : TIdSSLIOHandlerSocketOpenSSL;
begin
  SetUp := LadeEinstellungen(Form2);
  if SMTPSocket.Connected then
  SMTPSocket.Disconnect();

   SMTPSocket.Username := Username;
   SMTPSocket.Password := PW;
   SMTPSocket.Port := Port;
   SMTPSocket.Host := Server;
  if Setup.smtpssl = true then
  begin
    SSLIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create();
    SSLIOHandler.PassThrough := True;
    SSLIOHandler.StartSSL;
    SMTPSocket.IOHandler:= SSLIOHandler;
    SMTPSocket.UseTLS:=TIdUseTLS(2);
    end else
    begin
    SMTPSocket.UseTLS:=utNoTLSSupport;
    end;
    SMTPSocket.AuthType := satDefault;
   SMTPSocket.Connect;
   Result := SMTPSocket.Connected;
end;

procedure logoff_SMTP(SMTPSocket : TIdSMTP);
begin
   SMTPSocket.Disconnect();
end;

procedure sendMessage(Username,PW,Server : String;Port, Priority : Integer; fromMail,Betreff: String;Anhang : TStringList;toMail : TStringList;Nachricht : TRichEdit; SMTPSocket : TIdSMTP);
var IdNachricht : TIdMessage;
   i : integer;
   s : String;
  IdAnhang : TIdAttachmentFile;
begin
   if SMTPSocket.Connected = true then
   begin
      IdNachricht := TIdMessage.Create(nil);
      with TIdText.Create(IdNachricht.MessageParts, nil) do
      begin
         ContentType := 'text/plain';
         Body.Text := Nachricht.Text;
      end;
      s := '';
      with IdNachricht do
      begin
         ContentType := 'multipart/*';
         From.Text := fromMail;
         ReplyTo.EMailAddresses := fromMail;
         Subject := Betreff;
         Priority := TIdMessagePriority(Priority);
         s := BccList.EmailAddresses;
         for i := 0 to toMail.Count -1 do
         begin
            s := s+ toMail.Strings[i];
         end;
         BccList.EMailAddresses := s;
      end;
         if Anhang.Count >= 1 then
         begin
            for i := 0 to Anhang.Count -1 do
               IdAnhang := TIdAttachmentFile.Create(IdNachricht.MessageParts,Anhang[i]);
         end;
      SMTPSocket.SendMsg(IdNachricht);
   end;
end;
procedure TFrame3.SpeedButton2Click(Sender: TObject);
var s,hToMail : String;
F : File;
i,k : integer;
leerArray : Array of Integer;
jahr,monat,tag,stunde,minute,sekunde,millisekunde : Word;
begin
  SetUp:=ladeEinstellungen(Form2);
  SMTPSocket := TIdSMTP.Create();
  toMail := TStringList.Create;
  s := Edit1.Text;
  SetLength(leerArray,0);
  for i := 1 to Length(s) do
  begin
     if s[i]=' ' then
     begin
       Setlength(leerArray,length(leerArray)+1);
       leerArray[length(leerArray)-1] := i;
     end;
  end;
  hToMail := '';
  for i := 1 to leerArray[0]-1 do
    begin
       hToMail:=hToMail+s[i];
    end;
    toMail.Add(hToMail);
  hToMail := '';
  for i := 1 to length(leerArray)-1 do
    begin
      if i <= length(leerArray)-2 then
      begin
      for k := leerArray[i]+1 to leerArray[i+1]-1 do
        begin
          hToMail := hToMail+s[k];
        end;
        hToMail := '';
      end
      else
      begin
       for k := leerArray[length(leerArray)-1]+1 to length(s) do
       begin
          hToMail := hToMail + s[k];
       end;
      end;
    end;
  login_SMTP(SetUp.Username,SetUp.Passwort,SetUp.SMTPServer,SetUp.SMTPPOrt,SMTPSocket);
  sendMessage(SetUp.Username,SetUp.Passwort,SetUp.SMTPServer,SetUp.SMTPPort,2,SetUp.Username,Edit2.Text,Attachment,toMail,Richedit1,SMTPSocket);
  logoff_SMTP(SMTPSocket);
  Showmessage('Gesendet');
  NMessage := TIdMessage.Create();
  NMessage.Body.Text := Richedit1.Text;
  NMessage.Subject := Edit2.Text;
        s := NMessage.BccList.EmailAddresses;
         for i := 0 to toMail.Count -1 do
         begin
            s := s+ toMail.Strings[i];
         end;
  NMessage.BccList.EMailAddresses := s;
  NMessage.Date := Now;
  s:=DateToStr(NMessage.Date);
  CreateFile(PWideChar(extractfilepath(paramstr(0))+'\MailClient\Mails\gesendet\'+NMessage.Subject+s+'.msg'),0,0,0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0);
  NMessage.SaveToFile(extractfilepath(paramstr(0))+'\MailClient\Mails\gesendet\'+NMessage.Subject+s+'.msg');
  Form2.Frame51.ListBox1.Items.Add('gesendet');
  Form2.Frame51.ListBox2.Items.Add(NMessage.BccList.EMailAddresses);
  Form2.Frame51.ListBox3.Items.Add(NMessage.Subject);
  Form2.Frame51.ListBox4.Items.Add(inttostr(tag)+'.'+inttostr(monat)+'.'+inttostr(jahr)+' '+inttostr(stunde)+':'+inttostr(minute)+'.'+inttostr(Sekunde));

end;
Also Das SaveToFile gibt eine Fehlermeldung dass es nicht zu speichern geht. und beim logoff kommt auch eine, sodass die Nachricht nicht gesendet wird.

Sir Rufo 15. Apr 2012 17:55

AW: IdSMTP sendet nicht und IdMessage wird nicht gespeichert.
 
Wie wäre es, wenn du mal etwas strukturierter vorgehen würdest?

1. Quelltext ordentlich formatieren, damit man die zusammengehörigen Blöcke auch erkennen kann
2. Überflüssige Parameter aus den Proceduren entfernen
3. DRY!!! Du baust die IdMessage 2 mal zusammen, irgendwie doppelt, gelle?

Lege dir das Befüllen der IdMessage in eine eigene procedure

Der SendMessage übergibst du dann nur noch die beiden Instanzen von TIdSMTP und TIdMessage

Dann wird das schon mal wesentlich übersichtlicher und erleichtert auch dir die Fehlersuche


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:20 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