AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Versand per SMTP

Ein Thema von H.Bothur · begonnen am 17. Jan 2023 · letzter Beitrag vom 18. Jan 2023
Antwort Antwort
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#1

Versand per SMTP

  Alt 17. Jan 2023, 17:54
Moin,

ich habe folgendes Testprogramm und folgende Fragen:

1: Ich würde erwarten das ich bei vier versendeten Mails immer nur 4 Anhänge (Test1-Test4) bekomme. Aber ich bekomme in der ersten Mail 4 Anhänge, in der zweiten Mail 8 usw. Ich hätte aber gedacht das das "iAttachment.Free;" am Ende des versenden reicht um die "alten" Anhänge zu löschen.

2: Ich hätte gedacht das die beiden Zeilen

Delphi-Quellcode:
  Form1.Memo1.Lines.Add('Beginn Mailerstellung: ' +FloatToStr(Runde));
  Form1.IdMessage1.Body.Assign(Form1.Memo1.Lines);
den Body-Text der Mail neu setzen. Statt dessen kommt aber imer der gleiche Text der ersten Schleife und die anderen Schleifen ändern den Text nicht mehr.

Und nun - was mache ich denn falsch ??

Gruss
Hans

Delphi-Quellcode:
unit SSLMail2Unit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, IdIOHandler,
  IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL, IdComponent,
  IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase, IdMessageClient,
  IdSMTPBase, IdSMTP, IdBaseComponent, IdMessage, IDAttachment, IdAttachmentFile, IDGlobal;

type
  TForm1 = class(TForm)
    Button1: TButton;
    IdMessage1: TIdMessage;
    IdSMTP1: TIdSMTP;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure MailConnect;
begin
    Form1.IdSMTP1.AuthType := satDefault; // simpler Login ohne Authentifizierung
    Form1.IdSMTP1.Host := 'smtp.strato.de';
    Form1.IdSMTP1.Port := 465;
    Form1.IdSMTP1.UseTLS := utUseRequireTLS; // mit SSL -> Port dann in aller Regel 587
    Form1.IdSMTP1.Username := 'h.bothur@xxx.xx'; // Benutzername
    Form1.IdSMTP1.Password := 'Passwort'; // Passwort
    // Verbinden mit Server
    Form1.Memo1.Lines.Add('Beginn Connect');
    try
     Form1.IdSMTP1.Connect;
    except
     on E: Exception do
      begin
         Form1.Memo1.Lines.Add('>> Fehler Connect: ');
         Form1.Memo1.Lines.Add('>> ' +e.message +': ');
         Application.MessageBox (PChar(E.Message),'Verbindungsfehler Connect!',MB_OK);
         Form1.IdSMTP1.Disconnect;
         exit;
      end;
    end;
    Form1.Memo1.Lines.Add('Connected');
    Form1.Memo1.Lines.Add('');
end;

procedure MailVersenden(Runde: integer);
var
  iAttachment : TIdAttachment;
begin
  Form1.Memo1.Lines.Add('Beginn Mailerstellung: ' +FloatToStr(Runde));
  Form1.IdMessage1.Body.Assign(Form1.Memo1.Lines); // der eigentliche eMail -Text aus einem TMemo
  Form1.IdMessage1.Priority := TIdMessagePriority(2); // Priorität
  Form1.IdMessage1.Recipients.EMailAddresses := 'hans.hgbothur.de'; // Empfängeradresse
  Form1.IdMessage1.ReplyTo.EMailAddresses := 'h.bothur@hermann-juergensen.de'; // Anwortadresse
  Form1.IdMessage1.From.Text := 'h.bothur@hermann-juergensen.de'; // Absenderadresse
  Form1.IdMessage1.ContentType := 'multipart/*'; // mit Anhang!
  Form1.IdMessage1.Subject := 'Testmail: ' +FloatToStr(Runde);
  iAttachment := TIdAttachmentFile.Create(Form1.IdMessage1.MessageParts, 'i:\h.bothur\entw\rtn\mailtest\test1.pdf') ;
  iAttachment := TIdAttachmentFile.Create(Form1.IdMessage1.MessageParts, 'i:\h.bothur\entw\rtn\mailtest\test2.pdf') ;
  iAttachment := TIdAttachmentFile.Create(Form1.IdMessage1.MessageParts, 'i:\h.bothur\entw\rtn\mailtest\test3.pdf') ;
  iAttachment := TIdAttachmentFile.Create(Form1.IdMessage1.MessageParts, 'i:\h.bothur\entw\rtn\mailtest\test4.pdf') ;

  Form1.Memo1.Lines.Add('Beginn Senden: ' +FloatToStr(Runde));
  try
     if Form1.IdSMTP1.Connected then Form1.IdSMTP1.Send(Form1.IdMessage1);
  except
    on E: Exception do
    begin
       Application.MessageBox (PChar(E.Message),'Verbindungsfehler Versand !',MB_OK);
       Form1.IdSMTP1.Disconnect;
       exit;
    end;
  end;
  iAttachment.Free;
  Form1.Memo1.Lines.Add('Ende Senden: ' +FloatToStr(Runde));
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  MailConnect;
  for i := 1 to 4 do
  begin
    MailVersenden(i);
    Memo1.Lines.Add('');
  end;
  IdSMTP1.Disconnect;
