AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi eMail per Mapi mit mehreren cc, bcc und Anhängen
Thema durchsuchen
Ansicht
Themen-Optionen

eMail per Mapi mit mehreren cc, bcc und Anhängen

Ein Thema von ConstantGardener · begonnen am 8. Jan 2011 · letzter Beitrag vom 17. Sep 2015
Antwort Antwort
Seite 1 von 2  1 2      
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#1

eMail per Mapi mit mehreren cc, bcc und Anhängen

  Alt 8. Jan 2011, 14:09
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 ) 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.
Andreas Schachtner
  Mit Zitat antworten Zitat
Benutzerbild von toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#2

AW: eMail per Mapi mit mehreren cc, bcc und Anhängen

  Alt 8. Jan 2011, 15:08
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;
Thomas
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: eMail per Mapi mit mehreren cc, bcc und Anhängen

  Alt 8. Jan 2011, 15:32
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.
Andreas Schachtner
  Mit Zitat antworten Zitat
devidespe

Registriert seit: 7. Sep 2006
Ort: Berlin
434 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: eMail per Mapi mit mehreren cc, bcc und Anhängen

  Alt 15. Feb 2011, 10:16
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.
Devid
57 65 72 20 6C 65 73 65 6E 20 6B 61 6E 6E 2C 20 69 73 74 20 6B 6C 61 72 20 69 6D 20 56 6F 72 74 65 69 6C 21
  Mit Zitat antworten Zitat
ensaron

Registriert seit: 29. Aug 2008
Ort: 10369 Berlin
63 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: eMail per Mapi mit mehreren cc, bcc und Anhängen

  Alt 4. Mär 2011, 12:19
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
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: eMail per Mapi mit mehreren cc, bcc und Anhängen

  Alt 4. Mär 2011, 12:55
Danke für die Rückmeldung. Funktioniert bei Mir auch unter win7 und office 2010.
Andreas Schachtner
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#7

AW: eMail per Mapi mit mehreren cc, bcc und Anhängen

  Alt 4. Mär 2011, 17:21
MapiSendMail funktioniert auch, wenn ein 32 Bit Client auf die 64 Bit Version von Office / Outlook zugreift (http://msdn.microsoft.com/en-us/library/dd941355.aspx) - daher ist hilfreich zu wissen, welche Bittigkeit getestet wurde ...
Michael Justin
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: eMail per Mapi mit mehreren cc, bcc und Anhängen

  Alt 4. Mär 2011, 20:08
Ja wie schon oben geschrieben win7 64Bit mit Office 2010 (32 Bit ?).
Andreas Schachtner
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
3.004 Beiträge
 
Delphi 2009 Professional
 
#9

AW: eMail per Mapi mit mehreren cc, bcc und Anhängen

  Alt 5. Mär 2011, 12:51
Ja wie schon oben geschrieben win7 64Bit mit Office 2010 (32 Bit ?).
Auf 64 Bit Windows kann ein 32 oder ein 64 Bit Outlook/Office installiert sein. Wie gesagt, klappt MAPI bei 64 Bit Outlook nur eingeschränkt auf die MaipSendMail Funktion. Unterschiedliche Testresultate einer Delphi-Anwendungen können daher von der Outlook/Office Version abhängen, wenn darüber hinaus andere MAPI Funktionen verwendet werden...
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
ConstantGardener

Registriert seit: 24. Jan 2006
Ort: Halberstadt
375 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: eMail per Mapi mit mehreren cc, bcc und Anhängen

  Alt 5. Mär 2011, 21:56
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
Andreas Schachtner
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:35 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