![]() |
eMail per Mapi mit mehreren cc, bcc und Anhängen
Hallo zusammen,
ich habe die altbekannte Funktion hier aus dem Forum zum versenden von eMail über MAPI etwas erweitert um mehrere Anhänge und mehrere Empfänger (sowohl Mail_to, Mail_cc und Mail_bcc)nutzen zu können. Bei meinem System Win7 Premium 64 Bit und Outlock 2010 funktioniert das ganz gut. Könnte jemand der geneigten Leserschaft (...schleim :wink:) evtl. mal schauen ob diese Methode auch mit anderen Konfigurationen funktioniert und dann hier Rückmeldung geben? Korrekte Funktion heißt in meinem Fall, dass sich der Default-Mail_Client öffnet und die entsprechenden Daten richtig eingetragen sind. Wäre nett wenn das mal jemand checken würde. Vielen Dank für Eure Mühe. entwickelt mit D2010.....
Delphi-Quellcode:
unit MultiSendMail;
interface uses Windows, Classes, Forms, SysUtils, Mapi ; type TStrArray = array of String; function SendEMail(Handle:THandle; Mail:TStrings):Cardinal; implementation { **** Verwendung *** procedure TTestForm.Mail1Click(Sender: TObject); var mail: TStringList; begin mail:= TStringList.Create; try mail.values['to0']:= 'fifi@abc.de'; mail.values['to1']:= 'otto@abc.de'; mail.values['to2']:= 'Maria@abc.de'; mail.values['to3']:= 'Joseph@abc.de'; mail.values['cc0']:= 'detlef@abc.de'; mail.values['cc1']:= 'Mordo@abc.de'; mail.values['bcc0']:= 'Klaus@abc.de'; mail.values['subject']:= 'subject'; mail.values['body']:= 'text text text'; mail.values['attachment0']:= 'C:\Anhang1.txt'; mail.values['attachment1']:= 'C:\Anhang2.txt'; mail.values['attachment2']:= 'C:\Anhang3.txt'; SendEMail(Self.Handle, mail); finally mail.Free; end; end; } function SendEMail(Handle:THandle; Mail:TStrings):Cardinal; var MapiMessage: TMapiMessage; Receip: array of TMapiRecipDesc; Attachments: array of TMapiFileDesc; i, j, ReceipCount, toCount, ccCount, bccCount, AttachCount: Integer; FileName: string; MAPI_Session: Cardinal; WndList: Pointer; begin Result:= MAPI_E_FAILURE; if (MapiLogon(Handle, PAnsiChar(''), PAnsiChar(''), MAPI_LOGON_UI or MAPI_NEW_SESSION, 0, @MAPI_Session) <> SUCCESS_SUCCESS) then MessageBox(Handle, PChar('Fehler beim Versuch eMails zu versenden'), PChar('Error'), MB_ICONERROR or MB_OK) else begin toCount:=0; // Anzahl der Empfänger ccCount:=0; // Anzahl der Empfänger in cc bccCount:=0; // Anzahl der Empfänger in bcc for i:= 0 to MaxInt do // Empfänger zählen begin if Mail.Values['to' + IntToStr(i)] = '' then break; Inc(toCount); end; for i:= 0 to MaxInt do // Empfänger in cc zählen begin if Mail.Values['cc' + IntToStr(i)] = '' then break; Inc(ccCount); end; for i:= 0 to MaxInt do // Empfänger in bcc zählen begin if Mail.Values['bcc' + IntToStr(i)] = '' then break; Inc(bccCount); end; ReceipCount:=toCount+ccCount+bccCount; // Gesamtempfängerzahl errechnen SetLength(Receip,ReceipCount); // Empfängerarray dimensionieren i:=0; if ReceipCount>0 then begin if toCount>0 then // Empfängereinträge erzeugen for j:=0 to toCount-1 do begin Receip[i].ulReserved:= 0; Receip[i].ulRecipClass:= MAPI_TO; Receip[i].lpszName:= StrNew(PAnsiChar(AnsiString(Mail.Values['to'+IntToStr(j)]))); Receip[i].lpszAddress:= StrNew(PAnsiChar(AnsiString('SMTP:' + Mail.Values['to'+IntToStr(j)]))); Receip[i].lpEntryID:=nil; Receip[i].ulEIDSize:= 0; inc(i); end; if ccCount>0 then // Empfängereinträge für cc erzeugen for j:=0 to ccCount-1 do begin Receip[i].ulReserved:= 0; Receip[i].ulRecipClass:= MAPI_CC; Receip[i].lpszName:= StrNew(PAnsiChar(AnsiString(Mail.Values['cc'+IntToStr(j)]))); Receip[i].lpszAddress:= StrNew(PAnsiChar(AnsiString('SMTP:' + Mail.Values['cc'+IntToStr(j)]))); Receip[i].lpEntryID:=nil; Receip[i].ulEIDSize:= 0; inc(i); end; if bccCount>0 then // Empfängereinträge für bcc erzeugen for j:=0 to bccCount-1 do begin Receip[i].ulReserved:= 0; Receip[i].ulRecipClass:= MAPI_BCC; Receip[i].lpszName:= StrNew(PAnsiChar(AnsiString(Mail.Values['bcc'+IntToStr(j)]))); Receip[i].lpszAddress:= StrNew(PAnsiChar(AnsiString('SMTP:' + Mail.Values['bcc'+IntToStr(j)]))); Receip[i].lpEntryID:=nil; Receip[i].ulEIDSize:= 0; inc(i); end; end; MapiMessage.nRecipCount:= ReceipCount; // Empfängeranzahl in Message setzen MapiMessage.lpRecips:= Pointer(Receip); // Pointer auf Empfängerarray übergeben if Mail.Values['subject']<>'' then MapiMessage.lpszSubject:= PAnsiChar(AnsiString(Mail.Values['subject'])); if Mail.Values['body']<>'' then MapiMessage.lpszNoteText:= PAnsiChar(AnsiString(Mail.Values['body'])); AttachCount:= 0; // Anhänge verarbeiten for i:= 0 to MaxInt do // zählen begin if Mail.Values['attachment' + IntToStr(i)] = '' then break; Inc(AttachCount); end; SetLength(Attachments, AttachCount); // array dimensinieren if AttachCount>0 then begin for i:=0 to AttachCount-1 do begin FileName:= Mail.Values['attachment' + IntToStr(i)]; // Einträge erzeugen Attachments[i].ulReserved:= 0; Attachments[i].flFlags:= 0; Attachments[i].nPosition:= ULONG($FFFFFFFF); Attachments[i].lpszPathName:= StrNew(PAnsiChar(AnsiString(FileName))); Attachments[i].lpszFileName:= StrNew(PAnsiChar(AnsiString(ExtractFileName(FileName)))); Attachments[i].lpFileType:= nil; end; MapiMessage.nFileCount := AttachCount; // Anzahl der Anhänge in der Message setzen MapiMessage.lpFiles := Pointer(Attachments); // Pointer auf AnhangsArray übergeben end; WndList:= DisableTaskWindows(0); // "semimodal" machen try Result:= MapiSendMail(MAPI_Session, Handle, MapiMessage, MAPI_DIALOG, 0);// senden der Mail finally EnableTaskWindows(WndList); for i:=0 to ReceipCount-1 do // aufräumen begin StrDispose(Receip[i].lpszName); StrDispose(Receip[i].lpszAddress); end; for i:=0 to AttachCount-1 do begin StrDispose(Attachments[i].lpszPathName); StrDispose(Attachments[i].lpszFileName); end; Finalize(Attachments); // richtig aufräumen Finalize(Receip); end; MapiLogOff(MAPI_Session, Handle, 0, 0); end; end; end. |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Hallo,
funktioniert mit Delphi 6 / Thunderbird 3 / Vista. Jedoch würde ich das ganze in eine Klasse verpacken, etwa so:
Delphi-Quellcode:
var
SendMail: TSendMail; with SendMail.Create(nil) do begin SendTo.Add('fifi@abc.de'); SendTo.Add('otto@abc.de'); SendCC.Add('otto@abc.de'); SendBCC.Add('Klaus@abc.de'); Attachments.Add('C:\Anhang1.txt'); Attachments.Add('C:\Anhang2.txt'); Attachments.Add('C:\Anhang3.txt'); Subject := 'Subject'; Body := 'text text text'; Show; // oder Execute oder... Free; end; |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Hallo Thomas,
danke für den Test. Ja war auch erstmal ein Versuch mit MAPI. Ich war mir nicht sicher ob das mit mehreren cc und bcc so klappt da ich bisher nichts in der Richtung gefunden habe. Na ich schau mal ob ich das noch in ne Klasse gieße. Zwischenzeitlich habe ich den Code etwas aufgehübscht.
Delphi-Quellcode:
unit MultiSendMail;
interface uses Windows, Classes, Forms, SysUtils, Mapi ; type TStrArray = array of String; const MapiRecipClassStrings : array[1..3] of String =('to','cc','bcc'); function SendEMail(Handle:THandle; Mail:TStrings):Cardinal; implementation { **** Verwendung *** procedure TTestForm.Mail1Click(Sender: TObject); var mail: TStringList; begin mail:= TStringList.Create; try mail.values['to0']:= 'fifi@abc.de'; mail.values['to1']:= 'otto@abc.de'; mail.values['to2']:= 'Maria@abc.de'; mail.values['to3']:= 'Joseph@abc.de'; mail.values['cc0']:= 'detlef@abc.de'; mail.values['cc1']:= 'Mordo@abc.de'; mail.values['bcc0']:= 'Klaus@abc.de'; mail.values['subject']:= 'subject'; mail.values['body']:= 'text text text'; mail.values['attachment0']:= 'C:\Anhang1.txt'; mail.values['attachment1']:= 'C:\Anhang2.txt'; mail.values['attachment2']:= 'C:\Anhang3.txt'; SendEMail(Self.Handle, mail); finally mail.Free; end; end; } function SendEMail(Handle:THandle; Mail:TStrings):Cardinal; var MapiMessage: TMapiMessage; Receip: array of TMapiRecipDesc; Attachments: array of TMapiFileDesc; i, j, mc, ReceipCount, AttachCount: Integer; FileName: string; MAPI_Session: Cardinal; WndList: Pointer; MapiRecipClassCounter : array[1..3] of Integer; function GetMailValue (AMapiRecipClass, Index : Integer) : string; begin result:=Mail.Values[MapiRecipClassStrings[AMapiRecipClass]+IntToStr(index)]; end; begin Result:= MAPI_E_FAILURE; if (MapiLogon(Handle, PAnsiChar(''), PAnsiChar(''), MAPI_LOGON_UI or MAPI_NEW_SESSION, 0, @MAPI_Session) <> SUCCESS_SUCCESS) then MessageBox(Handle, PChar('Fehler beim Versuch eMails zu versenden'), PChar('Error'), MB_ICONERROR or MB_OK) else begin for MC:=MAPI_TO to MAPI_BCC do begin MapiRecipClassCounter[MC]:=0; for j:= 0 to MaxInt do // Empfänger zählen begin if GetMailValue(MC,j) = '' then break; Inc(MapiRecipClassCounter[MC]); end; end; ReceipCount:=MapiRecipClassCounter[MAPI_TO]+ MapiRecipClassCounter[MAPI_CC]+ MapiRecipClassCounter[MAPI_BCC]; // Gesamtempfängerzahl errechnen SetLength(Receip,ReceipCount); // Empfängerarray dimensionieren i:=0; if ReceipCount>0 then begin for MC:=MAPI_TO to MAPI_BCC do if MapiRecipClassCounter[MC]>0 then for j:=0 to MapiRecipClassCounter[MC]-1 do begin Receip[i].ulReserved:= 0; Receip[i].ulRecipClass:= MC; Receip[i].lpszName:= StrNew(PAnsiChar(AnsiString(GetMailValue(MC,j)))); Receip[i].lpszAddress:= StrNew(PAnsiChar(AnsiString('SMTP:' + GetMailValue(MC,j)))); Receip[i].lpEntryID:=nil; Receip[i].ulEIDSize:= 0; inc(i); end; end; MapiMessage.nRecipCount:= ReceipCount; // Empfängeranzahl in Message setzen MapiMessage.lpRecips:= Pointer(Receip); // Pointer auf Empfängerarray übergeben if Mail.Values['subject']<>'' then MapiMessage.lpszSubject:= PAnsiChar(AnsiString(Mail.Values['subject'])); if Mail.Values['body']<>'' then MapiMessage.lpszNoteText:= PAnsiChar(AnsiString(Mail.Values['body'])); AttachCount:= 0; // Anhänge verarbeiten for i:= 0 to MaxInt do // zählen begin if Mail.Values['attachment' + IntToStr(i)] = '' then break; Inc(AttachCount); end; SetLength(Attachments, AttachCount); // array dimensinieren if AttachCount>0 then begin for i:=0 to AttachCount-1 do begin FileName:= Mail.Values['attachment' + IntToStr(i)]; // Einträge erzeugen Attachments[i].ulReserved:= 0; Attachments[i].flFlags:= 0; Attachments[i].nPosition:= ULONG($FFFFFFFF); Attachments[i].lpszPathName:= StrNew(PAnsiChar(AnsiString(FileName))); Attachments[i].lpszFileName:= StrNew(PAnsiChar(AnsiString(ExtractFileName(FileName)))); Attachments[i].lpFileType:= nil; end; MapiMessage.nFileCount := AttachCount; // Anzahl der Anhänge in der Message setzen MapiMessage.lpFiles := Pointer(Attachments); // Pointer auf AnhangsArray übergeben end; WndList:= DisableTaskWindows(0); // "semimodal" machen try Result:= MapiSendMail(MAPI_Session, Handle, MapiMessage, MAPI_DIALOG, 0);// senden der Mail finally EnableTaskWindows(WndList); for i:=0 to ReceipCount-1 do // aufräumen begin StrDispose(Receip[i].lpszName); StrDispose(Receip[i].lpszAddress); end; for i:=0 to AttachCount-1 do begin StrDispose(Attachments[i].lpszPathName); StrDispose(Attachments[i].lpszFileName); end; Finalize(Attachments); // richtig aufräumen Finalize(Receip); end; MapiLogOff(MAPI_Session, Handle, 0, 0); end; end; end. |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Funktioniert leider nicht mit Windows 7 und Office 2010.
Der Aufruf von SendEMail lässt den Bildschirm kurz flackern, danach scheint die Applikation für ca. 15 Sekunden einzufrieren. Danach wird die Steuerung an die Applikation zurück übertragen, Outlook hat aber keine neu erstellte Email im Postausgang. |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Hi und danke für diese praktische Funktion, hat mir grad den Nachmittag gerettet ^^
Funktioniert (in der aufgefrischten Version) mit Windows XP Prof. und Outlook 2003 :) |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Danke für die Rückmeldung. Funktioniert bei Mir auch unter win7 und office 2010.
|
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
MapiSendMail funktioniert auch, wenn ein 32 Bit Client auf die 64 Bit Version von Office / Outlook zugreift (
![]() |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Ja wie schon oben geschrieben win7 64Bit mit Office 2010 (32 Bit ?).
|
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Zitat:
|
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Hallo MJustin,
ja ich habe nochmal gegengecheckt. Ich habe hier Win 7 64 Bit und ein Outlook 2010 32 Bit. In dieser Konstellation funktioniert der Code ohne Probleme. Ist aber wie immer mit solchen nicht voll implementierten "Standard"-Schnittstellen, nicht wirklich schön. Wenn man den Standard-Mail-Client mit Anhängen usw. nutzen will hat man aber sonst keine allgemein gültige Alternative. Oder habe ich etwas übersehen? SMTP finde ich zwar ok aber meinen Kunden traue ich die Einstellungen nicht wirklich zu. cu cg |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Hallo,
hab' gerade dieses "Tool" entdeckt und ausprobiert (Delphi XE mit allen Updates): mit Win7 (x86 und x64) und Thunderbird (9.x und 11.x) kein Problem, Thunderbird geht wie gewünscht auf (mit allen Einträgen und Anhängen) - mit XP will das gleiche Programm, trotz Thunderbird als Standard-EmailClient, immer Outlook-Express öffnen ("grosses" Outlook ist auf dem PC nicht installiert). Hat da jemand eine Idee, woran das liegen kann und/oder wie ich das mit Thunderbird unter XP zum Laufen bringe? Hartmut |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Outllok express scheint als als Standard-Mapi-Emailclient konfiguriert zu sein
|
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Nein, definitiv nicht! Wenn ich auf einer beliebigen Internetseite (egal, ob mit IE oder Firefox) auf einen Mail-Link klicke (mailto: ...), dann geht ja auch Thunderbird auf und nicht OE. Das sieht nach was anderem aus...
Hartmut |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Programme können sich nicht nur für einwas als Standardprogramm anmelden.
Für das mailto-Protokoll ist es also registriert, aber anscheinend nicht für die MAPI-Schnittstelle. |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Hmmm, wenn das so ist, dann habe ich im Moment keine Idee, wie kann ich das ändern kann...irgendeine Idee dazu?
Hartmut |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Ok, jetzt hab' ich's dank Onkel Google gefunden:
Hier zunächst zwei Links zu dem Thema: ![]() ![]() Im unteren Link ist beschrieben, das über Software/Standardprogramme das Email Programm eindeutig zugewiesen werden kann. Dort habe ich den Thunderbird expliziert ausgewählt und insbesondere den Haken "Zugriff auf dieses Programm aktivieren" gesetzt - dieser war ebenfalls bei Outlook Express gesetzt. Solange dieser Haken bei OE gesetzt ist, wird nur OE beim MAPI-Aufruf angesprochen, egal was ich sonst mache... Also: Haken bei OE 'raus und alles ist gut. Hartmut |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Dein Sourcecode funktioniert bei uns hervorragend:
Delphi XE2 Windows 7 64 BIT MAPIClient : David (Tobitsoftware) |
AW: eMail per Mapi mit mehreren cc, bcc und Anhängen
Hmm, ich habe den Sourcecode unter Windows 7 x64 mit Office 2013 getestet, auch mit nur einem Empfänger und ohne Anhang, und MapiSendMail liefert leider eine 2 (MAPI_E_FAILURE) zurück.
Kann das jemand nachvollziehen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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