end;

end.
Hans-Georg Bothur
www.hermann-juergensen.de

Geändert von H.Bothur (17. Jan 2023 um 22:53 Uhr) Grund: Zugangsdaten rausgenommen :-)
  Mit Zitat antworten Zitat
mytbo

Registriert seit: 8. Jan 2007
472 Beiträge
 
#2

AW: Versand per SMTP

  Alt 17. Jan 2023, 18:40
Einfacher lässt es sich mit dem TIdMessageBuilder zusammenstellen:
Delphi-Quellcode:
var
  idMessageBuilder: TIdMessageBuilder;
begin
  idMessageBuilder := TIdMessageBuilder.Create;
  try
    idMessageBuilder.PlainText.Text := '...';
    idMessageBuilder.Attachments.Add('i:\h.bothur\entw\rtn\mailtest\test1.pdf');
    idMessageBuilder.FillMessage(idMessage);
  finally
    idMessageBuilder.Free;
  end;
Und nach dem Senden deine Message "clearen".

Bis bald...
Thomas
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#3

AW: Versand per SMTP

  Alt 17. Jan 2023, 19:53
iAttachment wird viermal was per TIdAttachmentFile.Create zugewiesen, aber das iAttachment.Free gibt es nur einmal. Das Ergebnis welcher Zuweisung wird denn hier freigegeben und was passiert mit den verbleibenden dreien?

Und da iAttachment außer bei der Zuweisung nicht verwendet wird, könnte man dann nicht direkt ganz darauf verzichten?

Wenn von vier iAttachment drei nicht freigegeben werden, kann man auf die vierte Freigabe auch verzichten

Ansonsten würd' ich mir mal IdMessage1.MessageParts anschauen.

Das gibt es sowas wie IDMessage.MessageParts.Count. Damit dürftest Du erfahren, wieviele Anhänge an der Mail schon vorhanden sind.

Tippe mal darauf, dass Du dort nach dem Mailversand ein bisserl aufräumen musst und nicht erwarten kannst, dass die Aufräumarbeiten automatisch nach vom Send oder vom Disconncet ausgeführt werden.

Wäre auch nicht wirklich sinnvoll, wenn man viele Mails (z. B. in 'ner Schleife) mit den gleichen Anhängen an viele unterschiedliche Empfänger schicken möchte.

Und:

Nimm doch bitte im Eingangspost mal den Nutzernamen und das Passwort raus, sonst kommt noch wer auf die Idee und verschickt in Deinem Namen über Deine Firmenemail irgendwelchen Spam. Würd' mich als Chef dann eher nicht erfreuen
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Versand per SMTP

  Alt 18. Jan 2023, 11:35
iAttachment wird viermal was per TIdAttachmentFile.Create zugewiesen [...]
Ja, da hast Du natürlich recht - leider weiss ich nicht wie ich das ganze komplett aufräume und alle Anhänge wieder lösche. Ich versuch jetzt mal rauszubekommen was der TiDMessageBuilder macht (Beitrag von@mytbo) - evtl. vereinfacht der das ganze

Zitat:
Und:

Nimm doch bitte im Eingangspost mal den Nutzernamen und das Passwort raus ...
Danke - das war einfach schon zu spät und ich hing zu lange daran.!

Gruss
Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Versand per SMTP

  Alt 18. Jan 2023, 11:52
Einfacher lässt es sich mit dem TIdMessageBuilder zusammenstellen:
Delphi-Quellcode:
var
  idMessageBuilder: TIdMessageBuilder;
begin
  idMessageBuilder := TIdMessageBuilder.Create;
Und nach dem Senden deine Message "clearen".
Hallo Thomas,

bei mir scheitert das schon an dem   idMessageBuilder: TIdMessageBuilder; :

Ich binde in den Uses u.a. IdMessageBuilder ein: uses ... IdMessageBuilder ... bekomme dann aber in der Zeile

Delphi-Quellcode:
procedure MailVersenden(Runde: integer);
var
  iAttachment : TIdAttachment;
  idMessageBuilder: TIdMessageBuilder;
den TIdMessageBuilder als "E2003 undeklarierter Bezeichner TidMessageBuilder" markiert.

Weisst Du warum ?

Gruss
Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Versand per SMTP

  Alt 18. Jan 2023, 14:31
Die Klasse heißt IMO TIdMessageBuilderHtml oder TIdMessageBuilderPlain.

Frank
Frank Reim

Geändert von dataspider (18. Jan 2023 um 14:44 Uhr)
  Mit Zitat antworten Zitat
H.Bothur

Registriert seit: 25. Jun 2012
Ort: Seevetal & Lagos
257 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Versand per SMTP

  Alt 18. Jan 2023, 16:02
Die Klasse heißt IMO TIdMessageBuilderHtml oder TIdMessageBuilderPlain.

Frank
Stimmt - Danke !

Hans
Hans-Georg Bothur
www.hermann-juergensen.de
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:46 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