Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi EMail über Outlook 2003 versenden (https://www.delphipraxis.net/176174-email-ueber-outlook-2003-versenden.html)

HolgerCW 16. Aug 2013 14:23

Delphi-Version: 2006

EMail über Outlook 2003 versenden
 
Hallo zusammen,

es wurde bestimmt schon 100mal gepostet, aber ich konnte leider das ganze nicht so ganz verstehen.

Wie kann ich schnell und einfach mit Delphi 2006 eine EMail inkl. Anhang versenden ?

Ich habe mit auch mal die TOutookApplication auf meine Form gezogen aber komme da nicht so wirklich weiter.

Ich denke ich brauche hier nur mal so die ersten Schritte, damit ich los legen kann ...

Über Hilfe wäre ich sehr dankbar ...

Gruss

Holger

hstreicher 16. Aug 2013 14:34

AW: EMail über Outlook 2003 versenden
 
such mal nach MAPI

Bernhard Geyer 16. Aug 2013 15:25

AW: EMail über Outlook 2003 versenden
 
In der Jedi (Jcl) gibts 'ne Unit (JclMapi) mit der man einfach über die Simple-MAPI-Schnittelle Mails (u.a. über outlook) verschicken kann.

madtom 16. Aug 2013 17:51

AW: EMail über Outlook 2003 versenden
 
Gerade getestet:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  aMailItem: _MailItem;
  aNameSpace: NameSpace;
  aFolder: MAPIFolder;
  Recipient: string;
begin
  aMailItem := OutlookApplication1.CreateItem(olMailItem) as _MailItem;
  aNameSpace := OutlookApplication1.GetNamespace('MAPI');
  aNameSpace.Logon(EmptyParam, EmptyParam, False, True);
  aFolder := aNameSpace.GetDefaultFolder(olFolderOutbox);
  Recipient := 'email@address.de';
  aMailItem.Importance := olImportanceHigh;
  aMailItem.Recipients.Add(Recipient);
  aMailItem.Attachments.Add('C:\XXX\Bild.bmp', EmptyParam, EmptyParam, EmptyParam);
  aMailItem.Subject := 'Attachment Test';
  aMailItem.Body := 'This is an Email with an Attachment';
  aMailItem.Send;
end;

mjustin 17. Aug 2013 08:26

AW: EMail über Outlook 2003 versenden
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1225148)
In der Jedi (Jcl) gibts 'ne Unit (JclMapi) mit der man einfach über die Simple-MAPI-Schnittelle Mails (u.a. über outlook) verschicken kann.

Ja, darin gibt so schöne Methoden wie:

Delphi-Quellcode:
function JclSimpleSendMail(const Recipient, Name, Subject, Body: AnsiString;
  const Attachment: TFileName = ''; ShowDialog: Boolean = True; ParentWND: THandle = 0;
  const ProfileName: AnsiString = ''; const Password: AnsiString = ''): Boolean;
und

Delphi-Quellcode:
function JclSimpleBringUpSendMailDialog(const Subject, Body: AnsiString;
  const Attachment: TFileName = ''; ParentWND: THandle = 0;
  const ProfileName: AnsiString = ''; const Password: AnsiString = ''): Boolean;
Einfacher geht es nicht, und wenn man mehr Features (zum Beispiel mehrere Attachments) benötigt kann man direkt mit der Klasse TJclEmail arbeiten.

HolgerCW 19. Aug 2013 11:05

AW: EMail über Outlook 2003 versenden
 
Danke für die Hilfen. Meine Funktion sieht nun so aus:

Delphi-Quellcode:
function EMail_versenden_Outlook(An, Cc, Text: String; Subject:String; Anhang:String; Mit_Abfrage: Boolean):Boolean;
var
 TOA:TOutlookApplication;
 MI: MailItem;
begin

 Result := FALSE;

 TOA:= TOutlookApplication.Create(Form_Email.Outlook);

 TOA.ConnectKind := ckRunningOrNew;
 try

  TOA.Connect;

 except

  TOA.Free;
  MessageDlg('Outlook kann nicht geöffnet werden!',mtError,[mbok],0);
  exit;

 end;

 MI:= TOA.CreateItem(olMailItem) as MailItem;
 MI.Attachments.Add(Anhang,emptyParam,EmptyParam,EmptyParam);
 MI.Body:= Text;
 MI.Subject:= Subject;
 MI.Companies:= 'Your Company';
 MI.Categories:='HelpDesk';
 MI.Recipients.Add(An);
 MI.CC := Cc;
 MI.Display(1);
 TOA.Disconnect;
 TOA.Free;

 Result := TRUE;

end;
Wie kann ich nun abchecken ob die E-Mail wirklich versendet wurde, oder noch besser wie kann ich die E-Mail direkt versenden, ohne das der Anwender noch eingreifen kann ?

MfG

Holger

Bernhard Geyer 19. Aug 2013 13:01

AW: EMail über Outlook 2003 versenden
 
Zitat:

Zitat von HolgerCW (Beitrag 1225292)
..., oder noch besser wie kann ich die E-Mail direkt versenden, ohne das der Anwender noch eingreifen kann ?

Gar nicht (jedenfalls nicht über diese Schnittstelle). Den diesen Wunsch/Realisierung hatten zuvor schon zig-Tausend Scrippt-Kiddies mit VBA-Würmern auch. Und irgendwann hat MS hie dicht gemacht.

Perlsau 19. Aug 2013 13:46

AW: EMail über Outlook 2003 versenden
 
Zitat:

Zitat von HolgerCW (Beitrag 1225292)
Wie kann ich nun abchecken ob die E-Mail wirklich versendet wurde, oder noch besser wie kann ich die E-Mail direkt versenden, ohne das der Anwender noch eingreifen kann ?

Bei meinen Email-Provider gibt es einen SENT-Ordner, worin Duplikate aller gesendeten Emails aufbewahrt werden. Meiner Erfahrung nach ist das Standard. Du könntest daher versuchen, mit einer entsprechenden Indy-Komponente auf diesen SENT-Ordner zuzugreifen, um nachzuschauen, ob sich die gesendete Email darin befindet. Natürlich mußt du zuvor auch dein Postfach so einstellen, daß Kopien gesendeter Mails angelegt werden.

Und du kannst natürlich auch noch in Outlook einstellen, daß du eine Rückmeldung wünschst, sobald der Empfänger die Mail geöffent hat. Letztgenannte Methode garantiert jedoch nicht mit 100%iger Sicherheit, daß die Mail tatsächlich versandt wurde, denn der Empfänger kann die Bestätigung verweigern.

HolgerCW 20. Aug 2013 10:55

AW: EMail über Outlook 2003 versenden
 
Könntest Du mir mal ein Beispiel für das Abfragen des SENT-Ordners posten ?

Gruss

Holger

mjustin 20. Aug 2013 11:19

AW: EMail über Outlook 2003 versenden
 
Zitat:

Zitat von HolgerCW (Beitrag 1225292)
Wie kann ich nun abchecken ob die E-Mail wirklich versendet wurde, oder noch besser wie kann ich die E-Mail direkt versenden, ohne das der Anwender noch eingreifen kann ?

Für direkten Versand ohne Benutzereingriff kann man SMTP verwenden, das auch von Microsoft Exchange unterstützt wird - falls nicht vorhanden, dann einfach direkt über den Mailprovider.

HolgerCW 20. Aug 2013 11:25

AW: EMail über Outlook 2003 versenden
 
SMTP funktioniert da nicht bei den Rechnern. Wäre also weiterhin an einer Abfrage des SENT-Ordners interressiert ?

Perlsau 20. Aug 2013 12:26

AW: EMail über Outlook 2003 versenden
 
Zitat:

Zitat von HolgerCW (Beitrag 1225485)
SMTP funktioniert da nicht bei den Rechnern. Wäre also weiterhin an einer Abfrage des SENT-Ordners interressiert ?

Dazu findest du haufenweise Material, wenn du nur einmal selber googlen möchtest. Tutorials für die Handhabung eines Mailproviders findest du ebenfalls, wenn du willst. Schau doch mal beim Delphi-Treff in die entsprechenden Tutorials hinein, erarbeite dir das Wissen, wie diese Technik funktioniert und entwickle dann selbst eine Abfrage. Da hast du mehr davon, als wenn ich dir hier meinen Code reinkopiere, auf daß du ihn nur noch in dein Programm kopieren mußt.

Puke 20. Aug 2013 19:13

AW: EMail über Outlook 2003 versenden
 
Moinse,
da ich von PHP so gar keine Ahnung habe :oops:, stelle ich meine Frage dazu einfach in den Raum:
Kann man dass nicht auch über PHP lösen?:lol:

Hier hab ich nen bisschen Code dazu gefunden und dass man Delphi mit PHP koppeln kann weiß ich, da ich meine IP-Adresse gerne darüber herausfinde. Vielleicht geht dieser Weg auch mit ner EMail?

Mit diesem neuen Gedanken
Puke:stupid: ( Hoffe es war nicht völlig OT )

berens 20. Aug 2013 19:27

AW: EMail über Outlook 2003 versenden
 
Beispiel für SENT / Gesendete Objekte mit den OfficePartner Komponenten für Outlook:

Delphi-Quellcode:
       
var
  InBox: TInbox;
  MailItem: TMapiMailItem;
  FOpOutlook: TOpOutlook;

  oMAPIFolder: MAPIFolder;
  oItems: Items;

  oMail: _MailItem;
  oMailItem: TOpMailItem;
  sfilter: string;

begin
  if not FopOutlook.Connected then FopOutlook.Connected := True;

        // Post-Eingang
        oMAPIFolder := FopOutlook.MapiNamespace.GetDefaultFolder(olFolderInbox);
        if assigned(oMAPIFolder) then begin
          // Nur die letzten 14 Tage anbieten
          oItems := oMAPIFolder.Items;
          sFilter := '[SentOn] >'''+ DateToStr(floor(now-14)) + '''';
          oItems := oItems.Restrict(sfilter);

          if oItems.Count > 0 then begin
            for i := 1 to oItems.Count do begin // Items uses a 1 based index

              if oItems.Item(i).QueryInterface( _MailItem, oMail ) = s_OK then begin
                oMailItem := TOpMailItem.Create( oMail );

                tmpMail := TMail.Create(NIL); // <-- Mail ist eine Klasse von mir
                tmpMail.EntryID := oMailItem.MailItem.EntryID;
                tmpMail.slContacts.Add(GetSenderEMailByEntryID(tmpMail.EntryID));
                tmpMail.Subject := oMailItem.Subject;
                tmpMail.Body := oMailItem.Body;
                tmpMail.SentOn := oMailItem.MailItem.SentOn;
                tmpMail.Richtung := riEingehend;
                FclMail.Add(tmpMail);

                FreeAndNil(oMailItem);
              end;
            end;
          end;
        end;
      end;


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