Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi EMail aus einem Dienst erzeugen (https://www.delphipraxis.net/126628-email-aus-einem-dienst-erzeugen.html)

xweghau 29. Dez 2008 21:01


EMail aus einem Dienst erzeugen
 
Hallo!
Mein erster Beitrag :angel2: , mal sehen ...
Ich möchte aus einem Windows 2003 Server Dienst (mit D7 Prof erzeugt) eine EMail generieren, wenn ein bestimmtes Programm nicht mehr läuft und auch nicht vom Dienst wieder gestartet werden kann. Bis auf das Versenden der Mail klappt auch alles. Diese Mail versuche ich mit den Indy Komponenten TIdSMTP und TIdMessage zu senden. Wenn ich dies aus einer "normalen" EXE heraus mache, habe ich kein Problem. Aber eine durch den Dienst erzeugt Mail wird nicht versendet. Es wird eine SMTP Connection aufgebaut, doch der Send Befehl wird nicht (korrekt) ausgeführt.
Hier ein Auszug aus meinem Code:
********************************************
try
SMTP.Send(IdMsgSend);
DebugDatei('Mail versendet');
finally
if SMTP.Connected then
SMTP.Disconnect;
DebugDatei('Mail wurde nicht versendet');
end;
********************************************
Hinweis: Die Prozedur DebugDatei schreibt schreibt die durchlaufenen Schritte in eine Datei. Der Eintrag "Mail versendet" wird nicht ausgeführt.
Hat jemand von Euch einen Tipp? Danke schon mal für die Mühe (zumindest für das Lesen).
Gruß
Franz

Sir Rufo 29. Dez 2008 23:49

Re: EMail aus einem Dienst erzeugen
 
Hallo und willkommen in der DP.

Bitte benutze die Delphi-Tags, dann sieht der gepostete Code auch so aus:
(ich habe mir erlaubt, den Code auch noch entsprechend einzurücken)
Delphi-Quellcode:
try
  SMTP.Send(IdMsgSend);
  DebugDatei('Mail versendet');
finally
  if SMTP.Connected then
    SMTP.Disconnect;
  DebugDatei('Mail wurde nicht versendet');
end;
1. Im Fall der Fälle wird keine Debug-Meldung abgesetzt!
Nämlich, wenn SMTP.Send einen Fehler bringt und SMTP.Disconnect einen Fehler bringt.

2. Wird die Mail korrekt versendet, steht in deinem Debug:
Code:
Mail versendet
Mail wurde nicht versendet
3. Da du nicht verrätst, wie die Properties der Komponenten eingestellt sind (SMTP, IdMsgSend), ich aber mal unterstelle, dass es sich hier um TIdSMTP und TIdMessage handelt, kann dir hier auch niemand bei deinem Problem helfen.

cu

Oliver

Bernhard Geyer 30. Dez 2008 08:02

Re: EMail aus einem Dienst erzeugen
 
Wird das Versenden evtl. von einer Firewall geblockt?

xweghau 30. Dez 2008 09:29

Re: EMail aus einem Dienst erzeugen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo Oliver!

Danke schon mal für Deine Mühe. Wie Du vermutest (und ich im ersten Absatz meines Beitrages schrieb :) ) verwende ich die Komponenten TIdSMTP und TIdMessage.

Nachfolgend der Quellcode. Der SMTP Server den ich verwende existiert und ist erreichbar. Auch die Empfängeradresse ist gültig. Die Eigenschaften der Komponenten habe ich als JPGs beigefügt.

