Einzelnen Beitrag anzeigen

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