Delphi-Quellcode:
procedure TsvcArchivprgUeberwachung.MailToAdmin;
begin
  with IdMsgSend do begin
    From.Text := 'Archiv_Mailsender@test.de' //Absender
    ReplyTo.EMailAddresses := ''; //Antwort an
    Recipients.EMailAddresses := 'weghaus@test.de'; //Empfänger der Mail
    //Mailtext
    Body.Clear;
    try
      IdMsgSend.MessageParts.Clear;
    except
    end;
    Subject := 'Archivüberwachung'; //Mailbetreff
    Body.Add('Nachricht vom Archivsytem:');
    Body.Add('');
    Body.Add('Das Archivüberwachungsprogramm läuft derzeit nicht.');
    Body.Add('Es konnte auch nicht automatisch gestartet werden.');
    Body.Add('Bitte überprüfen Sie dies und starten Sie das Programm.');
    Body.Add('');
    //Ende Mailtext
    Priority := mpNormal; //Priorität
    CCList.EMailAddresses := ''; //Kopie an
    BccList.EMailAddresses := ''; //Blindkopie an
    ReceiptRecipient.Text := ''; //Antwortnachricht
  end;
  DebugDatei('Mail zum Versand erzeugt, die Verbindung wird jetzt hergestellt.');
//Authentifikation am Mailserver
  SMTP.AuthenticationType := atNone;
//Servername und -port vorgeben
  SMTP.Host := SmtpServerName;
  SMTP.Port := SmtpServerPort;
//Nachricht senden
  SMTP.Connect;
  if SMTP.Connected then
    DebugDatei('Connection wurde hergestellt')
  else
    DebugDatei('Connection konnte nicht aufgebaut werden');
  try
    SMTP.Send(IdMsgSend);
    DebugDatei('Mail erfolgreich gesendet');
  finally
    SMTP.Disconnect;
    DebugDatei('Disconnect ist erfolgt.');
  end;
end;
Ich hoffe, die Informationen sind jetzt soweit vollständig, dass mir jemand weiterhelfen kann!?

Gruß
Franz

xweghau 30. Dez 2008 09:36

Re: EMail aus einem Dienst erzeugen
 
Hallo Bernhard,

die Firewall dürfte die Mail eigentlich nicht blocken. Wenn ich eine "normale" EXE mit diesem Code (sh. Antwort an Oliver) nutze, kommt eine Mail an. Was allerdings sein könnte: Der Dienst läuft ja nicht in meinem Benutzerkontext, sondern unter "lokales System". Evtl. liegt hier der Grund? Danke für den Tipp.

Gruß
Franz

xweghau 5. Jan 2009 08:45

Re: EMail aus einem Dienst erzeugen
 
Hallo Leute,

ich habe die Erzeugung der EMail in eine normal EXE verlagert, die ich aus dem Dienst heraus mit ShellExecute aufrufe. Das funktioniert einwandfrei. Danke aber für Euere Mühe.

Gruß
Franz :-D

nahpets 5. Jan 2009 09:15

Re: EMail aus einem Dienst erzeugen
 
Hallo,

auch wenn Du schon eine Lösung hast, mein Dienst macht das so:

Delphi-Quellcode:
IdMessage.Clear;
IdMessage.MessageParts.Clear;
IdMessage.Date     := Now;
idMessage.Subject  := 'Fehlerprotokoll: Dienstestatus';
IdMessage.Body.Text := slMail.Text;
IdMessage.From.Text := GetEnvironmentVariable('COMPUTERNAME') + '@meinedomaene.de';
IdMessage.Recipients.EMailAddresses := iniMail.ReadString('MAILSERVER','EMailAddresses','mein.name@meinedomaene.de');
idSMTP.Host        := iniMail.ReadString('MAILSERVER','HOST','ip.des.mail.servers');
idSMTP.HeloName    := iniMail.ReadString('MAILSERVER','HELONAME','mein.name');
idSMTP.Password    := iniMail.ReadString('MAILSERVER','PASSWORD','');
idSMTP.Username    := idSMTP.HeloName;
Try
  idSMTP.Connect(10000);
  idSMTP.QuickSend(iniMail.ReadString('MAILSERVER','HOST','ip.des.mail.servers'),
                   IdMessage.Subject,
                   IdMessage.Recipients.EMailAddresses,
                   IdMessage.From.Text,
                   IdMessage.Body.Text);
  ErrorLog('Protokoll per Mail versandt.',0);
Except
  on e : Exception Do Begin
    ErrorLog(tmDienste.Name + ' Exception beim Mailversand: ' + e.Message,0);
  end;
end;
try
  idSMTP.Disconnect;
except
end;
Stephan


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr.

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